blob: 982a9761263813b3487c1d849bce887c36dfdde4 [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
Martin Panter50ab1a32016-04-11 00:38:12 +00001164 def testCloseException(self):
1165 sock = socket.socket()
1166 socket.socket(fileno=sock.fileno()).close()
1167 try:
1168 sock.close()
1169 except OSError as err:
1170 # Winsock apparently raises ENOTSOCK
1171 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1172 else:
1173 self.fail("close() should raise EBADF/ENOTSOCK")
1174
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001175 def testNewAttributes(self):
1176 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001177
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001178 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1179 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001180 if hasattr(socket, 'SOCK_CLOEXEC'):
1181 self.assertIn(sock.type,
1182 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1183 socket.SOCK_STREAM))
1184 else:
1185 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001186 self.assertEqual(sock.proto, 0)
1187 sock.close()
1188
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001189 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001190 sock = socket.socket()
1191 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001192 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001193 big_port = port + 65536
1194 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001195 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1196 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1197 # Since find_unused_port() is inherently subject to race conditions, we
1198 # call it a couple times if necessary.
1199 for i in itertools.count():
1200 port = support.find_unused_port()
1201 try:
1202 sock.bind((HOST, port))
1203 except OSError as e:
1204 if e.errno != errno.EADDRINUSE or i == 5:
1205 raise
1206 else:
1207 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001208
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001209 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001210 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001211 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1212 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1213 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1214 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001215 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1216 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001217 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001218 self.assertRaises(ValueError, s.ioctl, -1, None)
1219 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001220
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001221 def testGetaddrinfo(self):
1222 try:
1223 socket.getaddrinfo('localhost', 80)
1224 except socket.gaierror as err:
1225 if err.errno == socket.EAI_SERVICE:
1226 # see http://bugs.python.org/issue1282647
1227 self.skipTest("buggy libc version")
1228 raise
1229 # len of every sequence is supposed to be == 5
1230 for info in socket.getaddrinfo(HOST, None):
1231 self.assertEqual(len(info), 5)
1232 # host can be a domain name, a string representation of an
1233 # IPv4/v6 address or None
1234 socket.getaddrinfo('localhost', 80)
1235 socket.getaddrinfo('127.0.0.1', 80)
1236 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001237 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001238 socket.getaddrinfo('::1', 80)
1239 # port can be a string service name such as "http", a numeric
1240 # port number or None
1241 socket.getaddrinfo(HOST, "http")
1242 socket.getaddrinfo(HOST, 80)
1243 socket.getaddrinfo(HOST, None)
1244 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001245 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1246 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001247 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001248 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1249 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001250 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001251 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1252 for _, socktype, _, _, _ in infos:
1253 self.assertEqual(socktype, socket.SOCK_STREAM)
1254 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001255 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001256 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1257 # a server willing to support both IPv4 and IPv6 will
1258 # usually do this
1259 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1260 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001261 # test keyword arguments
1262 a = socket.getaddrinfo(HOST, None)
1263 b = socket.getaddrinfo(host=HOST, port=None)
1264 self.assertEqual(a, b)
1265 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1266 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1267 self.assertEqual(a, b)
1268 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1269 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1270 self.assertEqual(a, b)
1271 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1272 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1273 self.assertEqual(a, b)
1274 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1275 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1276 self.assertEqual(a, b)
1277 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1278 socket.AI_PASSIVE)
1279 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1280 type=socket.SOCK_STREAM, proto=0,
1281 flags=socket.AI_PASSIVE)
1282 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001283 # Issue #6697.
1284 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001285
Ned Deilyb24f4812014-02-13 22:50:42 -08001286 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001287 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001288 try:
1289 # The arguments here are undefined and the call may succeed
1290 # or fail. All we care here is that it doesn't segfault.
1291 socket.getaddrinfo("localhost", None, 0, 0, 0,
1292 socket.AI_NUMERICSERV)
1293 except socket.gaierror:
1294 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001295
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001296 def test_getnameinfo(self):
1297 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001298 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001299
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001300 @unittest.skipUnless(support.is_resource_enabled('network'),
1301 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001302 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001303 # Check for internet access before running test
1304 # (issue #12804, issue #25138).
1305 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001306 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001307
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001308 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001309 domain = 'испытание.pythontest.net'
1310 socket.gethostbyname(domain)
1311 socket.gethostbyname_ex(domain)
1312 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001313 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1314 # have a reverse entry yet
1315 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001316
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001317 def check_sendall_interrupted(self, with_timeout):
1318 # socketpair() is not stricly required, but it makes things easier.
1319 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1320 self.skipTest("signal.alarm and socket.socketpair required for this test")
1321 # Our signal handlers clobber the C errno by calling a math function
1322 # with an invalid domain value.
1323 def ok_handler(*args):
1324 self.assertRaises(ValueError, math.acosh, 0)
1325 def raising_handler(*args):
1326 self.assertRaises(ValueError, math.acosh, 0)
1327 1 // 0
1328 c, s = socket.socketpair()
1329 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1330 try:
1331 if with_timeout:
1332 # Just above the one second minimum for signal.alarm
1333 c.settimeout(1.5)
1334 with self.assertRaises(ZeroDivisionError):
1335 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001336 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001337 if with_timeout:
1338 signal.signal(signal.SIGALRM, ok_handler)
1339 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001340 self.assertRaises(socket.timeout, c.sendall,
1341 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001342 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001343 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001344 signal.signal(signal.SIGALRM, old_alarm)
1345 c.close()
1346 s.close()
1347
1348 def test_sendall_interrupted(self):
1349 self.check_sendall_interrupted(False)
1350
1351 def test_sendall_interrupted_with_timeout(self):
1352 self.check_sendall_interrupted(True)
1353
Antoine Pitroue033e062010-10-29 10:38:18 +00001354 def test_dealloc_warn(self):
1355 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1356 r = repr(sock)
1357 with self.assertWarns(ResourceWarning) as cm:
1358 sock = None
1359 support.gc_collect()
1360 self.assertIn(r, str(cm.warning.args[0]))
1361 # An open socket file object gets dereferenced after the socket
1362 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1363 f = sock.makefile('rb')
1364 r = repr(sock)
1365 sock = None
1366 support.gc_collect()
1367 with self.assertWarns(ResourceWarning):
1368 f = None
1369 support.gc_collect()
1370
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001371 def test_name_closed_socketio(self):
1372 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1373 fp = sock.makefile("rb")
1374 fp.close()
1375 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1376
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001377 def test_unusable_closed_socketio(self):
1378 with socket.socket() as sock:
1379 fp = sock.makefile("rb", buffering=0)
1380 self.assertTrue(fp.readable())
1381 self.assertFalse(fp.writable())
1382 self.assertFalse(fp.seekable())
1383 fp.close()
1384 self.assertRaises(ValueError, fp.readable)
1385 self.assertRaises(ValueError, fp.writable)
1386 self.assertRaises(ValueError, fp.seekable)
1387
Berker Peksag3fe64d02016-02-18 17:34:00 +02001388 def test_makefile_mode(self):
1389 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1390 with self.subTest(mode=mode):
1391 with socket.socket() as sock:
1392 with sock.makefile(mode) as fp:
1393 self.assertEqual(fp.mode, mode)
1394
1395 def test_makefile_invalid_mode(self):
1396 for mode in 'rt', 'x', '+', 'a':
1397 with self.subTest(mode=mode):
1398 with socket.socket() as sock:
1399 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1400 sock.makefile(mode)
1401
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001402 def test_pickle(self):
1403 sock = socket.socket()
1404 with sock:
1405 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1406 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001407 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1408 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1409 self.assertEqual(family, socket.AF_INET)
1410 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1411 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001412
Serhiy Storchaka78980432013-01-15 01:12:17 +02001413 def test_listen_backlog(self):
1414 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001415 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1416 srv.bind((HOST, 0))
1417 srv.listen(backlog)
1418
1419 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001420 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001421 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001422
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001423 @support.cpython_only
1424 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001425 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001426 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001427 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1428 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001429 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001430 srv.close()
1431
Charles-François Natali42663332012-01-02 15:57:30 +01001432 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001433 def test_flowinfo(self):
1434 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001435 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001436 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001437 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001438
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001439 def test_str_for_enums(self):
1440 # Make sure that the AF_* and SOCK_* constants have enum-like string
1441 # reprs.
1442 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1443 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001444 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001445
1446 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1447 def test_uknown_socket_family_repr(self):
1448 # Test that when created with a family that's not one of the known
1449 # AF_*/SOCK_* constants, socket.family just returns the number.
1450 #
1451 # To do this we fool socket.socket into believing it already has an
1452 # open fd because on this path it doesn't actually verify the family and
1453 # type and populates the socket object.
1454 #
1455 # On Windows this trick won't work, so the test is skipped.
1456 fd, _ = tempfile.mkstemp()
1457 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1458 self.assertEqual(s.family, 42424)
1459 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001460
Charles-François Natali47413c12011-10-06 19:47:44 +02001461@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1462class BasicCANTest(unittest.TestCase):
1463
1464 def testCrucialConstants(self):
1465 socket.AF_CAN
1466 socket.PF_CAN
1467 socket.CAN_RAW
1468
Charles-François Natali773e42d2013-02-05 19:42:01 +01001469 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1470 'socket.CAN_BCM required for this test.')
1471 def testBCMConstants(self):
1472 socket.CAN_BCM
1473
1474 # opcodes
1475 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1476 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1477 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1478 socket.CAN_BCM_TX_SEND # send one CAN frame
1479 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1480 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1481 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1482 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1483 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1484 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1485 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1486 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1487
Charles-François Natali47413c12011-10-06 19:47:44 +02001488 def testCreateSocket(self):
1489 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1490 pass
1491
Charles-François Natali773e42d2013-02-05 19:42:01 +01001492 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1493 'socket.CAN_BCM required for this test.')
1494 def testCreateBCMSocket(self):
1495 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1496 pass
1497
Charles-François Natali47413c12011-10-06 19:47:44 +02001498 def testBindAny(self):
1499 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1500 s.bind(('', ))
1501
1502 def testTooLongInterfaceName(self):
1503 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1504 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001505 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001506 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001507
1508 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1509 'socket.CAN_RAW_LOOPBACK required for this test.')
1510 def testLoopback(self):
1511 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1512 for loopback in (0, 1):
1513 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1514 loopback)
1515 self.assertEqual(loopback,
1516 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1517
1518 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1519 'socket.CAN_RAW_FILTER required for this test.')
1520 def testFilter(self):
1521 can_id, can_mask = 0x200, 0x700
1522 can_filter = struct.pack("=II", can_id, can_mask)
1523 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1524 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1525 self.assertEqual(can_filter,
1526 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001527 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001528
1529
1530@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001531@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001532class CANTest(ThreadedCANSocketTest):
1533
Charles-François Natali47413c12011-10-06 19:47:44 +02001534 def __init__(self, methodName='runTest'):
1535 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1536
1537 @classmethod
1538 def build_can_frame(cls, can_id, data):
1539 """Build a CAN frame."""
1540 can_dlc = len(data)
1541 data = data.ljust(8, b'\x00')
1542 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1543
1544 @classmethod
1545 def dissect_can_frame(cls, frame):
1546 """Dissect a CAN frame."""
1547 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1548 return (can_id, can_dlc, data[:can_dlc])
1549
1550 def testSendFrame(self):
1551 cf, addr = self.s.recvfrom(self.bufsize)
1552 self.assertEqual(self.cf, cf)
1553 self.assertEqual(addr[0], self.interface)
1554 self.assertEqual(addr[1], socket.AF_CAN)
1555
1556 def _testSendFrame(self):
1557 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1558 self.cli.send(self.cf)
1559
1560 def testSendMaxFrame(self):
1561 cf, addr = self.s.recvfrom(self.bufsize)
1562 self.assertEqual(self.cf, cf)
1563
1564 def _testSendMaxFrame(self):
1565 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1566 self.cli.send(self.cf)
1567
1568 def testSendMultiFrames(self):
1569 cf, addr = self.s.recvfrom(self.bufsize)
1570 self.assertEqual(self.cf1, cf)
1571
1572 cf, addr = self.s.recvfrom(self.bufsize)
1573 self.assertEqual(self.cf2, cf)
1574
1575 def _testSendMultiFrames(self):
1576 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1577 self.cli.send(self.cf1)
1578
1579 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1580 self.cli.send(self.cf2)
1581
Charles-François Natali773e42d2013-02-05 19:42:01 +01001582 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1583 'socket.CAN_BCM required for this test.')
1584 def _testBCM(self):
1585 cf, addr = self.cli.recvfrom(self.bufsize)
1586 self.assertEqual(self.cf, cf)
1587 can_id, can_dlc, data = self.dissect_can_frame(cf)
1588 self.assertEqual(self.can_id, can_id)
1589 self.assertEqual(self.data, data)
1590
1591 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1592 'socket.CAN_BCM required for this test.')
1593 def testBCM(self):
1594 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1595 self.addCleanup(bcm.close)
1596 bcm.connect((self.interface,))
1597 self.can_id = 0x123
1598 self.data = bytes([0xc0, 0xff, 0xee])
1599 self.cf = self.build_can_frame(self.can_id, self.data)
1600 opcode = socket.CAN_BCM_TX_SEND
1601 flags = 0
1602 count = 0
1603 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1604 bcm_can_id = 0x0222
1605 nframes = 1
1606 assert len(self.cf) == 16
1607 header = struct.pack(self.bcm_cmd_msg_fmt,
1608 opcode,
1609 flags,
1610 count,
1611 ival1_seconds,
1612 ival1_usec,
1613 ival2_seconds,
1614 ival2_usec,
1615 bcm_can_id,
1616 nframes,
1617 )
1618 header_plus_frame = header + self.cf
1619 bytes_sent = bcm.send(header_plus_frame)
1620 self.assertEqual(bytes_sent, len(header_plus_frame))
1621
Charles-François Natali47413c12011-10-06 19:47:44 +02001622
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001623@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1624class BasicRDSTest(unittest.TestCase):
1625
1626 def testCrucialConstants(self):
1627 socket.AF_RDS
1628 socket.PF_RDS
1629
1630 def testCreateSocket(self):
1631 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1632 pass
1633
1634 def testSocketBufferSize(self):
1635 bufsize = 16384
1636 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1637 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1638 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1639
1640
1641@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1642@unittest.skipUnless(thread, 'Threading required for this test.')
1643class RDSTest(ThreadedRDSSocketTest):
1644
1645 def __init__(self, methodName='runTest'):
1646 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1647
Charles-François Natali240c55f2011-11-10 20:33:36 +01001648 def setUp(self):
1649 super().setUp()
1650 self.evt = threading.Event()
1651
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001652 def testSendAndRecv(self):
1653 data, addr = self.serv.recvfrom(self.bufsize)
1654 self.assertEqual(self.data, data)
1655 self.assertEqual(self.cli_addr, addr)
1656
1657 def _testSendAndRecv(self):
1658 self.data = b'spam'
1659 self.cli.sendto(self.data, 0, (HOST, self.port))
1660
1661 def testPeek(self):
1662 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1663 self.assertEqual(self.data, data)
1664 data, addr = self.serv.recvfrom(self.bufsize)
1665 self.assertEqual(self.data, data)
1666
1667 def _testPeek(self):
1668 self.data = b'spam'
1669 self.cli.sendto(self.data, 0, (HOST, self.port))
1670
1671 @requireAttrs(socket.socket, 'recvmsg')
1672 def testSendAndRecvMsg(self):
1673 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1674 self.assertEqual(self.data, data)
1675
1676 @requireAttrs(socket.socket, 'sendmsg')
1677 def _testSendAndRecvMsg(self):
1678 self.data = b'hello ' * 10
1679 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1680
1681 def testSendAndRecvMulti(self):
1682 data, addr = self.serv.recvfrom(self.bufsize)
1683 self.assertEqual(self.data1, data)
1684
1685 data, addr = self.serv.recvfrom(self.bufsize)
1686 self.assertEqual(self.data2, data)
1687
1688 def _testSendAndRecvMulti(self):
1689 self.data1 = b'bacon'
1690 self.cli.sendto(self.data1, 0, (HOST, self.port))
1691
1692 self.data2 = b'egg'
1693 self.cli.sendto(self.data2, 0, (HOST, self.port))
1694
1695 def testSelect(self):
1696 r, w, x = select.select([self.serv], [], [], 3.0)
1697 self.assertIn(self.serv, r)
1698 data, addr = self.serv.recvfrom(self.bufsize)
1699 self.assertEqual(self.data, data)
1700
1701 def _testSelect(self):
1702 self.data = b'select'
1703 self.cli.sendto(self.data, 0, (HOST, self.port))
1704
1705 def testCongestion(self):
1706 # wait until the sender is done
1707 self.evt.wait()
1708
1709 def _testCongestion(self):
1710 # test the behavior in case of congestion
1711 self.data = b'fill'
1712 self.cli.setblocking(False)
1713 try:
1714 # try to lower the receiver's socket buffer size
1715 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1716 except OSError:
1717 pass
1718 with self.assertRaises(OSError) as cm:
1719 try:
1720 # fill the receiver's socket buffer
1721 while True:
1722 self.cli.sendto(self.data, 0, (HOST, self.port))
1723 finally:
1724 # signal the receiver we're done
1725 self.evt.set()
1726 # sendto() should have failed with ENOBUFS
1727 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1728 # and we should have received a congestion notification through poll
1729 r, w, x = select.select([self.serv], [], [], 3.0)
1730 self.assertIn(self.serv, r)
1731
1732
Victor Stinner45df8202010-04-28 22:31:17 +00001733@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001734class BasicTCPTest(SocketConnectedTest):
1735
1736 def __init__(self, methodName='runTest'):
1737 SocketConnectedTest.__init__(self, methodName=methodName)
1738
1739 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001740 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001741 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001742 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001743
1744 def _testRecv(self):
1745 self.serv_conn.send(MSG)
1746
1747 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001748 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001749 seg1 = self.cli_conn.recv(len(MSG) - 3)
1750 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001751 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001752 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001753
1754 def _testOverFlowRecv(self):
1755 self.serv_conn.send(MSG)
1756
1757 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001758 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001759 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001760 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001761
1762 def _testRecvFrom(self):
1763 self.serv_conn.send(MSG)
1764
1765 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001766 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001767 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1768 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001769 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001770 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001771
1772 def _testOverFlowRecvFrom(self):
1773 self.serv_conn.send(MSG)
1774
1775 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001776 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001777 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001778 while 1:
1779 read = self.cli_conn.recv(1024)
1780 if not read:
1781 break
Guido van Rossume531e292002-08-08 20:28:34 +00001782 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001783 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001784
1785 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001786 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001787 self.serv_conn.sendall(big_chunk)
1788
1789 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001790 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001791 fd = self.cli_conn.fileno()
1792 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001793 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001794 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001795 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001796 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001797
1798 def _testFromFd(self):
1799 self.serv_conn.send(MSG)
1800
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001801 def testDup(self):
1802 # Testing dup()
1803 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001804 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001805 msg = sock.recv(1024)
1806 self.assertEqual(msg, MSG)
1807
1808 def _testDup(self):
1809 self.serv_conn.send(MSG)
1810
Guido van Rossum24e4af82002-06-12 19:18:08 +00001811 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001812 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001813 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001814 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001815 # wait for _testShutdown to finish: on OS X, when the server
1816 # closes the connection the client also becomes disconnected,
1817 # and the client's shutdown call will fail. (Issue #4397.)
1818 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001819
1820 def _testShutdown(self):
1821 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001822 self.serv_conn.shutdown(2)
1823
1824 testShutdown_overflow = support.cpython_only(testShutdown)
1825
1826 @support.cpython_only
1827 def _testShutdown_overflow(self):
1828 import _testcapi
1829 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001830 # Issue 15989
1831 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1832 _testcapi.INT_MAX + 1)
1833 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1834 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001835 self.serv_conn.shutdown(2)
1836
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001837 def testDetach(self):
1838 # Testing detach()
1839 fileno = self.cli_conn.fileno()
1840 f = self.cli_conn.detach()
1841 self.assertEqual(f, fileno)
1842 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001843 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001844 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001845 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001846 # ...but we can create another socket using the (still open)
1847 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001848 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001849 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001850 msg = sock.recv(1024)
1851 self.assertEqual(msg, MSG)
1852
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001853 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001854 self.serv_conn.send(MSG)
1855
Victor Stinner45df8202010-04-28 22:31:17 +00001856@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001857class BasicUDPTest(ThreadedUDPSocketTest):
1858
1859 def __init__(self, methodName='runTest'):
1860 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1861
1862 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001863 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001864 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001865 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001866
1867 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001868 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001869
Guido van Rossum1c938012002-06-12 21:17:20 +00001870 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001871 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001872 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001873 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001874
Guido van Rossum1c938012002-06-12 21:17:20 +00001875 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001876 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001877
Guido van Rossumd8faa362007-04-27 19:54:29 +00001878 def testRecvFromNegative(self):
1879 # Negative lengths passed to recvfrom should give ValueError.
1880 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1881
1882 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001883 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001884
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001885# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1886# same test code is used with different families and types of socket
1887# (e.g. stream, datagram), and tests using recvmsg() are repeated
1888# using recvmsg_into().
1889#
1890# The generic test classes such as SendmsgTests and
1891# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1892# supplied with sockets cli_sock and serv_sock representing the
1893# client's and the server's end of the connection respectively, and
1894# attributes cli_addr and serv_addr holding their (numeric where
1895# appropriate) addresses.
1896#
1897# The final concrete test classes combine these with subclasses of
1898# SocketTestBase which set up client and server sockets of a specific
1899# type, and with subclasses of SendrecvmsgBase such as
1900# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1901# sockets to cli_sock and serv_sock and override the methods and
1902# attributes of SendrecvmsgBase to fill in destination addresses if
1903# needed when sending, check for specific flags in msg_flags, etc.
1904#
1905# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1906# recvmsg_into().
1907
1908# XXX: like the other datagram (UDP) tests in this module, the code
1909# here assumes that datagram delivery on the local machine will be
1910# reliable.
1911
1912class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1913 # Base class for sendmsg()/recvmsg() tests.
1914
1915 # Time in seconds to wait before considering a test failed, or
1916 # None for no timeout. Not all tests actually set a timeout.
1917 fail_timeout = 3.0
1918
1919 def setUp(self):
1920 self.misc_event = threading.Event()
1921 super().setUp()
1922
1923 def sendToServer(self, msg):
1924 # Send msg to the server.
1925 return self.cli_sock.send(msg)
1926
1927 # Tuple of alternative default arguments for sendmsg() when called
1928 # via sendmsgToServer() (e.g. to include a destination address).
1929 sendmsg_to_server_defaults = ()
1930
1931 def sendmsgToServer(self, *args):
1932 # Call sendmsg() on self.cli_sock with the given arguments,
1933 # filling in any arguments which are not supplied with the
1934 # corresponding items of self.sendmsg_to_server_defaults, if
1935 # any.
1936 return self.cli_sock.sendmsg(
1937 *(args + self.sendmsg_to_server_defaults[len(args):]))
1938
1939 def doRecvmsg(self, sock, bufsize, *args):
1940 # Call recvmsg() on sock with given arguments and return its
1941 # result. Should be used for tests which can use either
1942 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1943 # this method with one which emulates it using recvmsg_into(),
1944 # thus allowing the same test to be used for both methods.
1945 result = sock.recvmsg(bufsize, *args)
1946 self.registerRecvmsgResult(result)
1947 return result
1948
1949 def registerRecvmsgResult(self, result):
1950 # Called by doRecvmsg() with the return value of recvmsg() or
1951 # recvmsg_into(). Can be overridden to arrange cleanup based
1952 # on the returned ancillary data, for instance.
1953 pass
1954
1955 def checkRecvmsgAddress(self, addr1, addr2):
1956 # Called to compare the received address with the address of
1957 # the peer.
1958 self.assertEqual(addr1, addr2)
1959
1960 # Flags that are normally unset in msg_flags
1961 msg_flags_common_unset = 0
1962 for name in ("MSG_CTRUNC", "MSG_OOB"):
1963 msg_flags_common_unset |= getattr(socket, name, 0)
1964
1965 # Flags that are normally set
1966 msg_flags_common_set = 0
1967
1968 # Flags set when a complete record has been received (e.g. MSG_EOR
1969 # for SCTP)
1970 msg_flags_eor_indicator = 0
1971
1972 # Flags set when a complete record has not been received
1973 # (e.g. MSG_TRUNC for datagram sockets)
1974 msg_flags_non_eor_indicator = 0
1975
1976 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1977 # Method to check the value of msg_flags returned by recvmsg[_into]().
1978 #
1979 # Checks that all bits in msg_flags_common_set attribute are
1980 # set in "flags" and all bits in msg_flags_common_unset are
1981 # unset.
1982 #
1983 # The "eor" argument specifies whether the flags should
1984 # indicate that a full record (or datagram) has been received.
1985 # If "eor" is None, no checks are done; otherwise, checks
1986 # that:
1987 #
1988 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1989 # set and all bits in msg_flags_non_eor_indicator are unset
1990 #
1991 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1992 # are set and all bits in msg_flags_eor_indicator are unset
1993 #
1994 # If "checkset" and/or "checkunset" are supplied, they require
1995 # the given bits to be set or unset respectively, overriding
1996 # what the attributes require for those bits.
1997 #
1998 # If any bits are set in "ignore", they will not be checked,
1999 # regardless of the other inputs.
2000 #
2001 # Will raise Exception if the inputs require a bit to be both
2002 # set and unset, and it is not ignored.
2003
2004 defaultset = self.msg_flags_common_set
2005 defaultunset = self.msg_flags_common_unset
2006
2007 if eor:
2008 defaultset |= self.msg_flags_eor_indicator
2009 defaultunset |= self.msg_flags_non_eor_indicator
2010 elif eor is not None:
2011 defaultset |= self.msg_flags_non_eor_indicator
2012 defaultunset |= self.msg_flags_eor_indicator
2013
2014 # Function arguments override defaults
2015 defaultset &= ~checkunset
2016 defaultunset &= ~checkset
2017
2018 # Merge arguments with remaining defaults, and check for conflicts
2019 checkset |= defaultset
2020 checkunset |= defaultunset
2021 inboth = checkset & checkunset & ~ignore
2022 if inboth:
2023 raise Exception("contradictory set, unset requirements for flags "
2024 "{0:#x}".format(inboth))
2025
2026 # Compare with given msg_flags value
2027 mask = (checkset | checkunset) & ~ignore
2028 self.assertEqual(flags & mask, checkset & mask)
2029
2030
2031class RecvmsgIntoMixin(SendrecvmsgBase):
2032 # Mixin to implement doRecvmsg() using recvmsg_into().
2033
2034 def doRecvmsg(self, sock, bufsize, *args):
2035 buf = bytearray(bufsize)
2036 result = sock.recvmsg_into([buf], *args)
2037 self.registerRecvmsgResult(result)
2038 self.assertGreaterEqual(result[0], 0)
2039 self.assertLessEqual(result[0], bufsize)
2040 return (bytes(buf[:result[0]]),) + result[1:]
2041
2042
2043class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2044 # Defines flags to be checked in msg_flags for datagram sockets.
2045
2046 @property
2047 def msg_flags_non_eor_indicator(self):
2048 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2049
2050
2051class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2052 # Defines flags to be checked in msg_flags for SCTP sockets.
2053
2054 @property
2055 def msg_flags_eor_indicator(self):
2056 return super().msg_flags_eor_indicator | socket.MSG_EOR
2057
2058
2059class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2060 # Base class for tests on connectionless-mode sockets. Users must
2061 # supply sockets on attributes cli and serv to be mapped to
2062 # cli_sock and serv_sock respectively.
2063
2064 @property
2065 def serv_sock(self):
2066 return self.serv
2067
2068 @property
2069 def cli_sock(self):
2070 return self.cli
2071
2072 @property
2073 def sendmsg_to_server_defaults(self):
2074 return ([], [], 0, self.serv_addr)
2075
2076 def sendToServer(self, msg):
2077 return self.cli_sock.sendto(msg, self.serv_addr)
2078
2079
2080class SendrecvmsgConnectedBase(SendrecvmsgBase):
2081 # Base class for tests on connected sockets. Users must supply
2082 # sockets on attributes serv_conn and cli_conn (representing the
2083 # connections *to* the server and the client), to be mapped to
2084 # cli_sock and serv_sock respectively.
2085
2086 @property
2087 def serv_sock(self):
2088 return self.cli_conn
2089
2090 @property
2091 def cli_sock(self):
2092 return self.serv_conn
2093
2094 def checkRecvmsgAddress(self, addr1, addr2):
2095 # Address is currently "unspecified" for a connected socket,
2096 # so we don't examine it
2097 pass
2098
2099
2100class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2101 # Base class to set a timeout on server's socket.
2102
2103 def setUp(self):
2104 super().setUp()
2105 self.serv_sock.settimeout(self.fail_timeout)
2106
2107
2108class SendmsgTests(SendrecvmsgServerTimeoutBase):
2109 # Tests for sendmsg() which can use any socket type and do not
2110 # involve recvmsg() or recvmsg_into().
2111
2112 def testSendmsg(self):
2113 # Send a simple message with sendmsg().
2114 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2115
2116 def _testSendmsg(self):
2117 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2118
2119 def testSendmsgDataGenerator(self):
2120 # Send from buffer obtained from a generator (not a sequence).
2121 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2122
2123 def _testSendmsgDataGenerator(self):
2124 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2125 len(MSG))
2126
2127 def testSendmsgAncillaryGenerator(self):
2128 # Gather (empty) ancillary data from a generator.
2129 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2130
2131 def _testSendmsgAncillaryGenerator(self):
2132 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2133 len(MSG))
2134
2135 def testSendmsgArray(self):
2136 # Send data from an array instead of the usual bytes object.
2137 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2138
2139 def _testSendmsgArray(self):
2140 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2141 len(MSG))
2142
2143 def testSendmsgGather(self):
2144 # Send message data from more than one buffer (gather write).
2145 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2146
2147 def _testSendmsgGather(self):
2148 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2149
2150 def testSendmsgBadArgs(self):
2151 # Check that sendmsg() rejects invalid arguments.
2152 self.assertEqual(self.serv_sock.recv(1000), b"done")
2153
2154 def _testSendmsgBadArgs(self):
2155 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2156 self.assertRaises(TypeError, self.sendmsgToServer,
2157 b"not in an iterable")
2158 self.assertRaises(TypeError, self.sendmsgToServer,
2159 object())
2160 self.assertRaises(TypeError, self.sendmsgToServer,
2161 [object()])
2162 self.assertRaises(TypeError, self.sendmsgToServer,
2163 [MSG, object()])
2164 self.assertRaises(TypeError, self.sendmsgToServer,
2165 [MSG], object())
2166 self.assertRaises(TypeError, self.sendmsgToServer,
2167 [MSG], [], object())
2168 self.assertRaises(TypeError, self.sendmsgToServer,
2169 [MSG], [], 0, object())
2170 self.sendToServer(b"done")
2171
2172 def testSendmsgBadCmsg(self):
2173 # Check that invalid ancillary data items are rejected.
2174 self.assertEqual(self.serv_sock.recv(1000), b"done")
2175
2176 def _testSendmsgBadCmsg(self):
2177 self.assertRaises(TypeError, self.sendmsgToServer,
2178 [MSG], [object()])
2179 self.assertRaises(TypeError, self.sendmsgToServer,
2180 [MSG], [(object(), 0, b"data")])
2181 self.assertRaises(TypeError, self.sendmsgToServer,
2182 [MSG], [(0, object(), b"data")])
2183 self.assertRaises(TypeError, self.sendmsgToServer,
2184 [MSG], [(0, 0, object())])
2185 self.assertRaises(TypeError, self.sendmsgToServer,
2186 [MSG], [(0, 0)])
2187 self.assertRaises(TypeError, self.sendmsgToServer,
2188 [MSG], [(0, 0, b"data", 42)])
2189 self.sendToServer(b"done")
2190
2191 @requireAttrs(socket, "CMSG_SPACE")
2192 def testSendmsgBadMultiCmsg(self):
2193 # Check that invalid ancillary data items are rejected when
2194 # more than one item is present.
2195 self.assertEqual(self.serv_sock.recv(1000), b"done")
2196
2197 @testSendmsgBadMultiCmsg.client_skip
2198 def _testSendmsgBadMultiCmsg(self):
2199 self.assertRaises(TypeError, self.sendmsgToServer,
2200 [MSG], [0, 0, b""])
2201 self.assertRaises(TypeError, self.sendmsgToServer,
2202 [MSG], [(0, 0, b""), object()])
2203 self.sendToServer(b"done")
2204
2205 def testSendmsgExcessCmsgReject(self):
2206 # Check that sendmsg() rejects excess ancillary data items
2207 # when the number that can be sent is limited.
2208 self.assertEqual(self.serv_sock.recv(1000), b"done")
2209
2210 def _testSendmsgExcessCmsgReject(self):
2211 if not hasattr(socket, "CMSG_SPACE"):
2212 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002213 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002214 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2215 self.assertIsNone(cm.exception.errno)
2216 self.sendToServer(b"done")
2217
2218 def testSendmsgAfterClose(self):
2219 # Check that sendmsg() fails on a closed socket.
2220 pass
2221
2222 def _testSendmsgAfterClose(self):
2223 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002224 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002225
2226
2227class SendmsgStreamTests(SendmsgTests):
2228 # Tests for sendmsg() which require a stream socket and do not
2229 # involve recvmsg() or recvmsg_into().
2230
2231 def testSendmsgExplicitNoneAddr(self):
2232 # Check that peer address can be specified as None.
2233 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2234
2235 def _testSendmsgExplicitNoneAddr(self):
2236 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2237
2238 def testSendmsgTimeout(self):
2239 # Check that timeout works with sendmsg().
2240 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2241 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2242
2243 def _testSendmsgTimeout(self):
2244 try:
2245 self.cli_sock.settimeout(0.03)
2246 with self.assertRaises(socket.timeout):
2247 while True:
2248 self.sendmsgToServer([b"a"*512])
2249 finally:
2250 self.misc_event.set()
2251
2252 # XXX: would be nice to have more tests for sendmsg flags argument.
2253
2254 # Linux supports MSG_DONTWAIT when sending, but in general, it
2255 # only works when receiving. Could add other platforms if they
2256 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002257 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002258 "MSG_DONTWAIT not known to work on this platform when "
2259 "sending")
2260 def testSendmsgDontWait(self):
2261 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2262 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2263 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2264
2265 @testSendmsgDontWait.client_skip
2266 def _testSendmsgDontWait(self):
2267 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002268 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002269 while True:
2270 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2271 self.assertIn(cm.exception.errno,
2272 (errno.EAGAIN, errno.EWOULDBLOCK))
2273 finally:
2274 self.misc_event.set()
2275
2276
2277class SendmsgConnectionlessTests(SendmsgTests):
2278 # Tests for sendmsg() which require a connectionless-mode
2279 # (e.g. datagram) socket, and do not involve recvmsg() or
2280 # recvmsg_into().
2281
2282 def testSendmsgNoDestAddr(self):
2283 # Check that sendmsg() fails when no destination address is
2284 # given for unconnected socket.
2285 pass
2286
2287 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002288 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002289 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002290 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002291 [MSG], [], 0, None)
2292
2293
2294class RecvmsgGenericTests(SendrecvmsgBase):
2295 # Tests for recvmsg() which can also be emulated using
2296 # recvmsg_into(), and can use any socket type.
2297
2298 def testRecvmsg(self):
2299 # Receive a simple message with recvmsg[_into]().
2300 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2301 self.assertEqual(msg, MSG)
2302 self.checkRecvmsgAddress(addr, self.cli_addr)
2303 self.assertEqual(ancdata, [])
2304 self.checkFlags(flags, eor=True)
2305
2306 def _testRecvmsg(self):
2307 self.sendToServer(MSG)
2308
2309 def testRecvmsgExplicitDefaults(self):
2310 # Test recvmsg[_into]() with default arguments provided explicitly.
2311 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2312 len(MSG), 0, 0)
2313 self.assertEqual(msg, MSG)
2314 self.checkRecvmsgAddress(addr, self.cli_addr)
2315 self.assertEqual(ancdata, [])
2316 self.checkFlags(flags, eor=True)
2317
2318 def _testRecvmsgExplicitDefaults(self):
2319 self.sendToServer(MSG)
2320
2321 def testRecvmsgShorter(self):
2322 # Receive a message smaller than buffer.
2323 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2324 len(MSG) + 42)
2325 self.assertEqual(msg, MSG)
2326 self.checkRecvmsgAddress(addr, self.cli_addr)
2327 self.assertEqual(ancdata, [])
2328 self.checkFlags(flags, eor=True)
2329
2330 def _testRecvmsgShorter(self):
2331 self.sendToServer(MSG)
2332
Charles-François Natali8619cd72011-10-03 19:43:15 +02002333 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2334 # datagram is received (issue #13001).
2335 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002336 def testRecvmsgTrunc(self):
2337 # Receive part of message, check for truncation indicators.
2338 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2339 len(MSG) - 3)
2340 self.assertEqual(msg, MSG[:-3])
2341 self.checkRecvmsgAddress(addr, self.cli_addr)
2342 self.assertEqual(ancdata, [])
2343 self.checkFlags(flags, eor=False)
2344
Charles-François Natali8619cd72011-10-03 19:43:15 +02002345 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002346 def _testRecvmsgTrunc(self):
2347 self.sendToServer(MSG)
2348
2349 def testRecvmsgShortAncillaryBuf(self):
2350 # Test ancillary data buffer too small to hold any ancillary data.
2351 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2352 len(MSG), 1)
2353 self.assertEqual(msg, MSG)
2354 self.checkRecvmsgAddress(addr, self.cli_addr)
2355 self.assertEqual(ancdata, [])
2356 self.checkFlags(flags, eor=True)
2357
2358 def _testRecvmsgShortAncillaryBuf(self):
2359 self.sendToServer(MSG)
2360
2361 def testRecvmsgLongAncillaryBuf(self):
2362 # Test large ancillary data buffer.
2363 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2364 len(MSG), 10240)
2365 self.assertEqual(msg, MSG)
2366 self.checkRecvmsgAddress(addr, self.cli_addr)
2367 self.assertEqual(ancdata, [])
2368 self.checkFlags(flags, eor=True)
2369
2370 def _testRecvmsgLongAncillaryBuf(self):
2371 self.sendToServer(MSG)
2372
2373 def testRecvmsgAfterClose(self):
2374 # Check that recvmsg[_into]() fails on a closed socket.
2375 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002376 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002377
2378 def _testRecvmsgAfterClose(self):
2379 pass
2380
2381 def testRecvmsgTimeout(self):
2382 # Check that timeout works.
2383 try:
2384 self.serv_sock.settimeout(0.03)
2385 self.assertRaises(socket.timeout,
2386 self.doRecvmsg, self.serv_sock, len(MSG))
2387 finally:
2388 self.misc_event.set()
2389
2390 def _testRecvmsgTimeout(self):
2391 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2392
2393 @requireAttrs(socket, "MSG_PEEK")
2394 def testRecvmsgPeek(self):
2395 # Check that MSG_PEEK in flags enables examination of pending
2396 # data without consuming it.
2397
2398 # Receive part of data with MSG_PEEK.
2399 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2400 len(MSG) - 3, 0,
2401 socket.MSG_PEEK)
2402 self.assertEqual(msg, MSG[:-3])
2403 self.checkRecvmsgAddress(addr, self.cli_addr)
2404 self.assertEqual(ancdata, [])
2405 # Ignoring MSG_TRUNC here (so this test is the same for stream
2406 # and datagram sockets). Some wording in POSIX seems to
2407 # suggest that it needn't be set when peeking, but that may
2408 # just be a slip.
2409 self.checkFlags(flags, eor=False,
2410 ignore=getattr(socket, "MSG_TRUNC", 0))
2411
2412 # Receive all data with MSG_PEEK.
2413 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2414 len(MSG), 0,
2415 socket.MSG_PEEK)
2416 self.assertEqual(msg, MSG)
2417 self.checkRecvmsgAddress(addr, self.cli_addr)
2418 self.assertEqual(ancdata, [])
2419 self.checkFlags(flags, eor=True)
2420
2421 # Check that the same data can still be received normally.
2422 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2423 self.assertEqual(msg, MSG)
2424 self.checkRecvmsgAddress(addr, self.cli_addr)
2425 self.assertEqual(ancdata, [])
2426 self.checkFlags(flags, eor=True)
2427
2428 @testRecvmsgPeek.client_skip
2429 def _testRecvmsgPeek(self):
2430 self.sendToServer(MSG)
2431
2432 @requireAttrs(socket.socket, "sendmsg")
2433 def testRecvmsgFromSendmsg(self):
2434 # Test receiving with recvmsg[_into]() when message is sent
2435 # using sendmsg().
2436 self.serv_sock.settimeout(self.fail_timeout)
2437 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2438 self.assertEqual(msg, MSG)
2439 self.checkRecvmsgAddress(addr, self.cli_addr)
2440 self.assertEqual(ancdata, [])
2441 self.checkFlags(flags, eor=True)
2442
2443 @testRecvmsgFromSendmsg.client_skip
2444 def _testRecvmsgFromSendmsg(self):
2445 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2446
2447
2448class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2449 # Tests which require a stream socket and can use either recvmsg()
2450 # or recvmsg_into().
2451
2452 def testRecvmsgEOF(self):
2453 # Receive end-of-stream indicator (b"", peer socket closed).
2454 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2455 self.assertEqual(msg, b"")
2456 self.checkRecvmsgAddress(addr, self.cli_addr)
2457 self.assertEqual(ancdata, [])
2458 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2459
2460 def _testRecvmsgEOF(self):
2461 self.cli_sock.close()
2462
2463 def testRecvmsgOverflow(self):
2464 # Receive a message in more than one chunk.
2465 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2466 len(MSG) - 3)
2467 self.checkRecvmsgAddress(addr, self.cli_addr)
2468 self.assertEqual(ancdata, [])
2469 self.checkFlags(flags, eor=False)
2470
2471 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2472 self.checkRecvmsgAddress(addr, self.cli_addr)
2473 self.assertEqual(ancdata, [])
2474 self.checkFlags(flags, eor=True)
2475
2476 msg = seg1 + seg2
2477 self.assertEqual(msg, MSG)
2478
2479 def _testRecvmsgOverflow(self):
2480 self.sendToServer(MSG)
2481
2482
2483class RecvmsgTests(RecvmsgGenericTests):
2484 # Tests for recvmsg() which can use any socket type.
2485
2486 def testRecvmsgBadArgs(self):
2487 # Check that recvmsg() rejects invalid arguments.
2488 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2489 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2490 -1, 0, 0)
2491 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2492 len(MSG), -1, 0)
2493 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2494 [bytearray(10)], 0, 0)
2495 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2496 object(), 0, 0)
2497 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2498 len(MSG), object(), 0)
2499 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2500 len(MSG), 0, object())
2501
2502 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2503 self.assertEqual(msg, MSG)
2504 self.checkRecvmsgAddress(addr, self.cli_addr)
2505 self.assertEqual(ancdata, [])
2506 self.checkFlags(flags, eor=True)
2507
2508 def _testRecvmsgBadArgs(self):
2509 self.sendToServer(MSG)
2510
2511
2512class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2513 # Tests for recvmsg_into() which can use any socket type.
2514
2515 def testRecvmsgIntoBadArgs(self):
2516 # Check that recvmsg_into() rejects invalid arguments.
2517 buf = bytearray(len(MSG))
2518 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2519 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2520 len(MSG), 0, 0)
2521 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2522 buf, 0, 0)
2523 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2524 [object()], 0, 0)
2525 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2526 [b"I'm not writable"], 0, 0)
2527 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2528 [buf, object()], 0, 0)
2529 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2530 [buf], -1, 0)
2531 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2532 [buf], object(), 0)
2533 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2534 [buf], 0, object())
2535
2536 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2537 self.assertEqual(nbytes, len(MSG))
2538 self.assertEqual(buf, bytearray(MSG))
2539 self.checkRecvmsgAddress(addr, self.cli_addr)
2540 self.assertEqual(ancdata, [])
2541 self.checkFlags(flags, eor=True)
2542
2543 def _testRecvmsgIntoBadArgs(self):
2544 self.sendToServer(MSG)
2545
2546 def testRecvmsgIntoGenerator(self):
2547 # Receive into buffer obtained from a generator (not a sequence).
2548 buf = bytearray(len(MSG))
2549 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2550 (o for o in [buf]))
2551 self.assertEqual(nbytes, len(MSG))
2552 self.assertEqual(buf, bytearray(MSG))
2553 self.checkRecvmsgAddress(addr, self.cli_addr)
2554 self.assertEqual(ancdata, [])
2555 self.checkFlags(flags, eor=True)
2556
2557 def _testRecvmsgIntoGenerator(self):
2558 self.sendToServer(MSG)
2559
2560 def testRecvmsgIntoArray(self):
2561 # Receive into an array rather than the usual bytearray.
2562 buf = array.array("B", [0] * len(MSG))
2563 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2564 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002565 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002566 self.checkRecvmsgAddress(addr, self.cli_addr)
2567 self.assertEqual(ancdata, [])
2568 self.checkFlags(flags, eor=True)
2569
2570 def _testRecvmsgIntoArray(self):
2571 self.sendToServer(MSG)
2572
2573 def testRecvmsgIntoScatter(self):
2574 # Receive into multiple buffers (scatter write).
2575 b1 = bytearray(b"----")
2576 b2 = bytearray(b"0123456789")
2577 b3 = bytearray(b"--------------")
2578 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2579 [b1, memoryview(b2)[2:9], b3])
2580 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2581 self.assertEqual(b1, bytearray(b"Mary"))
2582 self.assertEqual(b2, bytearray(b"01 had a 9"))
2583 self.assertEqual(b3, bytearray(b"little lamb---"))
2584 self.checkRecvmsgAddress(addr, self.cli_addr)
2585 self.assertEqual(ancdata, [])
2586 self.checkFlags(flags, eor=True)
2587
2588 def _testRecvmsgIntoScatter(self):
2589 self.sendToServer(b"Mary had a little lamb")
2590
2591
2592class CmsgMacroTests(unittest.TestCase):
2593 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2594 # assumptions used by sendmsg() and recvmsg[_into](), which share
2595 # code with these functions.
2596
2597 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002598 try:
2599 import _testcapi
2600 except ImportError:
2601 socklen_t_limit = 0x7fffffff
2602 else:
2603 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002604
2605 @requireAttrs(socket, "CMSG_LEN")
2606 def testCMSG_LEN(self):
2607 # Test CMSG_LEN() with various valid and invalid values,
2608 # checking the assumptions used by recvmsg() and sendmsg().
2609 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2610 values = list(range(257)) + list(range(toobig - 257, toobig))
2611
2612 # struct cmsghdr has at least three members, two of which are ints
2613 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2614 for n in values:
2615 ret = socket.CMSG_LEN(n)
2616 # This is how recvmsg() calculates the data size
2617 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2618 self.assertLessEqual(ret, self.socklen_t_limit)
2619
2620 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2621 # sendmsg() shares code with these functions, and requires
2622 # that it reject values over the limit.
2623 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2624 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2625
2626 @requireAttrs(socket, "CMSG_SPACE")
2627 def testCMSG_SPACE(self):
2628 # Test CMSG_SPACE() with various valid and invalid values,
2629 # checking the assumptions used by sendmsg().
2630 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2631 values = list(range(257)) + list(range(toobig - 257, toobig))
2632
2633 last = socket.CMSG_SPACE(0)
2634 # struct cmsghdr has at least three members, two of which are ints
2635 self.assertGreater(last, array.array("i").itemsize * 2)
2636 for n in values:
2637 ret = socket.CMSG_SPACE(n)
2638 self.assertGreaterEqual(ret, last)
2639 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2640 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2641 self.assertLessEqual(ret, self.socklen_t_limit)
2642 last = ret
2643
2644 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2645 # sendmsg() shares code with these functions, and requires
2646 # that it reject values over the limit.
2647 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2648 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2649
2650
2651class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2652 # Tests for file descriptor passing on Unix-domain sockets.
2653
2654 # Invalid file descriptor value that's unlikely to evaluate to a
2655 # real FD even if one of its bytes is replaced with a different
2656 # value (which shouldn't actually happen).
2657 badfd = -0x5555
2658
2659 def newFDs(self, n):
2660 # Return a list of n file descriptors for newly-created files
2661 # containing their list indices as ASCII numbers.
2662 fds = []
2663 for i in range(n):
2664 fd, path = tempfile.mkstemp()
2665 self.addCleanup(os.unlink, path)
2666 self.addCleanup(os.close, fd)
2667 os.write(fd, str(i).encode())
2668 fds.append(fd)
2669 return fds
2670
2671 def checkFDs(self, fds):
2672 # Check that the file descriptors in the given list contain
2673 # their correct list indices as ASCII numbers.
2674 for n, fd in enumerate(fds):
2675 os.lseek(fd, 0, os.SEEK_SET)
2676 self.assertEqual(os.read(fd, 1024), str(n).encode())
2677
2678 def registerRecvmsgResult(self, result):
2679 self.addCleanup(self.closeRecvmsgFDs, result)
2680
2681 def closeRecvmsgFDs(self, recvmsg_result):
2682 # Close all file descriptors specified in the ancillary data
2683 # of the given return value from recvmsg() or recvmsg_into().
2684 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2685 if (cmsg_level == socket.SOL_SOCKET and
2686 cmsg_type == socket.SCM_RIGHTS):
2687 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002688 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002689 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2690 for fd in fds:
2691 os.close(fd)
2692
2693 def createAndSendFDs(self, n):
2694 # Send n new file descriptors created by newFDs() to the
2695 # server, with the constant MSG as the non-ancillary data.
2696 self.assertEqual(
2697 self.sendmsgToServer([MSG],
2698 [(socket.SOL_SOCKET,
2699 socket.SCM_RIGHTS,
2700 array.array("i", self.newFDs(n)))]),
2701 len(MSG))
2702
2703 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2704 # Check that constant MSG was received with numfds file
2705 # descriptors in a maximum of maxcmsgs control messages (which
2706 # must contain only complete integers). By default, check
2707 # that MSG_CTRUNC is unset, but ignore any flags in
2708 # ignoreflags.
2709 msg, ancdata, flags, addr = result
2710 self.assertEqual(msg, MSG)
2711 self.checkRecvmsgAddress(addr, self.cli_addr)
2712 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2713 ignore=ignoreflags)
2714
2715 self.assertIsInstance(ancdata, list)
2716 self.assertLessEqual(len(ancdata), maxcmsgs)
2717 fds = array.array("i")
2718 for item in ancdata:
2719 self.assertIsInstance(item, tuple)
2720 cmsg_level, cmsg_type, cmsg_data = item
2721 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2722 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2723 self.assertIsInstance(cmsg_data, bytes)
2724 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002725 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002726
2727 self.assertEqual(len(fds), numfds)
2728 self.checkFDs(fds)
2729
2730 def testFDPassSimple(self):
2731 # Pass a single FD (array read from bytes object).
2732 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2733 len(MSG), 10240))
2734
2735 def _testFDPassSimple(self):
2736 self.assertEqual(
2737 self.sendmsgToServer(
2738 [MSG],
2739 [(socket.SOL_SOCKET,
2740 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002741 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002742 len(MSG))
2743
2744 def testMultipleFDPass(self):
2745 # Pass multiple FDs in a single array.
2746 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2747 len(MSG), 10240))
2748
2749 def _testMultipleFDPass(self):
2750 self.createAndSendFDs(4)
2751
2752 @requireAttrs(socket, "CMSG_SPACE")
2753 def testFDPassCMSG_SPACE(self):
2754 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2755 self.checkRecvmsgFDs(
2756 4, self.doRecvmsg(self.serv_sock, len(MSG),
2757 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2758
2759 @testFDPassCMSG_SPACE.client_skip
2760 def _testFDPassCMSG_SPACE(self):
2761 self.createAndSendFDs(4)
2762
2763 def testFDPassCMSG_LEN(self):
2764 # Test using CMSG_LEN() to calculate ancillary buffer size.
2765 self.checkRecvmsgFDs(1,
2766 self.doRecvmsg(self.serv_sock, len(MSG),
2767 socket.CMSG_LEN(4 * SIZEOF_INT)),
2768 # RFC 3542 says implementations may set
2769 # MSG_CTRUNC if there isn't enough space
2770 # for trailing padding.
2771 ignoreflags=socket.MSG_CTRUNC)
2772
2773 def _testFDPassCMSG_LEN(self):
2774 self.createAndSendFDs(1)
2775
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 @requireAttrs(socket, "CMSG_SPACE")
2779 def testFDPassSeparate(self):
2780 # Pass two FDs in two separate arrays. Arrays may be combined
2781 # into a single control message by the OS.
2782 self.checkRecvmsgFDs(2,
2783 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2784 maxcmsgs=2)
2785
2786 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002787 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002788 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002789 def _testFDPassSeparate(self):
2790 fd0, fd1 = self.newFDs(2)
2791 self.assertEqual(
2792 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2793 socket.SCM_RIGHTS,
2794 array.array("i", [fd0])),
2795 (socket.SOL_SOCKET,
2796 socket.SCM_RIGHTS,
2797 array.array("i", [fd1]))]),
2798 len(MSG))
2799
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002800 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002801 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002802 @requireAttrs(socket, "CMSG_SPACE")
2803 def testFDPassSeparateMinSpace(self):
2804 # Pass two FDs in two separate arrays, receiving them into the
2805 # minimum space for two arrays.
2806 self.checkRecvmsgFDs(2,
2807 self.doRecvmsg(self.serv_sock, len(MSG),
2808 socket.CMSG_SPACE(SIZEOF_INT) +
2809 socket.CMSG_LEN(SIZEOF_INT)),
2810 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2811
2812 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002813 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002814 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002815 def _testFDPassSeparateMinSpace(self):
2816 fd0, fd1 = self.newFDs(2)
2817 self.assertEqual(
2818 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2819 socket.SCM_RIGHTS,
2820 array.array("i", [fd0])),
2821 (socket.SOL_SOCKET,
2822 socket.SCM_RIGHTS,
2823 array.array("i", [fd1]))]),
2824 len(MSG))
2825
2826 def sendAncillaryIfPossible(self, msg, ancdata):
2827 # Try to send msg and ancdata to server, but if the system
2828 # call fails, just send msg with no ancillary data.
2829 try:
2830 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002831 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002832 # Check that it was the system call that failed
2833 self.assertIsInstance(e.errno, int)
2834 nbytes = self.sendmsgToServer([msg])
2835 self.assertEqual(nbytes, len(msg))
2836
Brett Cannon3bbad122015-12-28 17:21:44 -08002837 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002838 def testFDPassEmpty(self):
2839 # Try to pass an empty FD array. Can receive either no array
2840 # or an empty array.
2841 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2842 len(MSG), 10240),
2843 ignoreflags=socket.MSG_CTRUNC)
2844
2845 def _testFDPassEmpty(self):
2846 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2847 socket.SCM_RIGHTS,
2848 b"")])
2849
2850 def testFDPassPartialInt(self):
2851 # Try to pass a truncated FD array.
2852 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2853 len(MSG), 10240)
2854 self.assertEqual(msg, MSG)
2855 self.checkRecvmsgAddress(addr, self.cli_addr)
2856 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2857 self.assertLessEqual(len(ancdata), 1)
2858 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2859 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2860 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2861 self.assertLess(len(cmsg_data), SIZEOF_INT)
2862
2863 def _testFDPassPartialInt(self):
2864 self.sendAncillaryIfPossible(
2865 MSG,
2866 [(socket.SOL_SOCKET,
2867 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002868 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002869
2870 @requireAttrs(socket, "CMSG_SPACE")
2871 def testFDPassPartialIntInMiddle(self):
2872 # Try to pass two FD arrays, the first of which is truncated.
2873 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2874 len(MSG), 10240)
2875 self.assertEqual(msg, MSG)
2876 self.checkRecvmsgAddress(addr, self.cli_addr)
2877 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2878 self.assertLessEqual(len(ancdata), 2)
2879 fds = array.array("i")
2880 # Arrays may have been combined in a single control message
2881 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2882 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2883 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002884 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002885 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2886 self.assertLessEqual(len(fds), 2)
2887 self.checkFDs(fds)
2888
2889 @testFDPassPartialIntInMiddle.client_skip
2890 def _testFDPassPartialIntInMiddle(self):
2891 fd0, fd1 = self.newFDs(2)
2892 self.sendAncillaryIfPossible(
2893 MSG,
2894 [(socket.SOL_SOCKET,
2895 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002896 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002897 (socket.SOL_SOCKET,
2898 socket.SCM_RIGHTS,
2899 array.array("i", [fd1]))])
2900
2901 def checkTruncatedHeader(self, result, ignoreflags=0):
2902 # Check that no ancillary data items are returned when data is
2903 # truncated inside the cmsghdr structure.
2904 msg, ancdata, flags, addr = result
2905 self.assertEqual(msg, MSG)
2906 self.checkRecvmsgAddress(addr, self.cli_addr)
2907 self.assertEqual(ancdata, [])
2908 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2909 ignore=ignoreflags)
2910
2911 def testCmsgTruncNoBufSize(self):
2912 # Check that no ancillary data is received when no buffer size
2913 # is specified.
2914 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2915 # BSD seems to set MSG_CTRUNC only
2916 # if an item has been partially
2917 # received.
2918 ignoreflags=socket.MSG_CTRUNC)
2919
2920 def _testCmsgTruncNoBufSize(self):
2921 self.createAndSendFDs(1)
2922
2923 def testCmsgTrunc0(self):
2924 # Check that no ancillary data is received when buffer size is 0.
2925 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2926 ignoreflags=socket.MSG_CTRUNC)
2927
2928 def _testCmsgTrunc0(self):
2929 self.createAndSendFDs(1)
2930
2931 # Check that no ancillary data is returned for various non-zero
2932 # (but still too small) buffer sizes.
2933
2934 def testCmsgTrunc1(self):
2935 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2936
2937 def _testCmsgTrunc1(self):
2938 self.createAndSendFDs(1)
2939
2940 def testCmsgTrunc2Int(self):
2941 # The cmsghdr structure has at least three members, two of
2942 # which are ints, so we still shouldn't see any ancillary
2943 # data.
2944 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2945 SIZEOF_INT * 2))
2946
2947 def _testCmsgTrunc2Int(self):
2948 self.createAndSendFDs(1)
2949
2950 def testCmsgTruncLen0Minus1(self):
2951 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2952 socket.CMSG_LEN(0) - 1))
2953
2954 def _testCmsgTruncLen0Minus1(self):
2955 self.createAndSendFDs(1)
2956
2957 # The following tests try to truncate the control message in the
2958 # middle of the FD array.
2959
2960 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2961 # Check that file descriptor data is truncated to between
2962 # mindata and maxdata bytes when received with buffer size
2963 # ancbuf, and that any complete file descriptor numbers are
2964 # valid.
2965 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2966 len(MSG), ancbuf)
2967 self.assertEqual(msg, MSG)
2968 self.checkRecvmsgAddress(addr, self.cli_addr)
2969 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2970
2971 if mindata == 0 and ancdata == []:
2972 return
2973 self.assertEqual(len(ancdata), 1)
2974 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2975 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2976 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2977 self.assertGreaterEqual(len(cmsg_data), mindata)
2978 self.assertLessEqual(len(cmsg_data), maxdata)
2979 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002980 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002981 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2982 self.checkFDs(fds)
2983
2984 def testCmsgTruncLen0(self):
2985 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2986
2987 def _testCmsgTruncLen0(self):
2988 self.createAndSendFDs(1)
2989
2990 def testCmsgTruncLen0Plus1(self):
2991 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2992
2993 def _testCmsgTruncLen0Plus1(self):
2994 self.createAndSendFDs(2)
2995
2996 def testCmsgTruncLen1(self):
2997 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2998 maxdata=SIZEOF_INT)
2999
3000 def _testCmsgTruncLen1(self):
3001 self.createAndSendFDs(2)
3002
3003 def testCmsgTruncLen2Minus1(self):
3004 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3005 maxdata=(2 * SIZEOF_INT) - 1)
3006
3007 def _testCmsgTruncLen2Minus1(self):
3008 self.createAndSendFDs(2)
3009
3010
3011class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3012 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3013 # features of the RFC 3542 Advanced Sockets API for IPv6.
3014 # Currently we can only handle certain data items (e.g. traffic
3015 # class, hop limit, MTU discovery and fragmentation settings)
3016 # without resorting to unportable means such as the struct module,
3017 # but the tests here are aimed at testing the ancillary data
3018 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3019 # itself.
3020
3021 # Test value to use when setting hop limit of packet
3022 hop_limit = 2
3023
3024 # Test value to use when setting traffic class of packet.
3025 # -1 means "use kernel default".
3026 traffic_class = -1
3027
3028 def ancillaryMapping(self, ancdata):
3029 # Given ancillary data list ancdata, return a mapping from
3030 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3031 # Check that no (level, type) pair appears more than once.
3032 d = {}
3033 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3034 self.assertNotIn((cmsg_level, cmsg_type), d)
3035 d[(cmsg_level, cmsg_type)] = cmsg_data
3036 return d
3037
3038 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3039 # Receive hop limit into ancbufsize bytes of ancillary data
3040 # space. Check that data is MSG, ancillary data is not
3041 # truncated (but ignore any flags in ignoreflags), and hop
3042 # limit is between 0 and maxhop inclusive.
3043 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3044 socket.IPV6_RECVHOPLIMIT, 1)
3045 self.misc_event.set()
3046 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3047 len(MSG), ancbufsize)
3048
3049 self.assertEqual(msg, MSG)
3050 self.checkRecvmsgAddress(addr, self.cli_addr)
3051 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3052 ignore=ignoreflags)
3053
3054 self.assertEqual(len(ancdata), 1)
3055 self.assertIsInstance(ancdata[0], tuple)
3056 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3057 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3058 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3059 self.assertIsInstance(cmsg_data, bytes)
3060 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3061 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003062 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003063 self.assertGreaterEqual(a[0], 0)
3064 self.assertLessEqual(a[0], maxhop)
3065
3066 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3067 def testRecvHopLimit(self):
3068 # Test receiving the packet hop limit as ancillary data.
3069 self.checkHopLimit(ancbufsize=10240)
3070
3071 @testRecvHopLimit.client_skip
3072 def _testRecvHopLimit(self):
3073 # Need to wait until server has asked to receive ancillary
3074 # data, as implementations are not required to buffer it
3075 # otherwise.
3076 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3077 self.sendToServer(MSG)
3078
3079 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3080 def testRecvHopLimitCMSG_SPACE(self):
3081 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3082 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3083
3084 @testRecvHopLimitCMSG_SPACE.client_skip
3085 def _testRecvHopLimitCMSG_SPACE(self):
3086 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3087 self.sendToServer(MSG)
3088
3089 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3090 # 3542 says portable applications must provide space for trailing
3091 # padding. Implementations may set MSG_CTRUNC if there isn't
3092 # enough space for the padding.
3093
3094 @requireAttrs(socket.socket, "sendmsg")
3095 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3096 def testSetHopLimit(self):
3097 # Test setting hop limit on outgoing packet and receiving it
3098 # at the other end.
3099 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3100
3101 @testSetHopLimit.client_skip
3102 def _testSetHopLimit(self):
3103 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3104 self.assertEqual(
3105 self.sendmsgToServer([MSG],
3106 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3107 array.array("i", [self.hop_limit]))]),
3108 len(MSG))
3109
3110 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3111 ignoreflags=0):
3112 # Receive traffic class and hop limit into ancbufsize bytes of
3113 # ancillary data space. Check that data is MSG, ancillary
3114 # data is not truncated (but ignore any flags in ignoreflags),
3115 # and traffic class and hop limit are in range (hop limit no
3116 # more than maxhop).
3117 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3118 socket.IPV6_RECVHOPLIMIT, 1)
3119 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3120 socket.IPV6_RECVTCLASS, 1)
3121 self.misc_event.set()
3122 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3123 len(MSG), ancbufsize)
3124
3125 self.assertEqual(msg, MSG)
3126 self.checkRecvmsgAddress(addr, self.cli_addr)
3127 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3128 ignore=ignoreflags)
3129 self.assertEqual(len(ancdata), 2)
3130 ancmap = self.ancillaryMapping(ancdata)
3131
3132 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3133 self.assertEqual(len(tcdata), SIZEOF_INT)
3134 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003135 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003136 self.assertGreaterEqual(a[0], 0)
3137 self.assertLessEqual(a[0], 255)
3138
3139 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3140 self.assertEqual(len(hldata), SIZEOF_INT)
3141 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003142 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003143 self.assertGreaterEqual(a[0], 0)
3144 self.assertLessEqual(a[0], maxhop)
3145
3146 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3147 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3148 def testRecvTrafficClassAndHopLimit(self):
3149 # Test receiving traffic class and hop limit as ancillary data.
3150 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3151
3152 @testRecvTrafficClassAndHopLimit.client_skip
3153 def _testRecvTrafficClassAndHopLimit(self):
3154 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3155 self.sendToServer(MSG)
3156
3157 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3158 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3159 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3160 # Test receiving traffic class and hop limit, using
3161 # CMSG_SPACE() to calculate buffer size.
3162 self.checkTrafficClassAndHopLimit(
3163 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3164
3165 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3166 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3167 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3168 self.sendToServer(MSG)
3169
3170 @requireAttrs(socket.socket, "sendmsg")
3171 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3172 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3173 def testSetTrafficClassAndHopLimit(self):
3174 # Test setting traffic class and hop limit on outgoing packet,
3175 # and receiving them at the other end.
3176 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3177 maxhop=self.hop_limit)
3178
3179 @testSetTrafficClassAndHopLimit.client_skip
3180 def _testSetTrafficClassAndHopLimit(self):
3181 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3182 self.assertEqual(
3183 self.sendmsgToServer([MSG],
3184 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3185 array.array("i", [self.traffic_class])),
3186 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3187 array.array("i", [self.hop_limit]))]),
3188 len(MSG))
3189
3190 @requireAttrs(socket.socket, "sendmsg")
3191 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3192 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3193 def testOddCmsgSize(self):
3194 # Try to send ancillary data with first item one byte too
3195 # long. Fall back to sending with correct size if this fails,
3196 # and check that second item was handled correctly.
3197 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3198 maxhop=self.hop_limit)
3199
3200 @testOddCmsgSize.client_skip
3201 def _testOddCmsgSize(self):
3202 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3203 try:
3204 nbytes = self.sendmsgToServer(
3205 [MSG],
3206 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003207 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003208 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3209 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003210 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003211 self.assertIsInstance(e.errno, int)
3212 nbytes = self.sendmsgToServer(
3213 [MSG],
3214 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3215 array.array("i", [self.traffic_class])),
3216 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3217 array.array("i", [self.hop_limit]))])
3218 self.assertEqual(nbytes, len(MSG))
3219
3220 # Tests for proper handling of truncated ancillary data
3221
3222 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3223 # Receive hop limit into ancbufsize bytes of ancillary data
3224 # space, which should be too small to contain the ancillary
3225 # data header (if ancbufsize is None, pass no second argument
3226 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3227 # (unless included in ignoreflags), and no ancillary data is
3228 # returned.
3229 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3230 socket.IPV6_RECVHOPLIMIT, 1)
3231 self.misc_event.set()
3232 args = () if ancbufsize is None else (ancbufsize,)
3233 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3234 len(MSG), *args)
3235
3236 self.assertEqual(msg, MSG)
3237 self.checkRecvmsgAddress(addr, self.cli_addr)
3238 self.assertEqual(ancdata, [])
3239 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3240 ignore=ignoreflags)
3241
3242 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3243 def testCmsgTruncNoBufSize(self):
3244 # Check that no ancillary data is received when no ancillary
3245 # buffer size is provided.
3246 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3247 # BSD seems to set
3248 # MSG_CTRUNC only if an item
3249 # has been partially
3250 # received.
3251 ignoreflags=socket.MSG_CTRUNC)
3252
3253 @testCmsgTruncNoBufSize.client_skip
3254 def _testCmsgTruncNoBufSize(self):
3255 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3256 self.sendToServer(MSG)
3257
3258 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3259 def testSingleCmsgTrunc0(self):
3260 # Check that no ancillary data is received when ancillary
3261 # buffer size is zero.
3262 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3263 ignoreflags=socket.MSG_CTRUNC)
3264
3265 @testSingleCmsgTrunc0.client_skip
3266 def _testSingleCmsgTrunc0(self):
3267 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3268 self.sendToServer(MSG)
3269
3270 # Check that no ancillary data is returned for various non-zero
3271 # (but still too small) buffer sizes.
3272
3273 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3274 def testSingleCmsgTrunc1(self):
3275 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3276
3277 @testSingleCmsgTrunc1.client_skip
3278 def _testSingleCmsgTrunc1(self):
3279 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3280 self.sendToServer(MSG)
3281
3282 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3283 def testSingleCmsgTrunc2Int(self):
3284 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3285
3286 @testSingleCmsgTrunc2Int.client_skip
3287 def _testSingleCmsgTrunc2Int(self):
3288 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3289 self.sendToServer(MSG)
3290
3291 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3292 def testSingleCmsgTruncLen0Minus1(self):
3293 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3294
3295 @testSingleCmsgTruncLen0Minus1.client_skip
3296 def _testSingleCmsgTruncLen0Minus1(self):
3297 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3298 self.sendToServer(MSG)
3299
3300 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3301 def testSingleCmsgTruncInData(self):
3302 # Test truncation of a control message inside its associated
3303 # data. The message may be returned with its data truncated,
3304 # or not returned at all.
3305 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3306 socket.IPV6_RECVHOPLIMIT, 1)
3307 self.misc_event.set()
3308 msg, ancdata, flags, addr = self.doRecvmsg(
3309 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3310
3311 self.assertEqual(msg, MSG)
3312 self.checkRecvmsgAddress(addr, self.cli_addr)
3313 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3314
3315 self.assertLessEqual(len(ancdata), 1)
3316 if ancdata:
3317 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3318 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3319 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3320 self.assertLess(len(cmsg_data), SIZEOF_INT)
3321
3322 @testSingleCmsgTruncInData.client_skip
3323 def _testSingleCmsgTruncInData(self):
3324 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3325 self.sendToServer(MSG)
3326
3327 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3328 # Receive traffic class and hop limit into ancbufsize bytes of
3329 # ancillary data space, which should be large enough to
3330 # contain the first item, but too small to contain the header
3331 # of the second. Check that data is MSG, MSG_CTRUNC is set
3332 # (unless included in ignoreflags), and only one ancillary
3333 # data item is returned.
3334 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3335 socket.IPV6_RECVHOPLIMIT, 1)
3336 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3337 socket.IPV6_RECVTCLASS, 1)
3338 self.misc_event.set()
3339 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3340 len(MSG), ancbufsize)
3341
3342 self.assertEqual(msg, MSG)
3343 self.checkRecvmsgAddress(addr, self.cli_addr)
3344 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3345 ignore=ignoreflags)
3346
3347 self.assertEqual(len(ancdata), 1)
3348 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3349 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3350 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3351 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3352 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003353 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003354 self.assertGreaterEqual(a[0], 0)
3355 self.assertLessEqual(a[0], 255)
3356
3357 # Try the above test with various buffer sizes.
3358
3359 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3360 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3361 def testSecondCmsgTrunc0(self):
3362 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3363 ignoreflags=socket.MSG_CTRUNC)
3364
3365 @testSecondCmsgTrunc0.client_skip
3366 def _testSecondCmsgTrunc0(self):
3367 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3368 self.sendToServer(MSG)
3369
3370 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3371 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3372 def testSecondCmsgTrunc1(self):
3373 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3374
3375 @testSecondCmsgTrunc1.client_skip
3376 def _testSecondCmsgTrunc1(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 testSecondCmsgTrunc2Int(self):
3383 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3384 2 * SIZEOF_INT)
3385
3386 @testSecondCmsgTrunc2Int.client_skip
3387 def _testSecondCmsgTrunc2Int(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 testSecondCmsgTruncLen0Minus1(self):
3394 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3395 socket.CMSG_LEN(0) - 1)
3396
3397 @testSecondCmsgTruncLen0Minus1.client_skip
3398 def _testSecondCmsgTruncLen0Minus1(self):
3399 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3400 self.sendToServer(MSG)
3401
3402 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3403 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3404 def testSecomdCmsgTruncInData(self):
3405 # Test truncation of the second of two control messages inside
3406 # its associated data.
3407 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3408 socket.IPV6_RECVHOPLIMIT, 1)
3409 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3410 socket.IPV6_RECVTCLASS, 1)
3411 self.misc_event.set()
3412 msg, ancdata, flags, addr = self.doRecvmsg(
3413 self.serv_sock, len(MSG),
3414 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3415
3416 self.assertEqual(msg, MSG)
3417 self.checkRecvmsgAddress(addr, self.cli_addr)
3418 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3419
3420 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3421
3422 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3423 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3424 cmsg_types.remove(cmsg_type)
3425 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3426 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003427 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428 self.assertGreaterEqual(a[0], 0)
3429 self.assertLessEqual(a[0], 255)
3430
3431 if ancdata:
3432 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3433 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3434 cmsg_types.remove(cmsg_type)
3435 self.assertLess(len(cmsg_data), SIZEOF_INT)
3436
3437 self.assertEqual(ancdata, [])
3438
3439 @testSecomdCmsgTruncInData.client_skip
3440 def _testSecomdCmsgTruncInData(self):
3441 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3442 self.sendToServer(MSG)
3443
3444
3445# Derive concrete test classes for different socket types.
3446
3447class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3448 SendrecvmsgConnectionlessBase,
3449 ThreadedSocketTestMixin, UDPTestBase):
3450 pass
3451
3452@requireAttrs(socket.socket, "sendmsg")
3453@unittest.skipUnless(thread, 'Threading required for this test.')
3454class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3455 pass
3456
3457@requireAttrs(socket.socket, "recvmsg")
3458@unittest.skipUnless(thread, 'Threading required for this test.')
3459class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3460 pass
3461
3462@requireAttrs(socket.socket, "recvmsg_into")
3463@unittest.skipUnless(thread, 'Threading required for this test.')
3464class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3465 pass
3466
3467
3468class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3469 SendrecvmsgConnectionlessBase,
3470 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003471
3472 def checkRecvmsgAddress(self, addr1, addr2):
3473 # Called to compare the received address with the address of
3474 # the peer, ignoring scope ID
3475 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003476
3477@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003478@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003479@requireSocket("AF_INET6", "SOCK_DGRAM")
3480@unittest.skipUnless(thread, 'Threading required for this test.')
3481class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3482 pass
3483
3484@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003485@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003486@requireSocket("AF_INET6", "SOCK_DGRAM")
3487@unittest.skipUnless(thread, 'Threading required for this test.')
3488class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3489 pass
3490
3491@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003492@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003493@requireSocket("AF_INET6", "SOCK_DGRAM")
3494@unittest.skipUnless(thread, 'Threading required for this test.')
3495class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3496 pass
3497
3498@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003499@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003500@requireAttrs(socket, "IPPROTO_IPV6")
3501@requireSocket("AF_INET6", "SOCK_DGRAM")
3502@unittest.skipUnless(thread, 'Threading required for this test.')
3503class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3504 SendrecvmsgUDP6TestBase):
3505 pass
3506
3507@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003508@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003509@requireAttrs(socket, "IPPROTO_IPV6")
3510@requireSocket("AF_INET6", "SOCK_DGRAM")
3511@unittest.skipUnless(thread, 'Threading required for this test.')
3512class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3513 RFC3542AncillaryTest,
3514 SendrecvmsgUDP6TestBase):
3515 pass
3516
3517
3518class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3519 ConnectedStreamTestMixin, TCPTestBase):
3520 pass
3521
3522@requireAttrs(socket.socket, "sendmsg")
3523@unittest.skipUnless(thread, 'Threading required for this test.')
3524class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3525 pass
3526
3527@requireAttrs(socket.socket, "recvmsg")
3528@unittest.skipUnless(thread, 'Threading required for this test.')
3529class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3530 SendrecvmsgTCPTestBase):
3531 pass
3532
3533@requireAttrs(socket.socket, "recvmsg_into")
3534@unittest.skipUnless(thread, 'Threading required for this test.')
3535class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3536 SendrecvmsgTCPTestBase):
3537 pass
3538
3539
3540class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3541 SendrecvmsgConnectedBase,
3542 ConnectedStreamTestMixin, SCTPStreamBase):
3543 pass
3544
3545@requireAttrs(socket.socket, "sendmsg")
3546@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3547@unittest.skipUnless(thread, 'Threading required for this test.')
3548class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3549 pass
3550
3551@requireAttrs(socket.socket, "recvmsg")
3552@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3553@unittest.skipUnless(thread, 'Threading required for this test.')
3554class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3555 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003556
3557 def testRecvmsgEOF(self):
3558 try:
3559 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3560 except OSError as e:
3561 if e.errno != errno.ENOTCONN:
3562 raise
3563 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003564
3565@requireAttrs(socket.socket, "recvmsg_into")
3566@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3567@unittest.skipUnless(thread, 'Threading required for this test.')
3568class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3569 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003570
3571 def testRecvmsgEOF(self):
3572 try:
3573 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3574 except OSError as e:
3575 if e.errno != errno.ENOTCONN:
3576 raise
3577 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003578
3579
3580class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3581 ConnectedStreamTestMixin, UnixStreamBase):
3582 pass
3583
3584@requireAttrs(socket.socket, "sendmsg")
3585@requireAttrs(socket, "AF_UNIX")
3586@unittest.skipUnless(thread, 'Threading required for this test.')
3587class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3588 pass
3589
3590@requireAttrs(socket.socket, "recvmsg")
3591@requireAttrs(socket, "AF_UNIX")
3592@unittest.skipUnless(thread, 'Threading required for this test.')
3593class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3594 SendrecvmsgUnixStreamTestBase):
3595 pass
3596
3597@requireAttrs(socket.socket, "recvmsg_into")
3598@requireAttrs(socket, "AF_UNIX")
3599@unittest.skipUnless(thread, 'Threading required for this test.')
3600class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3601 SendrecvmsgUnixStreamTestBase):
3602 pass
3603
3604@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3605@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3606@unittest.skipUnless(thread, 'Threading required for this test.')
3607class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3608 pass
3609
3610@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3611@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3612@unittest.skipUnless(thread, 'Threading required for this test.')
3613class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3614 SendrecvmsgUnixStreamTestBase):
3615 pass
3616
3617
3618# Test interrupting the interruptible send/receive methods with a
3619# signal when a timeout is set. These tests avoid having multiple
3620# threads alive during the test so that the OS cannot deliver the
3621# signal to the wrong one.
3622
3623class InterruptedTimeoutBase(unittest.TestCase):
3624 # Base class for interrupted send/receive tests. Installs an
3625 # empty handler for SIGALRM and removes it on teardown, along with
3626 # any scheduled alarms.
3627
3628 def setUp(self):
3629 super().setUp()
3630 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003631 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003632 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3633 self.addCleanup(self.setAlarm, 0)
3634
3635 # Timeout for socket operations
3636 timeout = 4.0
3637
3638 # Provide setAlarm() method to schedule delivery of SIGALRM after
3639 # given number of seconds, or cancel it if zero, and an
3640 # appropriate time value to use. Use setitimer() if available.
3641 if hasattr(signal, "setitimer"):
3642 alarm_time = 0.05
3643
3644 def setAlarm(self, seconds):
3645 signal.setitimer(signal.ITIMER_REAL, seconds)
3646 else:
3647 # Old systems may deliver the alarm up to one second early
3648 alarm_time = 2
3649
3650 def setAlarm(self, seconds):
3651 signal.alarm(seconds)
3652
3653
3654# Require siginterrupt() in order to ensure that system calls are
3655# interrupted by default.
3656@requireAttrs(signal, "siginterrupt")
3657@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3658 "Don't have signal.alarm or signal.setitimer")
3659class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3660 # Test interrupting the recv*() methods with signals when a
3661 # timeout is set.
3662
3663 def setUp(self):
3664 super().setUp()
3665 self.serv.settimeout(self.timeout)
3666
3667 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003668 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003669 # errno of EINTR when interrupted by a signal.
3670 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003671 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003672 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003673
3674 def testInterruptedRecvTimeout(self):
3675 self.checkInterruptedRecv(self.serv.recv, 1024)
3676
3677 def testInterruptedRecvIntoTimeout(self):
3678 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3679
3680 def testInterruptedRecvfromTimeout(self):
3681 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3682
3683 def testInterruptedRecvfromIntoTimeout(self):
3684 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3685
3686 @requireAttrs(socket.socket, "recvmsg")
3687 def testInterruptedRecvmsgTimeout(self):
3688 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3689
3690 @requireAttrs(socket.socket, "recvmsg_into")
3691 def testInterruptedRecvmsgIntoTimeout(self):
3692 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3693
3694
3695# Require siginterrupt() in order to ensure that system calls are
3696# interrupted by default.
3697@requireAttrs(signal, "siginterrupt")
3698@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3699 "Don't have signal.alarm or signal.setitimer")
3700@unittest.skipUnless(thread, 'Threading required for this test.')
3701class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3702 ThreadSafeCleanupTestCase,
3703 SocketListeningTestMixin, TCPTestBase):
3704 # Test interrupting the interruptible send*() methods with signals
3705 # when a timeout is set.
3706
3707 def setUp(self):
3708 super().setUp()
3709 self.serv_conn = self.newSocket()
3710 self.addCleanup(self.serv_conn.close)
3711 # Use a thread to complete the connection, but wait for it to
3712 # terminate before running the test, so that there is only one
3713 # thread to accept the signal.
3714 cli_thread = threading.Thread(target=self.doConnect)
3715 cli_thread.start()
3716 self.cli_conn, addr = self.serv.accept()
3717 self.addCleanup(self.cli_conn.close)
3718 cli_thread.join()
3719 self.serv_conn.settimeout(self.timeout)
3720
3721 def doConnect(self):
3722 self.serv_conn.connect(self.serv_addr)
3723
3724 def checkInterruptedSend(self, func, *args, **kwargs):
3725 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003726 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003727 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003728 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003729 while True:
3730 self.setAlarm(self.alarm_time)
3731 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003732
Ned Deilyc5640382014-02-03 13:58:31 -08003733 # Issue #12958: The following tests have problems on OS X prior to 10.7
3734 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003735 def testInterruptedSendTimeout(self):
3736 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3737
Ned Deilyc5640382014-02-03 13:58:31 -08003738 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003739 def testInterruptedSendtoTimeout(self):
3740 # Passing an actual address here as Python's wrapper for
3741 # sendto() doesn't allow passing a zero-length one; POSIX
3742 # requires that the address is ignored since the socket is
3743 # connection-mode, however.
3744 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3745 self.serv_addr)
3746
Ned Deilyc5640382014-02-03 13:58:31 -08003747 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003748 @requireAttrs(socket.socket, "sendmsg")
3749 def testInterruptedSendmsgTimeout(self):
3750 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3751
3752
Victor Stinner45df8202010-04-28 22:31:17 +00003753@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003754class TCPCloserTest(ThreadedTCPSocketTest):
3755
3756 def testClose(self):
3757 conn, addr = self.serv.accept()
3758 conn.close()
3759
3760 sd = self.cli
3761 read, write, err = select.select([sd], [], [], 1.0)
3762 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003763 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003764
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003765 # Calling close() many times should be safe.
3766 conn.close()
3767 conn.close()
3768
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003769 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003770 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003771 time.sleep(1.0)
3772
Victor Stinner45df8202010-04-28 22:31:17 +00003773@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003774class BasicSocketPairTest(SocketPairTest):
3775
3776 def __init__(self, methodName='runTest'):
3777 SocketPairTest.__init__(self, methodName=methodName)
3778
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003779 def _check_defaults(self, sock):
3780 self.assertIsInstance(sock, socket.socket)
3781 if hasattr(socket, 'AF_UNIX'):
3782 self.assertEqual(sock.family, socket.AF_UNIX)
3783 else:
3784 self.assertEqual(sock.family, socket.AF_INET)
3785 self.assertEqual(sock.type, socket.SOCK_STREAM)
3786 self.assertEqual(sock.proto, 0)
3787
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003788 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003789 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003790
3791 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003792 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003793
Dave Cole331708b2004-08-09 04:51:41 +00003794 def testRecv(self):
3795 msg = self.serv.recv(1024)
3796 self.assertEqual(msg, MSG)
3797
3798 def _testRecv(self):
3799 self.cli.send(MSG)
3800
3801 def testSend(self):
3802 self.serv.send(MSG)
3803
3804 def _testSend(self):
3805 msg = self.cli.recv(1024)
3806 self.assertEqual(msg, MSG)
3807
Victor Stinner45df8202010-04-28 22:31:17 +00003808@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003809class NonBlockingTCPTests(ThreadedTCPSocketTest):
3810
3811 def __init__(self, methodName='runTest'):
3812 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3813
3814 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003815 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003816 self.serv.setblocking(True)
3817 self.assertIsNone(self.serv.gettimeout())
3818 self.serv.setblocking(False)
3819 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003820 start = time.time()
3821 try:
3822 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003823 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003824 pass
3825 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003826 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003827
3828 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003829 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003830
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003831 @support.cpython_only
3832 def testSetBlocking_overflow(self):
3833 # Issue 15989
3834 import _testcapi
3835 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3836 self.skipTest('needs UINT_MAX < ULONG_MAX')
3837 self.serv.setblocking(False)
3838 self.assertEqual(self.serv.gettimeout(), 0.0)
3839 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3840 self.assertIsNone(self.serv.gettimeout())
3841
3842 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3843
Serhiy Storchaka43767632013-11-03 21:31:38 +02003844 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3845 'test needs socket.SOCK_NONBLOCK')
3846 @support.requires_linux_version(2, 6, 28)
3847 def testInitNonBlocking(self):
3848 # reinit server socket
3849 self.serv.close()
3850 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3851 socket.SOCK_NONBLOCK)
3852 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003853 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003854 # actual testing
3855 start = time.time()
3856 try:
3857 self.serv.accept()
3858 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003859 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003860 end = time.time()
3861 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3862
3863 def _testInitNonBlocking(self):
3864 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003865
Antoine Pitrou600232b2011-01-05 21:03:42 +00003866 def testInheritFlags(self):
3867 # Issue #7995: when calling accept() on a listening socket with a
3868 # timeout, the resulting socket should not be non-blocking.
3869 self.serv.settimeout(10)
3870 try:
3871 conn, addr = self.serv.accept()
3872 message = conn.recv(len(MSG))
3873 finally:
3874 conn.close()
3875 self.serv.settimeout(None)
3876
3877 def _testInheritFlags(self):
3878 time.sleep(0.1)
3879 self.cli.connect((HOST, self.port))
3880 time.sleep(0.5)
3881 self.cli.send(MSG)
3882
Guido van Rossum24e4af82002-06-12 19:18:08 +00003883 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003884 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003885 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003886 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003887 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003888 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003889 pass
3890 else:
3891 self.fail("Error trying to do non-blocking accept.")
3892 read, write, err = select.select([self.serv], [], [])
3893 if self.serv in read:
3894 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003895 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003896 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003897 else:
3898 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003899
Guido van Rossum24e4af82002-06-12 19:18:08 +00003900 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003901 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003902 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003903
3904 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003905 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003906 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003907 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003908
3909 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003910 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003911 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003912
3913 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003914 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003915 conn, addr = self.serv.accept()
3916 conn.setblocking(0)
3917 try:
3918 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003919 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003920 pass
3921 else:
3922 self.fail("Error trying to do non-blocking recv.")
3923 read, write, err = select.select([conn], [], [])
3924 if conn in read:
3925 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003926 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003927 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003928 else:
3929 self.fail("Error during select call to non-blocking socket.")
3930
3931 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003932 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003933 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003934 self.cli.send(MSG)
3935
Victor Stinner45df8202010-04-28 22:31:17 +00003936@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003937class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003938 """Unit tests for the object returned by socket.makefile()
3939
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003941 the client connection. You can read from this file to
3942 get output from the server.
3943
Antoine Pitrou834bd812010-10-13 16:17:14 +00003944 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003945 server connection. You can write to this file to send output
3946 to the client.
3947 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003948
Guido van Rossume9f66142002-08-07 15:46:19 +00003949 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003950 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 errors = 'strict'
3952 newline = None
3953
3954 read_mode = 'rb'
3955 read_msg = MSG
3956 write_mode = 'wb'
3957 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003958
Guido van Rossum24e4af82002-06-12 19:18:08 +00003959 def __init__(self, methodName='runTest'):
3960 SocketConnectedTest.__init__(self, methodName=methodName)
3961
3962 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003963 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3964 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003965 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003966 self.read_file = self.cli_conn.makefile(
3967 self.read_mode, self.bufsize,
3968 encoding = self.encoding,
3969 errors = self.errors,
3970 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003971
3972 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003973 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 self.read_file.close()
3975 self.assertTrue(self.read_file.closed)
3976 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003977 SocketConnectedTest.tearDown(self)
3978
3979 def clientSetUp(self):
3980 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.write_file = self.serv_conn.makefile(
3982 self.write_mode, self.bufsize,
3983 encoding = self.encoding,
3984 errors = self.errors,
3985 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003986
3987 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003988 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 self.write_file.close()
3990 self.assertTrue(self.write_file.closed)
3991 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003992 SocketConnectedTest.clientTearDown(self)
3993
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003994 def testReadAfterTimeout(self):
3995 # Issue #7322: A file object must disallow further reads
3996 # after a timeout has occurred.
3997 self.cli_conn.settimeout(1)
3998 self.read_file.read(3)
3999 # First read raises a timeout
4000 self.assertRaises(socket.timeout, self.read_file.read, 1)
4001 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004002 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004003 self.read_file.read(1)
4004 self.assertIn("cannot read from timed out object", str(ctx.exception))
4005
4006 def _testReadAfterTimeout(self):
4007 self.write_file.write(self.write_msg[0:3])
4008 self.write_file.flush()
4009 self.serv_finished.wait()
4010
Guido van Rossum24e4af82002-06-12 19:18:08 +00004011 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004012 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004013 first_seg = self.read_file.read(len(self.read_msg)-3)
4014 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004015 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004016 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004017
4018 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004019 self.write_file.write(self.write_msg)
4020 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004021
Guido van Rossum8c943832002-08-08 01:00:28 +00004022 def testFullRead(self):
4023 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004024 msg = self.read_file.read()
4025 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004026
4027 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 self.write_file.write(self.write_msg)
4029 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004030
Guido van Rossum24e4af82002-06-12 19:18:08 +00004031 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004032 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004034 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004035 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004036 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004037 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004038 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004039 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004040
4041 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004042 self.write_file.write(self.write_msg)
4043 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004044
4045 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004046 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004047 line = self.read_file.readline()
4048 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004049
4050 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004051 self.write_file.write(self.write_msg)
4052 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004053
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004054 def testCloseAfterMakefile(self):
4055 # The file returned by makefile should keep the socket open.
4056 self.cli_conn.close()
4057 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004058 msg = self.read_file.read()
4059 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004060
4061 def _testCloseAfterMakefile(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
4065 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004066 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004067 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004068 if isinstance(self.read_msg, str):
4069 msg = msg.decode()
4070 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004071
4072 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004073 self.write_file.write(self.write_msg)
4074 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004075
Tim Peters116d83c2004-03-28 02:20:45 +00004076 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004077 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004078
4079 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004080 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004081
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004082 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004083 self.assertEqual(self.read_file.mode, self.read_mode)
4084 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004085
4086 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004087 self.assertEqual(self.write_file.mode, self.write_mode)
4088 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004089
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004090 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004091 self.read_file.close()
4092 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004093 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004094 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004095
4096 def _testRealClose(self):
4097 pass
4098
4099
Guido van Rossume9f66142002-08-07 15:46:19 +00004100class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4101
4102 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004103
Guido van Rossume9f66142002-08-07 15:46:19 +00004104 In this case (and in this case only), it should be possible to
4105 create a file object, read a line from it, create another file
4106 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004107 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004108 when reading multiple requests from the same socket."""
4109
4110 bufsize = 0 # Use unbuffered mode
4111
4112 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004113 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004114 line = self.read_file.readline() # first line
4115 self.assertEqual(line, b"A. " + self.write_msg) # first line
4116 self.read_file = self.cli_conn.makefile('rb', 0)
4117 line = self.read_file.readline() # second line
4118 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004119
4120 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004121 self.write_file.write(b"A. " + self.write_msg)
4122 self.write_file.write(b"B. " + self.write_msg)
4123 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004124
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004125 def testMakefileClose(self):
4126 # The file returned by makefile should keep the socket open...
4127 self.cli_conn.close()
4128 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004130 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004131 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004132 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004133
4134 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004135 self.write_file.write(self.write_msg)
4136 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004137
4138 def testMakefileCloseSocketDestroy(self):
4139 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004140 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004141 refcount_after = sys.getrefcount(self.cli_conn)
4142 self.assertEqual(refcount_before - 1, refcount_after)
4143
4144 def _testMakefileCloseSocketDestroy(self):
4145 pass
4146
Antoine Pitrou98b46702010-09-18 22:59:00 +00004147 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004148 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004149 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4150
4151 def testSmallReadNonBlocking(self):
4152 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004153 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4154 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004155 self.evt1.set()
4156 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004157 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004158 if first_seg is None:
4159 # Data not arrived (can happen under Windows), wait a bit
4160 time.sleep(0.5)
4161 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004162 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004163 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004164 self.assertEqual(n, 3)
4165 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004166 self.assertEqual(msg, self.read_msg)
4167 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4168 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004169
4170 def _testSmallReadNonBlocking(self):
4171 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 self.write_file.write(self.write_msg)
4173 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004174 self.evt2.set()
4175 # Avoid cloding the socket before the server test has finished,
4176 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4177 self.serv_finished.wait(5.0)
4178
4179 def testWriteNonBlocking(self):
4180 self.cli_finished.wait(5.0)
4181 # The client thread can't skip directly - the SkipTest exception
4182 # would appear as a failure.
4183 if self.serv_skipped:
4184 self.skipTest(self.serv_skipped)
4185
4186 def _testWriteNonBlocking(self):
4187 self.serv_skipped = None
4188 self.serv_conn.setblocking(False)
4189 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004190 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004191 LIMIT = 10
4192 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004193 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004194 self.assertGreater(n, 0)
4195 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004197 if n is None:
4198 # Succeeded
4199 break
4200 self.assertGreater(n, 0)
4201 else:
4202 # Let us know that this test didn't manage to establish
4203 # the expected conditions. This is not a failure in itself but,
4204 # if it happens repeatedly, the test should be fixed.
4205 self.serv_skipped = "failed to saturate the socket buffer"
4206
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004207
Guido van Rossum8c943832002-08-08 01:00:28 +00004208class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4209
4210 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4211
4212
4213class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4214
4215 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004216
Thomas Woutersb2137042007-02-01 18:02:27 +00004217
Antoine Pitrou834bd812010-10-13 16:17:14 +00004218class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4219 """Tests for socket.makefile() in text mode (rather than binary)"""
4220
4221 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004222 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004223 write_mode = 'wb'
4224 write_msg = MSG
4225 newline = ''
4226
4227
4228class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4229 """Tests for socket.makefile() in text mode (rather than binary)"""
4230
4231 read_mode = 'rb'
4232 read_msg = MSG
4233 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004234 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004235 newline = ''
4236
4237
4238class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4239 """Tests for socket.makefile() in text mode (rather than binary)"""
4240
4241 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004242 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004243 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004244 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004245 newline = ''
4246
4247
Guido van Rossumd8faa362007-04-27 19:54:29 +00004248class NetworkConnectionTest(object):
4249 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004250
Guido van Rossumd8faa362007-04-27 19:54:29 +00004251 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004252 # We're inherited below by BasicTCPTest2, which also inherits
4253 # BasicTCPTest, which defines self.port referenced below.
4254 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004255 self.serv_conn = self.cli
4256
4257class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4258 """Tests that NetworkConnection does not break existing TCP functionality.
4259 """
4260
4261class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004262
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004263 class MockSocket(socket.socket):
4264 def connect(self, *args):
4265 raise socket.timeout('timed out')
4266
4267 @contextlib.contextmanager
4268 def mocked_socket_module(self):
4269 """Return a socket which times out on connect"""
4270 old_socket = socket.socket
4271 socket.socket = self.MockSocket
4272 try:
4273 yield
4274 finally:
4275 socket.socket = old_socket
4276
4277 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004278 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004279 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004280 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004281 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004282 cli.connect((HOST, port))
4283 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4284
4285 def test_create_connection(self):
4286 # Issue #9792: errors raised by create_connection() should have
4287 # a proper errno attribute.
4288 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004289 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004290 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004291
4292 # Issue #16257: create_connection() calls getaddrinfo() against
4293 # 'localhost'. This may result in an IPV6 addr being returned
4294 # as well as an IPV4 one:
4295 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4296 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4297 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4298 #
4299 # create_connection() enumerates through all the addresses returned
4300 # and if it doesn't successfully bind to any of them, it propagates
4301 # the last exception it encountered.
4302 #
4303 # On Solaris, ENETUNREACH is returned in this circumstance instead
4304 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4305 # expected errnos.
4306 expected_errnos = [ errno.ECONNREFUSED, ]
4307 if hasattr(errno, 'ENETUNREACH'):
4308 expected_errnos.append(errno.ENETUNREACH)
4309
4310 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004311
4312 def test_create_connection_timeout(self):
4313 # Issue #9792: create_connection() should not recast timeout errors
4314 # as generic socket errors.
4315 with self.mocked_socket_module():
4316 with self.assertRaises(socket.timeout):
4317 socket.create_connection((HOST, 1234))
4318
Guido van Rossumd8faa362007-04-27 19:54:29 +00004319
Victor Stinner45df8202010-04-28 22:31:17 +00004320@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004321class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4322
4323 def __init__(self, methodName='runTest'):
4324 SocketTCPTest.__init__(self, methodName=methodName)
4325 ThreadableTest.__init__(self)
4326
4327 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004328 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004329
4330 def clientTearDown(self):
4331 self.cli.close()
4332 self.cli = None
4333 ThreadableTest.clientTearDown(self)
4334
4335 def _justAccept(self):
4336 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004337 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004338
4339 testFamily = _justAccept
4340 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004341 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004342 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004343 self.assertEqual(self.cli.family, 2)
4344
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004345 testSourceAddress = _justAccept
4346 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004347 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4348 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004349 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004350 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004351 # The port number being used is sufficient to show that the bind()
4352 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004353
Guido van Rossumd8faa362007-04-27 19:54:29 +00004354 testTimeoutDefault = _justAccept
4355 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004356 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004357 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004358 socket.setdefaulttimeout(42)
4359 try:
4360 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004361 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004362 finally:
4363 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004364 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004365
4366 testTimeoutNone = _justAccept
4367 def _testTimeoutNone(self):
4368 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004369 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004370 socket.setdefaulttimeout(30)
4371 try:
4372 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004373 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004374 finally:
4375 socket.setdefaulttimeout(None)
4376 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004377
4378 testTimeoutValueNamed = _justAccept
4379 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004380 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004381 self.assertEqual(self.cli.gettimeout(), 30)
4382
4383 testTimeoutValueNonamed = _justAccept
4384 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004385 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004386 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004387 self.assertEqual(self.cli.gettimeout(), 30)
4388
Victor Stinner45df8202010-04-28 22:31:17 +00004389@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004390class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4391
4392 def __init__(self, methodName='runTest'):
4393 SocketTCPTest.__init__(self, methodName=methodName)
4394 ThreadableTest.__init__(self)
4395
4396 def clientSetUp(self):
4397 pass
4398
4399 def clientTearDown(self):
4400 self.cli.close()
4401 self.cli = None
4402 ThreadableTest.clientTearDown(self)
4403
4404 def testInsideTimeout(self):
4405 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004406 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004407 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004408 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004409 testOutsideTimeout = testInsideTimeout
4410
4411 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004412 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004413 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004414 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004415
4416 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004417 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004418 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004419
4420
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004421class TCPTimeoutTest(SocketTCPTest):
4422
4423 def testTCPTimeout(self):
4424 def raise_timeout(*args, **kwargs):
4425 self.serv.settimeout(1.0)
4426 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004427 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004428 "Error generating a timeout exception (TCP)")
4429
4430 def testTimeoutZero(self):
4431 ok = False
4432 try:
4433 self.serv.settimeout(0.0)
4434 foo = self.serv.accept()
4435 except socket.timeout:
4436 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004437 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004438 ok = True
4439 except:
4440 self.fail("caught unexpected exception (TCP)")
4441 if not ok:
4442 self.fail("accept() returned success when we did not expect it")
4443
Serhiy Storchaka43767632013-11-03 21:31:38 +02004444 @unittest.skipUnless(hasattr(signal, 'alarm'),
4445 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004446 def testInterruptedTimeout(self):
4447 # XXX I don't know how to do this test on MSWindows or any other
4448 # plaform that doesn't support signal.alarm() or os.kill(), though
4449 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004450 self.serv.settimeout(5.0) # must be longer than alarm
4451 class Alarm(Exception):
4452 pass
4453 def alarm_handler(signal, frame):
4454 raise Alarm
4455 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4456 try:
4457 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4458 try:
4459 foo = self.serv.accept()
4460 except socket.timeout:
4461 self.fail("caught timeout instead of Alarm")
4462 except Alarm:
4463 pass
4464 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004465 self.fail("caught other exception instead of Alarm:"
4466 " %s(%s):\n%s" %
4467 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004468 else:
4469 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004470 finally:
4471 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004472 except Alarm:
4473 self.fail("got Alarm in wrong place")
4474 finally:
4475 # no alarm can be pending. Safe to restore old handler.
4476 signal.signal(signal.SIGALRM, old_alarm)
4477
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004478class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004479
4480 def testUDPTimeout(self):
4481 def raise_timeout(*args, **kwargs):
4482 self.serv.settimeout(1.0)
4483 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004484 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004485 "Error generating a timeout exception (UDP)")
4486
4487 def testTimeoutZero(self):
4488 ok = False
4489 try:
4490 self.serv.settimeout(0.0)
4491 foo = self.serv.recv(1024)
4492 except socket.timeout:
4493 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004494 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004495 ok = True
4496 except:
4497 self.fail("caught unexpected exception (UDP)")
4498 if not ok:
4499 self.fail("recv() returned success when we did not expect it")
4500
4501class TestExceptions(unittest.TestCase):
4502
4503 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004504 self.assertTrue(issubclass(OSError, Exception))
4505 self.assertTrue(issubclass(socket.herror, OSError))
4506 self.assertTrue(issubclass(socket.gaierror, OSError))
4507 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004508
Serhiy Storchaka43767632013-11-03 21:31:38 +02004509@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004510class TestLinuxAbstractNamespace(unittest.TestCase):
4511
4512 UNIX_PATH_MAX = 108
4513
4514 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004515 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004516 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4517 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004518 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004519 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4520 s2.connect(s1.getsockname())
4521 with s1.accept()[0] as s3:
4522 self.assertEqual(s1.getsockname(), address)
4523 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004524
4525 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004526 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004527 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4528 s.bind(address)
4529 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004530
4531 def testNameOverflow(self):
4532 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004533 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004534 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004535
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004536 def testStrName(self):
4537 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004538 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4539 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004540 s.bind("\x00python\x00test\x00")
4541 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004542 finally:
4543 s.close()
4544
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004545 def testBytearrayName(self):
4546 # Check that an abstract name can be passed as a bytearray.
4547 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4548 s.bind(bytearray(b"\x00python\x00test\x00"))
4549 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4550
Serhiy Storchaka43767632013-11-03 21:31:38 +02004551@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004552class TestUnixDomain(unittest.TestCase):
4553
4554 def setUp(self):
4555 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4556
4557 def tearDown(self):
4558 self.sock.close()
4559
4560 def encoded(self, path):
4561 # Return the given path encoded in the file system encoding,
4562 # or skip the test if this is not possible.
4563 try:
4564 return os.fsencode(path)
4565 except UnicodeEncodeError:
4566 self.skipTest(
4567 "Pathname {0!a} cannot be represented in file "
4568 "system encoding {1!r}".format(
4569 path, sys.getfilesystemencoding()))
4570
Antoine Pitrou16374872011-12-16 15:04:12 +01004571 def bind(self, sock, path):
4572 # Bind the socket
4573 try:
4574 sock.bind(path)
4575 except OSError as e:
4576 if str(e) == "AF_UNIX path too long":
4577 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004578 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004579 .format(path))
4580 else:
4581 raise
4582
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004583 def testStrAddr(self):
4584 # Test binding to and retrieving a normal string pathname.
4585 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004586 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004587 self.addCleanup(support.unlink, path)
4588 self.assertEqual(self.sock.getsockname(), path)
4589
4590 def testBytesAddr(self):
4591 # Test binding to a bytes pathname.
4592 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004593 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004594 self.addCleanup(support.unlink, path)
4595 self.assertEqual(self.sock.getsockname(), path)
4596
4597 def testSurrogateescapeBind(self):
4598 # Test binding to a valid non-ASCII pathname, with the
4599 # non-ASCII bytes supplied using surrogateescape encoding.
4600 path = os.path.abspath(support.TESTFN_UNICODE)
4601 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004602 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004603 self.addCleanup(support.unlink, path)
4604 self.assertEqual(self.sock.getsockname(), path)
4605
4606 def testUnencodableAddr(self):
4607 # Test binding to a pathname that cannot be encoded in the
4608 # file system encoding.
4609 if support.TESTFN_UNENCODABLE is None:
4610 self.skipTest("No unencodable filename available")
4611 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004612 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004613 self.addCleanup(support.unlink, path)
4614 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004615
Victor Stinner45df8202010-04-28 22:31:17 +00004616@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004617class BufferIOTest(SocketConnectedTest):
4618 """
4619 Test the buffer versions of socket.recv() and socket.send().
4620 """
4621 def __init__(self, methodName='runTest'):
4622 SocketConnectedTest.__init__(self, methodName=methodName)
4623
Antoine Pitrou25480782010-03-17 22:50:28 +00004624 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004625 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004626 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004627 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004628 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004629 self.assertEqual(msg, MSG)
4630
Antoine Pitrou25480782010-03-17 22:50:28 +00004631 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004632 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004633 self.serv_conn.send(buf)
4634
Antoine Pitrou25480782010-03-17 22:50:28 +00004635 def testRecvIntoBytearray(self):
4636 buf = bytearray(1024)
4637 nbytes = self.cli_conn.recv_into(buf)
4638 self.assertEqual(nbytes, len(MSG))
4639 msg = buf[:len(MSG)]
4640 self.assertEqual(msg, MSG)
4641
4642 _testRecvIntoBytearray = _testRecvIntoArray
4643
4644 def testRecvIntoMemoryview(self):
4645 buf = bytearray(1024)
4646 nbytes = self.cli_conn.recv_into(memoryview(buf))
4647 self.assertEqual(nbytes, len(MSG))
4648 msg = buf[:len(MSG)]
4649 self.assertEqual(msg, MSG)
4650
4651 _testRecvIntoMemoryview = _testRecvIntoArray
4652
4653 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004654 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004655 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004656 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004657 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004658 self.assertEqual(msg, MSG)
4659
Antoine Pitrou25480782010-03-17 22:50:28 +00004660 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004661 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004662 self.serv_conn.send(buf)
4663
Antoine Pitrou25480782010-03-17 22:50:28 +00004664 def testRecvFromIntoBytearray(self):
4665 buf = bytearray(1024)
4666 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4667 self.assertEqual(nbytes, len(MSG))
4668 msg = buf[:len(MSG)]
4669 self.assertEqual(msg, MSG)
4670
4671 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4672
4673 def testRecvFromIntoMemoryview(self):
4674 buf = bytearray(1024)
4675 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4676 self.assertEqual(nbytes, len(MSG))
4677 msg = buf[:len(MSG)]
4678 self.assertEqual(msg, MSG)
4679
4680 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4681
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004682 def testRecvFromIntoSmallBuffer(self):
4683 # See issue #20246.
4684 buf = bytearray(8)
4685 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4686
4687 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004688 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004689
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004690 def testRecvFromIntoEmptyBuffer(self):
4691 buf = bytearray()
4692 self.cli_conn.recvfrom_into(buf)
4693 self.cli_conn.recvfrom_into(buf, 0)
4694
4695 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4696
Christian Heimes043d6f62008-01-07 17:19:16 +00004697
4698TIPC_STYPE = 2000
4699TIPC_LOWER = 200
4700TIPC_UPPER = 210
4701
4702def isTipcAvailable():
4703 """Check if the TIPC module is loaded
4704
4705 The TIPC module is not loaded automatically on Ubuntu and probably
4706 other Linux distros.
4707 """
4708 if not hasattr(socket, "AF_TIPC"):
4709 return False
4710 if not os.path.isfile("/proc/modules"):
4711 return False
4712 with open("/proc/modules") as f:
4713 for line in f:
4714 if line.startswith("tipc "):
4715 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004716 return False
4717
Serhiy Storchaka43767632013-11-03 21:31:38 +02004718@unittest.skipUnless(isTipcAvailable(),
4719 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004720class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004721 def testRDM(self):
4722 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4723 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004724 self.addCleanup(srv.close)
4725 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004726
4727 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4728 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4729 TIPC_LOWER, TIPC_UPPER)
4730 srv.bind(srvaddr)
4731
4732 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4733 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4734 cli.sendto(MSG, sendaddr)
4735
4736 msg, recvaddr = srv.recvfrom(1024)
4737
4738 self.assertEqual(cli.getsockname(), recvaddr)
4739 self.assertEqual(msg, MSG)
4740
4741
Serhiy Storchaka43767632013-11-03 21:31:38 +02004742@unittest.skipUnless(isTipcAvailable(),
4743 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004744class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004745 def __init__(self, methodName = 'runTest'):
4746 unittest.TestCase.__init__(self, methodName = methodName)
4747 ThreadableTest.__init__(self)
4748
4749 def setUp(self):
4750 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004751 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004752 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4753 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4754 TIPC_LOWER, TIPC_UPPER)
4755 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004756 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004757 self.serverExplicitReady()
4758 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004759 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004760
4761 def clientSetUp(self):
4762 # The is a hittable race between serverExplicitReady() and the
4763 # accept() call; sleep a little while to avoid it, otherwise
4764 # we could get an exception
4765 time.sleep(0.1)
4766 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004767 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004768 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4769 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4770 self.cli.connect(addr)
4771 self.cliaddr = self.cli.getsockname()
4772
4773 def testStream(self):
4774 msg = self.conn.recv(1024)
4775 self.assertEqual(msg, MSG)
4776 self.assertEqual(self.cliaddr, self.connaddr)
4777
4778 def _testStream(self):
4779 self.cli.send(MSG)
4780 self.cli.close()
4781
4782
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004783@unittest.skipUnless(thread, 'Threading required for this test.')
4784class ContextManagersTest(ThreadedTCPSocketTest):
4785
4786 def _testSocketClass(self):
4787 # base test
4788 with socket.socket() as sock:
4789 self.assertFalse(sock._closed)
4790 self.assertTrue(sock._closed)
4791 # close inside with block
4792 with socket.socket() as sock:
4793 sock.close()
4794 self.assertTrue(sock._closed)
4795 # exception inside with block
4796 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004797 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004798 self.assertTrue(sock._closed)
4799
4800 def testCreateConnectionBase(self):
4801 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004802 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004803 data = conn.recv(1024)
4804 conn.sendall(data)
4805
4806 def _testCreateConnectionBase(self):
4807 address = self.serv.getsockname()
4808 with socket.create_connection(address) as sock:
4809 self.assertFalse(sock._closed)
4810 sock.sendall(b'foo')
4811 self.assertEqual(sock.recv(1024), b'foo')
4812 self.assertTrue(sock._closed)
4813
4814 def testCreateConnectionClose(self):
4815 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004816 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004817 data = conn.recv(1024)
4818 conn.sendall(data)
4819
4820 def _testCreateConnectionClose(self):
4821 address = self.serv.getsockname()
4822 with socket.create_connection(address) as sock:
4823 sock.close()
4824 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004825 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004826
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004827
Victor Stinnerdaf45552013-08-28 00:53:59 +02004828class InheritanceTest(unittest.TestCase):
4829 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4830 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004831 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004832 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004833 with socket.socket(socket.AF_INET,
4834 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4835 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004836 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004837
4838 def test_default_inheritable(self):
4839 sock = socket.socket()
4840 with sock:
4841 self.assertEqual(sock.get_inheritable(), False)
4842
4843 def test_dup(self):
4844 sock = socket.socket()
4845 with sock:
4846 newsock = sock.dup()
4847 sock.close()
4848 with newsock:
4849 self.assertEqual(newsock.get_inheritable(), False)
4850
4851 def test_set_inheritable(self):
4852 sock = socket.socket()
4853 with sock:
4854 sock.set_inheritable(True)
4855 self.assertEqual(sock.get_inheritable(), True)
4856
4857 sock.set_inheritable(False)
4858 self.assertEqual(sock.get_inheritable(), False)
4859
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004860 @unittest.skipIf(fcntl is None, "need fcntl")
4861 def test_get_inheritable_cloexec(self):
4862 sock = socket.socket()
4863 with sock:
4864 fd = sock.fileno()
4865 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004866
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004867 # clear FD_CLOEXEC flag
4868 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4869 flags &= ~fcntl.FD_CLOEXEC
4870 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004871
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004872 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004873
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004874 @unittest.skipIf(fcntl is None, "need fcntl")
4875 def test_set_inheritable_cloexec(self):
4876 sock = socket.socket()
4877 with sock:
4878 fd = sock.fileno()
4879 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4880 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004881
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004882 sock.set_inheritable(True)
4883 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4884 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004885
4886
Victor Stinnerdaf45552013-08-28 00:53:59 +02004887 @unittest.skipUnless(hasattr(socket, "socketpair"),
4888 "need socket.socketpair()")
4889 def test_socketpair(self):
4890 s1, s2 = socket.socketpair()
4891 self.addCleanup(s1.close)
4892 self.addCleanup(s2.close)
4893 self.assertEqual(s1.get_inheritable(), False)
4894 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004895
4896
4897@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4898 "SOCK_NONBLOCK not defined")
4899class NonblockConstantTest(unittest.TestCase):
4900 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4901 if nonblock:
4902 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4903 self.assertEqual(s.gettimeout(), timeout)
4904 else:
4905 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4906 self.assertEqual(s.gettimeout(), None)
4907
Charles-François Natali239bb962011-06-03 12:55:15 +02004908 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004909 def test_SOCK_NONBLOCK(self):
4910 # a lot of it seems silly and redundant, but I wanted to test that
4911 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004912 with socket.socket(socket.AF_INET,
4913 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4914 self.checkNonblock(s)
4915 s.setblocking(1)
4916 self.checkNonblock(s, False)
4917 s.setblocking(0)
4918 self.checkNonblock(s)
4919 s.settimeout(None)
4920 self.checkNonblock(s, False)
4921 s.settimeout(2.0)
4922 self.checkNonblock(s, timeout=2.0)
4923 s.setblocking(1)
4924 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004925 # defaulttimeout
4926 t = socket.getdefaulttimeout()
4927 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004928 with socket.socket() as s:
4929 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004930 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004931 with socket.socket() as s:
4932 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004933 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004934 with socket.socket() as s:
4935 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004936 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004937 with socket.socket() as s:
4938 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004939 socket.setdefaulttimeout(t)
4940
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004941
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004942@unittest.skipUnless(os.name == "nt", "Windows specific")
4943@unittest.skipUnless(multiprocessing, "need multiprocessing")
4944class TestSocketSharing(SocketTCPTest):
4945 # This must be classmethod and not staticmethod or multiprocessing
4946 # won't be able to bootstrap it.
4947 @classmethod
4948 def remoteProcessServer(cls, q):
4949 # Recreate socket from shared data
4950 sdata = q.get()
4951 message = q.get()
4952
4953 s = socket.fromshare(sdata)
4954 s2, c = s.accept()
4955
4956 # Send the message
4957 s2.sendall(message)
4958 s2.close()
4959 s.close()
4960
4961 def testShare(self):
4962 # Transfer the listening server socket to another process
4963 # and service it from there.
4964
4965 # Create process:
4966 q = multiprocessing.Queue()
4967 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4968 p.start()
4969
4970 # Get the shared socket data
4971 data = self.serv.share(p.pid)
4972
4973 # Pass the shared socket to the other process
4974 addr = self.serv.getsockname()
4975 self.serv.close()
4976 q.put(data)
4977
4978 # The data that the server will send us
4979 message = b"slapmahfro"
4980 q.put(message)
4981
4982 # Connect
4983 s = socket.create_connection(addr)
4984 # listen for the data
4985 m = []
4986 while True:
4987 data = s.recv(100)
4988 if not data:
4989 break
4990 m.append(data)
4991 s.close()
4992 received = b"".join(m)
4993 self.assertEqual(received, message)
4994 p.join()
4995
4996 def testShareLength(self):
4997 data = self.serv.share(os.getpid())
4998 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4999 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5000
5001 def compareSockets(self, org, other):
5002 # socket sharing is expected to work only for blocking socket
5003 # since the internal python timout value isn't transfered.
5004 self.assertEqual(org.gettimeout(), None)
5005 self.assertEqual(org.gettimeout(), other.gettimeout())
5006
5007 self.assertEqual(org.family, other.family)
5008 self.assertEqual(org.type, other.type)
5009 # If the user specified "0" for proto, then
5010 # internally windows will have picked the correct value.
5011 # Python introspection on the socket however will still return
5012 # 0. For the shared socket, the python value is recreated
5013 # from the actual value, so it may not compare correctly.
5014 if org.proto != 0:
5015 self.assertEqual(org.proto, other.proto)
5016
5017 def testShareLocal(self):
5018 data = self.serv.share(os.getpid())
5019 s = socket.fromshare(data)
5020 try:
5021 self.compareSockets(self.serv, s)
5022 finally:
5023 s.close()
5024
5025 def testTypes(self):
5026 families = [socket.AF_INET, socket.AF_INET6]
5027 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5028 for f in families:
5029 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005030 try:
5031 source = socket.socket(f, t)
5032 except OSError:
5033 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005034 try:
5035 data = source.share(os.getpid())
5036 shared = socket.fromshare(data)
5037 try:
5038 self.compareSockets(source, shared)
5039 finally:
5040 shared.close()
5041 finally:
5042 source.close()
5043
5044
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005045@unittest.skipUnless(thread, 'Threading required for this test.')
5046class SendfileUsingSendTest(ThreadedTCPSocketTest):
5047 """
5048 Test the send() implementation of socket.sendfile().
5049 """
5050
5051 FILESIZE = (10 * 1024 * 1024) # 10MB
5052 BUFSIZE = 8192
5053 FILEDATA = b""
5054 TIMEOUT = 2
5055
5056 @classmethod
5057 def setUpClass(cls):
5058 def chunks(total, step):
5059 assert total >= step
5060 while total > step:
5061 yield step
5062 total -= step
5063 if total:
5064 yield total
5065
5066 chunk = b"".join([random.choice(string.ascii_letters).encode()
5067 for i in range(cls.BUFSIZE)])
5068 with open(support.TESTFN, 'wb') as f:
5069 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5070 f.write(chunk)
5071 with open(support.TESTFN, 'rb') as f:
5072 cls.FILEDATA = f.read()
5073 assert len(cls.FILEDATA) == cls.FILESIZE
5074
5075 @classmethod
5076 def tearDownClass(cls):
5077 support.unlink(support.TESTFN)
5078
5079 def accept_conn(self):
5080 self.serv.settimeout(self.TIMEOUT)
5081 conn, addr = self.serv.accept()
5082 conn.settimeout(self.TIMEOUT)
5083 self.addCleanup(conn.close)
5084 return conn
5085
5086 def recv_data(self, conn):
5087 received = []
5088 while True:
5089 chunk = conn.recv(self.BUFSIZE)
5090 if not chunk:
5091 break
5092 received.append(chunk)
5093 return b''.join(received)
5094
5095 def meth_from_sock(self, sock):
5096 # Depending on the mixin class being run return either send()
5097 # or sendfile() method implementation.
5098 return getattr(sock, "_sendfile_use_send")
5099
5100 # regular file
5101
5102 def _testRegularFile(self):
5103 address = self.serv.getsockname()
5104 file = open(support.TESTFN, 'rb')
5105 with socket.create_connection(address) as sock, file as file:
5106 meth = self.meth_from_sock(sock)
5107 sent = meth(file)
5108 self.assertEqual(sent, self.FILESIZE)
5109 self.assertEqual(file.tell(), self.FILESIZE)
5110
5111 def testRegularFile(self):
5112 conn = self.accept_conn()
5113 data = self.recv_data(conn)
5114 self.assertEqual(len(data), self.FILESIZE)
5115 self.assertEqual(data, self.FILEDATA)
5116
5117 # non regular file
5118
5119 def _testNonRegularFile(self):
5120 address = self.serv.getsockname()
5121 file = io.BytesIO(self.FILEDATA)
5122 with socket.create_connection(address) as sock, file as file:
5123 sent = sock.sendfile(file)
5124 self.assertEqual(sent, self.FILESIZE)
5125 self.assertEqual(file.tell(), self.FILESIZE)
5126 self.assertRaises(socket._GiveupOnSendfile,
5127 sock._sendfile_use_sendfile, file)
5128
5129 def testNonRegularFile(self):
5130 conn = self.accept_conn()
5131 data = self.recv_data(conn)
5132 self.assertEqual(len(data), self.FILESIZE)
5133 self.assertEqual(data, self.FILEDATA)
5134
5135 # empty file
5136
5137 def _testEmptyFileSend(self):
5138 address = self.serv.getsockname()
5139 filename = support.TESTFN + "2"
5140 with open(filename, 'wb'):
5141 self.addCleanup(support.unlink, filename)
5142 file = open(filename, 'rb')
5143 with socket.create_connection(address) as sock, file as file:
5144 meth = self.meth_from_sock(sock)
5145 sent = meth(file)
5146 self.assertEqual(sent, 0)
5147 self.assertEqual(file.tell(), 0)
5148
5149 def testEmptyFileSend(self):
5150 conn = self.accept_conn()
5151 data = self.recv_data(conn)
5152 self.assertEqual(data, b"")
5153
5154 # offset
5155
5156 def _testOffset(self):
5157 address = self.serv.getsockname()
5158 file = open(support.TESTFN, 'rb')
5159 with socket.create_connection(address) as sock, file as file:
5160 meth = self.meth_from_sock(sock)
5161 sent = meth(file, offset=5000)
5162 self.assertEqual(sent, self.FILESIZE - 5000)
5163 self.assertEqual(file.tell(), self.FILESIZE)
5164
5165 def testOffset(self):
5166 conn = self.accept_conn()
5167 data = self.recv_data(conn)
5168 self.assertEqual(len(data), self.FILESIZE - 5000)
5169 self.assertEqual(data, self.FILEDATA[5000:])
5170
5171 # count
5172
5173 def _testCount(self):
5174 address = self.serv.getsockname()
5175 file = open(support.TESTFN, 'rb')
5176 with socket.create_connection(address, timeout=2) as sock, file as file:
5177 count = 5000007
5178 meth = self.meth_from_sock(sock)
5179 sent = meth(file, count=count)
5180 self.assertEqual(sent, count)
5181 self.assertEqual(file.tell(), count)
5182
5183 def testCount(self):
5184 count = 5000007
5185 conn = self.accept_conn()
5186 data = self.recv_data(conn)
5187 self.assertEqual(len(data), count)
5188 self.assertEqual(data, self.FILEDATA[:count])
5189
5190 # count small
5191
5192 def _testCountSmall(self):
5193 address = self.serv.getsockname()
5194 file = open(support.TESTFN, 'rb')
5195 with socket.create_connection(address, timeout=2) as sock, file as file:
5196 count = 1
5197 meth = self.meth_from_sock(sock)
5198 sent = meth(file, count=count)
5199 self.assertEqual(sent, count)
5200 self.assertEqual(file.tell(), count)
5201
5202 def testCountSmall(self):
5203 count = 1
5204 conn = self.accept_conn()
5205 data = self.recv_data(conn)
5206 self.assertEqual(len(data), count)
5207 self.assertEqual(data, self.FILEDATA[:count])
5208
5209 # count + offset
5210
5211 def _testCountWithOffset(self):
5212 address = self.serv.getsockname()
5213 file = open(support.TESTFN, 'rb')
5214 with socket.create_connection(address, timeout=2) as sock, file as file:
5215 count = 100007
5216 meth = self.meth_from_sock(sock)
5217 sent = meth(file, offset=2007, count=count)
5218 self.assertEqual(sent, count)
5219 self.assertEqual(file.tell(), count + 2007)
5220
5221 def testCountWithOffset(self):
5222 count = 100007
5223 conn = self.accept_conn()
5224 data = self.recv_data(conn)
5225 self.assertEqual(len(data), count)
5226 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5227
5228 # non blocking sockets are not supposed to work
5229
5230 def _testNonBlocking(self):
5231 address = self.serv.getsockname()
5232 file = open(support.TESTFN, 'rb')
5233 with socket.create_connection(address) as sock, file as file:
5234 sock.setblocking(False)
5235 meth = self.meth_from_sock(sock)
5236 self.assertRaises(ValueError, meth, file)
5237 self.assertRaises(ValueError, sock.sendfile, file)
5238
5239 def testNonBlocking(self):
5240 conn = self.accept_conn()
5241 if conn.recv(8192):
5242 self.fail('was not supposed to receive any data')
5243
5244 # timeout (non-triggered)
5245
5246 def _testWithTimeout(self):
5247 address = self.serv.getsockname()
5248 file = open(support.TESTFN, 'rb')
5249 with socket.create_connection(address, timeout=2) as sock, file as file:
5250 meth = self.meth_from_sock(sock)
5251 sent = meth(file)
5252 self.assertEqual(sent, self.FILESIZE)
5253
5254 def testWithTimeout(self):
5255 conn = self.accept_conn()
5256 data = self.recv_data(conn)
5257 self.assertEqual(len(data), self.FILESIZE)
5258 self.assertEqual(data, self.FILEDATA)
5259
5260 # timeout (triggered)
5261
5262 def _testWithTimeoutTriggeredSend(self):
5263 address = self.serv.getsockname()
5264 file = open(support.TESTFN, 'rb')
5265 with socket.create_connection(address, timeout=0.01) as sock, \
5266 file as file:
5267 meth = self.meth_from_sock(sock)
5268 self.assertRaises(socket.timeout, meth, file)
5269
5270 def testWithTimeoutTriggeredSend(self):
5271 conn = self.accept_conn()
5272 conn.recv(88192)
5273
5274 # errors
5275
5276 def _test_errors(self):
5277 pass
5278
5279 def test_errors(self):
5280 with open(support.TESTFN, 'rb') as file:
5281 with socket.socket(type=socket.SOCK_DGRAM) as s:
5282 meth = self.meth_from_sock(s)
5283 self.assertRaisesRegex(
5284 ValueError, "SOCK_STREAM", meth, file)
5285 with open(support.TESTFN, 'rt') as file:
5286 with socket.socket() as s:
5287 meth = self.meth_from_sock(s)
5288 self.assertRaisesRegex(
5289 ValueError, "binary mode", meth, file)
5290 with open(support.TESTFN, 'rb') as file:
5291 with socket.socket() as s:
5292 meth = self.meth_from_sock(s)
5293 self.assertRaisesRegex(TypeError, "positive integer",
5294 meth, file, count='2')
5295 self.assertRaisesRegex(TypeError, "positive integer",
5296 meth, file, count=0.1)
5297 self.assertRaisesRegex(ValueError, "positive integer",
5298 meth, file, count=0)
5299 self.assertRaisesRegex(ValueError, "positive integer",
5300 meth, file, count=-1)
5301
5302
5303@unittest.skipUnless(thread, 'Threading required for this test.')
5304@unittest.skipUnless(hasattr(os, "sendfile"),
5305 'os.sendfile() required for this test.')
5306class SendfileUsingSendfileTest(SendfileUsingSendTest):
5307 """
5308 Test the sendfile() implementation of socket.sendfile().
5309 """
5310 def meth_from_sock(self, sock):
5311 return getattr(sock, "_sendfile_use_sendfile")
5312
5313
Guido van Rossumb995eb72002-07-31 16:08:40 +00005314def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005315 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005316 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005317
5318 tests.extend([
5319 NonBlockingTCPTests,
5320 FileObjectClassTestCase,
5321 UnbufferedFileObjectClassTestCase,
5322 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005323 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005324 UnicodeReadFileObjectClassTestCase,
5325 UnicodeWriteFileObjectClassTestCase,
5326 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005327 NetworkConnectionNoServer,
5328 NetworkConnectionAttributesTest,
5329 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005330 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005331 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005332 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005333 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005334 tests.append(BasicSocketPairTest)
5335 tests.append(TestUnixDomain)
5336 tests.append(TestLinuxAbstractNamespace)
5337 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005338 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005339 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005340 tests.extend([
5341 CmsgMacroTests,
5342 SendmsgUDPTest,
5343 RecvmsgUDPTest,
5344 RecvmsgIntoUDPTest,
5345 SendmsgUDP6Test,
5346 RecvmsgUDP6Test,
5347 RecvmsgRFC3542AncillaryUDP6Test,
5348 RecvmsgIntoRFC3542AncillaryUDP6Test,
5349 RecvmsgIntoUDP6Test,
5350 SendmsgTCPTest,
5351 RecvmsgTCPTest,
5352 RecvmsgIntoTCPTest,
5353 SendmsgSCTPStreamTest,
5354 RecvmsgSCTPStreamTest,
5355 RecvmsgIntoSCTPStreamTest,
5356 SendmsgUnixStreamTest,
5357 RecvmsgUnixStreamTest,
5358 RecvmsgIntoUnixStreamTest,
5359 RecvmsgSCMRightsStreamTest,
5360 RecvmsgIntoSCMRightsStreamTest,
5361 # These are slow when setitimer() is not available
5362 InterruptedRecvTimeoutTest,
5363 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005364 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005365 SendfileUsingSendTest,
5366 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005367 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005368
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005369 thread_info = support.threading_setup()
5370 support.run_unittest(*tests)
5371 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005372
5373if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005374 test_main()