blob: 98ee615065e6857e4b0365305f35e6ca1beb64a2 [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
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000654 def test_repr(self):
655 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200656 with s:
657 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000658 self.assertIn('family=%s' % socket.AF_INET, repr(s))
659 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200660 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200661 self.assertNotIn('raddr', repr(s))
662 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200663 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200664 self.assertIn(str(s.getsockname()), repr(s))
665 self.assertIn('[closed]', repr(s))
666 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000667
Victor Stinnere254e532014-07-26 14:36:55 +0200668 @unittest.skipUnless(_socket is not None, 'need _socket module')
669 def test_csocket_repr(self):
670 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
671 try:
672 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
673 % (s.fileno(), s.family, s.type, s.proto))
674 self.assertEqual(repr(s), expected)
675 finally:
676 s.close()
677 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
678 % (s.family, s.type, s.proto))
679 self.assertEqual(repr(s), expected)
680
Raymond Hettinger027bb632004-05-31 03:09:25 +0000681 def test_weakref(self):
682 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
683 p = proxy(s)
684 self.assertEqual(p.fileno(), s.fileno())
685 s.close()
686 s = None
687 try:
688 p.fileno()
689 except ReferenceError:
690 pass
691 else:
692 self.fail('Socket proxy still exists')
693
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000695 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300696 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200697 with self.assertRaises(OSError, msg=msg % 'OSError'):
698 raise OSError
699 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200701 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000702 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703
Ezio Melotti63e42302011-05-07 19:47:48 +0300704 def testSendtoErrors(self):
705 # Testing that sendto doens't masks failures. See #10169.
706 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
707 self.addCleanup(s.close)
708 s.bind(('', 0))
709 sockname = s.getsockname()
710 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300711 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300712 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300713 self.assertEqual(str(cm.exception),
714 "'str' does not support the buffer interface")
715 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300716 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300717 self.assertEqual(str(cm.exception),
718 "'complex' does not support the buffer interface")
719 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300720 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300721 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300722 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300723 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300724 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300725 self.assertEqual(str(cm.exception),
726 "'str' does not support the buffer interface")
727 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300728 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300729 self.assertEqual(str(cm.exception),
730 "'complex' does not support the buffer interface")
731 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300732 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300733 self.assertIn('not NoneType', str(cm.exception))
734 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300735 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300736 self.assertIn('an integer is required', str(cm.exception))
737 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300738 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300739 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300740 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300741 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300742 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300743 self.assertIn('(1 given)', str(cm.exception))
744 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300745 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300747
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000749 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750 socket.AF_INET
751 socket.SOCK_STREAM
752 socket.SOCK_DGRAM
753 socket.SOCK_RAW
754 socket.SOCK_RDM
755 socket.SOCK_SEQPACKET
756 socket.SOL_SOCKET
757 socket.SO_REUSEADDR
758
Guido van Rossum654c11e2002-06-13 20:24:17 +0000759 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000760 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000761 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000762 try:
763 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200764 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000765 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600766 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000767 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000768 try:
769 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200770 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000771 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600772 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000773 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000774 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000775 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000776 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000777
Charles-François Natali0cc86852013-09-13 19:53:08 +0200778 def test_host_resolution(self):
779 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
780 '1:1:1:1:1:1:1:1:1']:
781 self.assertRaises(OSError, socket.gethostbyname, addr)
782 self.assertRaises(OSError, socket.gethostbyaddr, addr)
783
784 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
785 self.assertEqual(socket.gethostbyname(addr), addr)
786
787 # we don't test support.HOSTv6 because there's a chance it doesn't have
788 # a matching name entry (e.g. 'ip6-localhost')
789 for host in [support.HOST]:
790 self.assertIn(host, socket.gethostbyaddr(host)[2])
791
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000792 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
793 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
794 def test_sethostname(self):
795 oldhn = socket.gethostname()
796 try:
797 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200798 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000799 if e.errno == errno.EPERM:
800 self.skipTest("test should be run as root")
801 else:
802 raise
803 try:
804 # running test as root!
805 self.assertEqual(socket.gethostname(), 'new')
806 # Should work with bytes objects too
807 socket.sethostname(b'bar')
808 self.assertEqual(socket.gethostname(), 'bar')
809 finally:
810 socket.sethostname(oldhn)
811
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700812 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
813 'socket.if_nameindex() not available.')
814 def testInterfaceNameIndex(self):
815 interfaces = socket.if_nameindex()
816 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200817 self.assertIsInstance(index, int)
818 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700819 # interface indices are non-zero integers
820 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200821 _index = socket.if_nametoindex(name)
822 self.assertIsInstance(_index, int)
823 self.assertEqual(index, _index)
824 _name = socket.if_indextoname(index)
825 self.assertIsInstance(_name, str)
826 self.assertEqual(name, _name)
827
828 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
829 'socket.if_nameindex() not available.')
830 def testInvalidInterfaceNameIndex(self):
831 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200832 self.assertRaises(OSError, socket.if_indextoname, 0)
833 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200834 # test with invalid values
835 self.assertRaises(TypeError, socket.if_nametoindex, 0)
836 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700837
Serhiy Storchaka43767632013-11-03 21:31:38 +0200838 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
839 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000840 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000841 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200842 try:
843 # On some versions, this loses a reference
844 orig = sys.getrefcount(__name__)
845 socket.getnameinfo(__name__,0)
846 except TypeError:
847 if sys.getrefcount(__name__) != orig:
848 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000849
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000851 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852 try:
853 # On some versions, this crashes the interpreter.
854 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200855 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000857
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000858 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000859 # This just checks that htons etc. are their own inverse,
860 # when looking at the lower 16 or 32 bits.
861 sizes = {socket.htonl: 32, socket.ntohl: 32,
862 socket.htons: 16, socket.ntohs: 16}
863 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000864 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000865 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
866 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000867
Guido van Rossuma2627af2002-09-14 00:58:46 +0000868 swapped = func(mask)
869 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000870 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000871
Guido van Rossum018919a2007-01-15 00:07:32 +0000872 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000873 good_values = [ 1, 2, 3, 1, 2, 3 ]
874 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000875 for k in good_values:
876 socket.ntohl(k)
877 socket.ntohs(k)
878 socket.htonl(k)
879 socket.htons(k)
880 for k in bad_values:
881 self.assertRaises(OverflowError, socket.ntohl, k)
882 self.assertRaises(OverflowError, socket.ntohs, k)
883 self.assertRaises(OverflowError, socket.htonl, k)
884 self.assertRaises(OverflowError, socket.htons, k)
885
Barry Warsaw11b91a02004-06-28 00:50:43 +0000886 def testGetServBy(self):
887 eq = self.assertEqual
888 # Find one service that exists, then check all the related interfaces.
889 # I've ordered this by protocols that have both a tcp and udp
890 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200891 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200892 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000893 # avoid the 'echo' service on this platform, as there is an
894 # assumption breaking non-standard port/protocol entry
895 services = ('daytime', 'qotd', 'domain')
896 else:
897 services = ('echo', 'daytime', 'domain')
898 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000899 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000900 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000901 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200902 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000903 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000904 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200905 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000906 # Try same call with optional protocol omitted
907 port2 = socket.getservbyname(service)
908 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400909 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000910 try:
911 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200912 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000913 udpport = None
914 else:
915 eq(udpport, port)
916 # Now make sure the lookup by port returns the same service name
917 eq(socket.getservbyport(port2), service)
918 eq(socket.getservbyport(port, 'tcp'), service)
919 if udpport is not None:
920 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000921 # Make sure getservbyport does not accept out of range ports.
922 self.assertRaises(OverflowError, socket.getservbyport, -1)
923 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000924
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000925 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000926 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000927 # The default timeout should initially be None
928 self.assertEqual(socket.getdefaulttimeout(), None)
929 s = socket.socket()
930 self.assertEqual(s.gettimeout(), None)
931 s.close()
932
933 # Set the default timeout to 10, and see if it propagates
934 socket.setdefaulttimeout(10)
935 self.assertEqual(socket.getdefaulttimeout(), 10)
936 s = socket.socket()
937 self.assertEqual(s.gettimeout(), 10)
938 s.close()
939
940 # Reset the default timeout to None, and see if it propagates
941 socket.setdefaulttimeout(None)
942 self.assertEqual(socket.getdefaulttimeout(), None)
943 s = socket.socket()
944 self.assertEqual(s.gettimeout(), None)
945 s.close()
946
947 # Check that setting it to an invalid value raises ValueError
948 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
949
950 # Check that setting it to an invalid type raises TypeError
951 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
952
Serhiy Storchaka43767632013-11-03 21:31:38 +0200953 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
954 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000955 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000956 # Test that issue1008086 and issue767150 are fixed.
957 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000958 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
959 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000960
Serhiy Storchaka43767632013-11-03 21:31:38 +0200961 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
962 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000963 def testIPv4toString(self):
964 from socket import inet_aton as f, inet_pton, AF_INET
965 g = lambda a: inet_pton(AF_INET, a)
966
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100967 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200968 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100969 )
970
Ezio Melottib3aedd42010-11-20 19:04:17 +0000971 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
972 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
973 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
974 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
975 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100976 assertInvalid(f, '0.0.0.')
977 assertInvalid(f, '300.0.0.0')
978 assertInvalid(f, 'a.0.0.0')
979 assertInvalid(f, '1.2.3.4.5')
980 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000981
Ezio Melottib3aedd42010-11-20 19:04:17 +0000982 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
983 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
984 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
985 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100986 assertInvalid(g, '0.0.0.')
987 assertInvalid(g, '300.0.0.0')
988 assertInvalid(g, 'a.0.0.0')
989 assertInvalid(g, '1.2.3.4.5')
990 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000991
Serhiy Storchaka43767632013-11-03 21:31:38 +0200992 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
993 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000994 def testIPv6toString(self):
995 try:
996 from socket import inet_pton, AF_INET6, has_ipv6
997 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600998 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000999 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001000 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001001
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001002 if sys.platform == "win32":
1003 try:
1004 inet_pton(AF_INET6, '::')
1005 except OSError as e:
1006 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001007 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001008
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001009 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001010 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001011 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001012 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001013
Ezio Melottib3aedd42010-11-20 19:04:17 +00001014 self.assertEqual(b'\x00' * 16, f('::'))
1015 self.assertEqual(b'\x00' * 16, f('0::0'))
1016 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1017 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001018 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 +00001019 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1020 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001021 self.assertEqual(
1022 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1023 f('ad42:abc::127:0:254:2')
1024 )
1025 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1026 assertInvalid('0x20::')
1027 assertInvalid(':::')
1028 assertInvalid('::0::')
1029 assertInvalid('1::abc::')
1030 assertInvalid('1::abc::def')
1031 assertInvalid('1:2:3:4:5:6:')
1032 assertInvalid('1:2:3:4:5:6')
1033 assertInvalid('1:2:3:4:5:6:7:8:')
1034 assertInvalid('1:2:3:4:5:6:7:8:0')
1035
1036 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1037 f('::254.42.23.64')
1038 )
1039 self.assertEqual(
1040 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1041 f('42::a29b:254.42.23.64')
1042 )
1043 self.assertEqual(
1044 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1045 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1046 )
1047 assertInvalid('255.254.253.252')
1048 assertInvalid('1::260.2.3.0')
1049 assertInvalid('1::0.be.e.0')
1050 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1051 assertInvalid('::1.2.3.4:0')
1052 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001053
Serhiy Storchaka43767632013-11-03 21:31:38 +02001054 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1055 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001056 def testStringToIPv4(self):
1057 from socket import inet_ntoa as f, inet_ntop, AF_INET
1058 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001059 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001060 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001061 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001062
Ezio Melottib3aedd42010-11-20 19:04:17 +00001063 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1064 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1065 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1066 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001067 assertInvalid(f, b'\x00' * 3)
1068 assertInvalid(f, b'\x00' * 5)
1069 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001070
Ezio Melottib3aedd42010-11-20 19:04:17 +00001071 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1072 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1073 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001074 assertInvalid(g, b'\x00' * 3)
1075 assertInvalid(g, b'\x00' * 5)
1076 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001077
Serhiy Storchaka43767632013-11-03 21:31:38 +02001078 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1079 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001080 def testStringToIPv6(self):
1081 try:
1082 from socket import inet_ntop, AF_INET6, has_ipv6
1083 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001084 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001085 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001086 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001087
1088 if sys.platform == "win32":
1089 try:
1090 inet_ntop(AF_INET6, b'\x00' * 16)
1091 except OSError as e:
1092 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001093 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001094
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001095 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001096 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001097 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001098 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001099
Ezio Melottib3aedd42010-11-20 19:04:17 +00001100 self.assertEqual('::', f(b'\x00' * 16))
1101 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1102 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001103 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001104 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 +00001105 )
1106
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001107 assertInvalid(b'\x12' * 15)
1108 assertInvalid(b'\x12' * 17)
1109 assertInvalid(b'\x12' * 4)
1110
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001111 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001112
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001113 def testSockName(self):
1114 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001115 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001116 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001117 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001118 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001119 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001120 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1121 # it reasonable to get the host's addr in addition to 0.0.0.0.
1122 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001123 try:
1124 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001125 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001126 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001127 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001128 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001129 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001130
1131 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001132 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001133 # We know a socket should start without reuse==0
1134 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001135 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001136 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001137 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001138
1139 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001140 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001141 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001142 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1144 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001145 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001146
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001147 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001148 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001149 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1150 sock.settimeout(1)
1151 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001152 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001153
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001154 def testNewAttributes(self):
1155 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001156
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001157 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1158 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001159 if hasattr(socket, 'SOCK_CLOEXEC'):
1160 self.assertIn(sock.type,
1161 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1162 socket.SOCK_STREAM))
1163 else:
1164 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001165 self.assertEqual(sock.proto, 0)
1166 sock.close()
1167
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001168 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001169 sock = socket.socket()
1170 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001171 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001172 big_port = port + 65536
1173 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001174 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1175 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1176 # Since find_unused_port() is inherently subject to race conditions, we
1177 # call it a couple times if necessary.
1178 for i in itertools.count():
1179 port = support.find_unused_port()
1180 try:
1181 sock.bind((HOST, port))
1182 except OSError as e:
1183 if e.errno != errno.EADDRINUSE or i == 5:
1184 raise
1185 else:
1186 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001187
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001188 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001189 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001190 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1191 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1192 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1193 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001194 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1195 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001196 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001197 self.assertRaises(ValueError, s.ioctl, -1, None)
1198 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001199
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001200 def testGetaddrinfo(self):
1201 try:
1202 socket.getaddrinfo('localhost', 80)
1203 except socket.gaierror as err:
1204 if err.errno == socket.EAI_SERVICE:
1205 # see http://bugs.python.org/issue1282647
1206 self.skipTest("buggy libc version")
1207 raise
1208 # len of every sequence is supposed to be == 5
1209 for info in socket.getaddrinfo(HOST, None):
1210 self.assertEqual(len(info), 5)
1211 # host can be a domain name, a string representation of an
1212 # IPv4/v6 address or None
1213 socket.getaddrinfo('localhost', 80)
1214 socket.getaddrinfo('127.0.0.1', 80)
1215 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001216 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001217 socket.getaddrinfo('::1', 80)
1218 # port can be a string service name such as "http", a numeric
1219 # port number or None
1220 socket.getaddrinfo(HOST, "http")
1221 socket.getaddrinfo(HOST, 80)
1222 socket.getaddrinfo(HOST, None)
1223 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001224 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1225 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001226 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001227 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1228 self.assertEqual(type, socket.SOCK_STREAM)
1229 self.assertEqual(str(type), 'SocketType.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001230 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1231 for _, socktype, _, _, _ in infos:
1232 self.assertEqual(socktype, socket.SOCK_STREAM)
1233 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001234 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001235 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1236 # a server willing to support both IPv4 and IPv6 will
1237 # usually do this
1238 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1239 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001240 # test keyword arguments
1241 a = socket.getaddrinfo(HOST, None)
1242 b = socket.getaddrinfo(host=HOST, port=None)
1243 self.assertEqual(a, b)
1244 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1245 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1246 self.assertEqual(a, b)
1247 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1248 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1249 self.assertEqual(a, b)
1250 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1251 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1252 self.assertEqual(a, b)
1253 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1254 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1255 self.assertEqual(a, b)
1256 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1257 socket.AI_PASSIVE)
1258 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1259 type=socket.SOCK_STREAM, proto=0,
1260 flags=socket.AI_PASSIVE)
1261 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001262 # Issue #6697.
1263 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001264
Ned Deilyb24f4812014-02-13 22:50:42 -08001265 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001266 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001267 try:
1268 # The arguments here are undefined and the call may succeed
1269 # or fail. All we care here is that it doesn't segfault.
1270 socket.getaddrinfo("localhost", None, 0, 0, 0,
1271 socket.AI_NUMERICSERV)
1272 except socket.gaierror:
1273 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001274
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001275 def test_getnameinfo(self):
1276 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001277 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001278
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001279 @unittest.skipUnless(support.is_resource_enabled('network'),
1280 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001281 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001282 # Check for internet access before running test (issue #12804).
1283 try:
1284 socket.gethostbyname('python.org')
1285 except socket.gaierror as e:
1286 if e.errno == socket.EAI_NODATA:
1287 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001288 # these should all be successful
1289 socket.gethostbyname('испытание.python.org')
1290 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001291 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1292 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1293 # have a reverse entry yet
1294 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001295
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001296 def check_sendall_interrupted(self, with_timeout):
1297 # socketpair() is not stricly required, but it makes things easier.
1298 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1299 self.skipTest("signal.alarm and socket.socketpair required for this test")
1300 # Our signal handlers clobber the C errno by calling a math function
1301 # with an invalid domain value.
1302 def ok_handler(*args):
1303 self.assertRaises(ValueError, math.acosh, 0)
1304 def raising_handler(*args):
1305 self.assertRaises(ValueError, math.acosh, 0)
1306 1 // 0
1307 c, s = socket.socketpair()
1308 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1309 try:
1310 if with_timeout:
1311 # Just above the one second minimum for signal.alarm
1312 c.settimeout(1.5)
1313 with self.assertRaises(ZeroDivisionError):
1314 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001315 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001316 if with_timeout:
1317 signal.signal(signal.SIGALRM, ok_handler)
1318 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001319 self.assertRaises(socket.timeout, c.sendall,
1320 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001321 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001322 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001323 signal.signal(signal.SIGALRM, old_alarm)
1324 c.close()
1325 s.close()
1326
1327 def test_sendall_interrupted(self):
1328 self.check_sendall_interrupted(False)
1329
1330 def test_sendall_interrupted_with_timeout(self):
1331 self.check_sendall_interrupted(True)
1332
Antoine Pitroue033e062010-10-29 10:38:18 +00001333 def test_dealloc_warn(self):
1334 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1335 r = repr(sock)
1336 with self.assertWarns(ResourceWarning) as cm:
1337 sock = None
1338 support.gc_collect()
1339 self.assertIn(r, str(cm.warning.args[0]))
1340 # An open socket file object gets dereferenced after the socket
1341 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1342 f = sock.makefile('rb')
1343 r = repr(sock)
1344 sock = None
1345 support.gc_collect()
1346 with self.assertWarns(ResourceWarning):
1347 f = None
1348 support.gc_collect()
1349
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001350 def test_name_closed_socketio(self):
1351 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1352 fp = sock.makefile("rb")
1353 fp.close()
1354 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1355
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001356 def test_unusable_closed_socketio(self):
1357 with socket.socket() as sock:
1358 fp = sock.makefile("rb", buffering=0)
1359 self.assertTrue(fp.readable())
1360 self.assertFalse(fp.writable())
1361 self.assertFalse(fp.seekable())
1362 fp.close()
1363 self.assertRaises(ValueError, fp.readable)
1364 self.assertRaises(ValueError, fp.writable)
1365 self.assertRaises(ValueError, fp.seekable)
1366
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001367 def test_pickle(self):
1368 sock = socket.socket()
1369 with sock:
1370 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1371 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1372
Serhiy Storchaka78980432013-01-15 01:12:17 +02001373 def test_listen_backlog(self):
1374 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001375 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1376 srv.bind((HOST, 0))
1377 srv.listen(backlog)
1378
1379 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001380 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001381 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001382
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001383 @support.cpython_only
1384 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001385 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001386 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001387 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1388 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001389 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001390 srv.close()
1391
Charles-François Natali42663332012-01-02 15:57:30 +01001392 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001393 def test_flowinfo(self):
1394 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001395 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001396 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001397 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001398
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001399 def test_str_for_enums(self):
1400 # Make sure that the AF_* and SOCK_* constants have enum-like string
1401 # reprs.
1402 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1403 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1404 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1405
1406 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1407 def test_uknown_socket_family_repr(self):
1408 # Test that when created with a family that's not one of the known
1409 # AF_*/SOCK_* constants, socket.family just returns the number.
1410 #
1411 # To do this we fool socket.socket into believing it already has an
1412 # open fd because on this path it doesn't actually verify the family and
1413 # type and populates the socket object.
1414 #
1415 # On Windows this trick won't work, so the test is skipped.
1416 fd, _ = tempfile.mkstemp()
1417 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1418 self.assertEqual(s.family, 42424)
1419 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001420
Charles-François Natali47413c12011-10-06 19:47:44 +02001421@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1422class BasicCANTest(unittest.TestCase):
1423
1424 def testCrucialConstants(self):
1425 socket.AF_CAN
1426 socket.PF_CAN
1427 socket.CAN_RAW
1428
Charles-François Natali773e42d2013-02-05 19:42:01 +01001429 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1430 'socket.CAN_BCM required for this test.')
1431 def testBCMConstants(self):
1432 socket.CAN_BCM
1433
1434 # opcodes
1435 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1436 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1437 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1438 socket.CAN_BCM_TX_SEND # send one CAN frame
1439 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1440 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1441 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1442 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1443 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1444 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1445 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1446 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1447
Charles-François Natali47413c12011-10-06 19:47:44 +02001448 def testCreateSocket(self):
1449 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1450 pass
1451
Charles-François Natali773e42d2013-02-05 19:42:01 +01001452 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1453 'socket.CAN_BCM required for this test.')
1454 def testCreateBCMSocket(self):
1455 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1456 pass
1457
Charles-François Natali47413c12011-10-06 19:47:44 +02001458 def testBindAny(self):
1459 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1460 s.bind(('', ))
1461
1462 def testTooLongInterfaceName(self):
1463 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1464 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001465 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001466 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001467
1468 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1469 'socket.CAN_RAW_LOOPBACK required for this test.')
1470 def testLoopback(self):
1471 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1472 for loopback in (0, 1):
1473 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1474 loopback)
1475 self.assertEqual(loopback,
1476 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1477
1478 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1479 'socket.CAN_RAW_FILTER required for this test.')
1480 def testFilter(self):
1481 can_id, can_mask = 0x200, 0x700
1482 can_filter = struct.pack("=II", can_id, can_mask)
1483 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1484 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1485 self.assertEqual(can_filter,
1486 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1487
1488
1489@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001490@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001491class CANTest(ThreadedCANSocketTest):
1492
Charles-François Natali47413c12011-10-06 19:47:44 +02001493 def __init__(self, methodName='runTest'):
1494 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1495
1496 @classmethod
1497 def build_can_frame(cls, can_id, data):
1498 """Build a CAN frame."""
1499 can_dlc = len(data)
1500 data = data.ljust(8, b'\x00')
1501 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1502
1503 @classmethod
1504 def dissect_can_frame(cls, frame):
1505 """Dissect a CAN frame."""
1506 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1507 return (can_id, can_dlc, data[:can_dlc])
1508
1509 def testSendFrame(self):
1510 cf, addr = self.s.recvfrom(self.bufsize)
1511 self.assertEqual(self.cf, cf)
1512 self.assertEqual(addr[0], self.interface)
1513 self.assertEqual(addr[1], socket.AF_CAN)
1514
1515 def _testSendFrame(self):
1516 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1517 self.cli.send(self.cf)
1518
1519 def testSendMaxFrame(self):
1520 cf, addr = self.s.recvfrom(self.bufsize)
1521 self.assertEqual(self.cf, cf)
1522
1523 def _testSendMaxFrame(self):
1524 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1525 self.cli.send(self.cf)
1526
1527 def testSendMultiFrames(self):
1528 cf, addr = self.s.recvfrom(self.bufsize)
1529 self.assertEqual(self.cf1, cf)
1530
1531 cf, addr = self.s.recvfrom(self.bufsize)
1532 self.assertEqual(self.cf2, cf)
1533
1534 def _testSendMultiFrames(self):
1535 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1536 self.cli.send(self.cf1)
1537
1538 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1539 self.cli.send(self.cf2)
1540
Charles-François Natali773e42d2013-02-05 19:42:01 +01001541 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1542 'socket.CAN_BCM required for this test.')
1543 def _testBCM(self):
1544 cf, addr = self.cli.recvfrom(self.bufsize)
1545 self.assertEqual(self.cf, cf)
1546 can_id, can_dlc, data = self.dissect_can_frame(cf)
1547 self.assertEqual(self.can_id, can_id)
1548 self.assertEqual(self.data, data)
1549
1550 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1551 'socket.CAN_BCM required for this test.')
1552 def testBCM(self):
1553 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1554 self.addCleanup(bcm.close)
1555 bcm.connect((self.interface,))
1556 self.can_id = 0x123
1557 self.data = bytes([0xc0, 0xff, 0xee])
1558 self.cf = self.build_can_frame(self.can_id, self.data)
1559 opcode = socket.CAN_BCM_TX_SEND
1560 flags = 0
1561 count = 0
1562 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1563 bcm_can_id = 0x0222
1564 nframes = 1
1565 assert len(self.cf) == 16
1566 header = struct.pack(self.bcm_cmd_msg_fmt,
1567 opcode,
1568 flags,
1569 count,
1570 ival1_seconds,
1571 ival1_usec,
1572 ival2_seconds,
1573 ival2_usec,
1574 bcm_can_id,
1575 nframes,
1576 )
1577 header_plus_frame = header + self.cf
1578 bytes_sent = bcm.send(header_plus_frame)
1579 self.assertEqual(bytes_sent, len(header_plus_frame))
1580
Charles-François Natali47413c12011-10-06 19:47:44 +02001581
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001582@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1583class BasicRDSTest(unittest.TestCase):
1584
1585 def testCrucialConstants(self):
1586 socket.AF_RDS
1587 socket.PF_RDS
1588
1589 def testCreateSocket(self):
1590 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1591 pass
1592
1593 def testSocketBufferSize(self):
1594 bufsize = 16384
1595 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1596 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1597 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1598
1599
1600@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1601@unittest.skipUnless(thread, 'Threading required for this test.')
1602class RDSTest(ThreadedRDSSocketTest):
1603
1604 def __init__(self, methodName='runTest'):
1605 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1606
Charles-François Natali240c55f2011-11-10 20:33:36 +01001607 def setUp(self):
1608 super().setUp()
1609 self.evt = threading.Event()
1610
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001611 def testSendAndRecv(self):
1612 data, addr = self.serv.recvfrom(self.bufsize)
1613 self.assertEqual(self.data, data)
1614 self.assertEqual(self.cli_addr, addr)
1615
1616 def _testSendAndRecv(self):
1617 self.data = b'spam'
1618 self.cli.sendto(self.data, 0, (HOST, self.port))
1619
1620 def testPeek(self):
1621 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1622 self.assertEqual(self.data, data)
1623 data, addr = self.serv.recvfrom(self.bufsize)
1624 self.assertEqual(self.data, data)
1625
1626 def _testPeek(self):
1627 self.data = b'spam'
1628 self.cli.sendto(self.data, 0, (HOST, self.port))
1629
1630 @requireAttrs(socket.socket, 'recvmsg')
1631 def testSendAndRecvMsg(self):
1632 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1633 self.assertEqual(self.data, data)
1634
1635 @requireAttrs(socket.socket, 'sendmsg')
1636 def _testSendAndRecvMsg(self):
1637 self.data = b'hello ' * 10
1638 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1639
1640 def testSendAndRecvMulti(self):
1641 data, addr = self.serv.recvfrom(self.bufsize)
1642 self.assertEqual(self.data1, data)
1643
1644 data, addr = self.serv.recvfrom(self.bufsize)
1645 self.assertEqual(self.data2, data)
1646
1647 def _testSendAndRecvMulti(self):
1648 self.data1 = b'bacon'
1649 self.cli.sendto(self.data1, 0, (HOST, self.port))
1650
1651 self.data2 = b'egg'
1652 self.cli.sendto(self.data2, 0, (HOST, self.port))
1653
1654 def testSelect(self):
1655 r, w, x = select.select([self.serv], [], [], 3.0)
1656 self.assertIn(self.serv, r)
1657 data, addr = self.serv.recvfrom(self.bufsize)
1658 self.assertEqual(self.data, data)
1659
1660 def _testSelect(self):
1661 self.data = b'select'
1662 self.cli.sendto(self.data, 0, (HOST, self.port))
1663
1664 def testCongestion(self):
1665 # wait until the sender is done
1666 self.evt.wait()
1667
1668 def _testCongestion(self):
1669 # test the behavior in case of congestion
1670 self.data = b'fill'
1671 self.cli.setblocking(False)
1672 try:
1673 # try to lower the receiver's socket buffer size
1674 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1675 except OSError:
1676 pass
1677 with self.assertRaises(OSError) as cm:
1678 try:
1679 # fill the receiver's socket buffer
1680 while True:
1681 self.cli.sendto(self.data, 0, (HOST, self.port))
1682 finally:
1683 # signal the receiver we're done
1684 self.evt.set()
1685 # sendto() should have failed with ENOBUFS
1686 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1687 # and we should have received a congestion notification through poll
1688 r, w, x = select.select([self.serv], [], [], 3.0)
1689 self.assertIn(self.serv, r)
1690
1691
Victor Stinner45df8202010-04-28 22:31:17 +00001692@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001693class BasicTCPTest(SocketConnectedTest):
1694
1695 def __init__(self, methodName='runTest'):
1696 SocketConnectedTest.__init__(self, methodName=methodName)
1697
1698 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001699 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001700 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001701 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001702
1703 def _testRecv(self):
1704 self.serv_conn.send(MSG)
1705
1706 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001707 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001708 seg1 = self.cli_conn.recv(len(MSG) - 3)
1709 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001710 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001711 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001712
1713 def _testOverFlowRecv(self):
1714 self.serv_conn.send(MSG)
1715
1716 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001717 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001718 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001719 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001720
1721 def _testRecvFrom(self):
1722 self.serv_conn.send(MSG)
1723
1724 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001725 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001726 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1727 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001728 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001729 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001730
1731 def _testOverFlowRecvFrom(self):
1732 self.serv_conn.send(MSG)
1733
1734 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001735 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001736 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001737 while 1:
1738 read = self.cli_conn.recv(1024)
1739 if not read:
1740 break
Guido van Rossume531e292002-08-08 20:28:34 +00001741 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001742 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001743
1744 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001745 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001746 self.serv_conn.sendall(big_chunk)
1747
1748 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001749 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001750 fd = self.cli_conn.fileno()
1751 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001752 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001753 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001754 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001755 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001756
1757 def _testFromFd(self):
1758 self.serv_conn.send(MSG)
1759
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001760 def testDup(self):
1761 # Testing dup()
1762 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001763 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001764 msg = sock.recv(1024)
1765 self.assertEqual(msg, MSG)
1766
1767 def _testDup(self):
1768 self.serv_conn.send(MSG)
1769
Guido van Rossum24e4af82002-06-12 19:18:08 +00001770 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001771 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001772 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001773 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001774 # wait for _testShutdown to finish: on OS X, when the server
1775 # closes the connection the client also becomes disconnected,
1776 # and the client's shutdown call will fail. (Issue #4397.)
1777 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001778
1779 def _testShutdown(self):
1780 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001781 self.serv_conn.shutdown(2)
1782
1783 testShutdown_overflow = support.cpython_only(testShutdown)
1784
1785 @support.cpython_only
1786 def _testShutdown_overflow(self):
1787 import _testcapi
1788 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001789 # Issue 15989
1790 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1791 _testcapi.INT_MAX + 1)
1792 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1793 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001794 self.serv_conn.shutdown(2)
1795
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001796 def testDetach(self):
1797 # Testing detach()
1798 fileno = self.cli_conn.fileno()
1799 f = self.cli_conn.detach()
1800 self.assertEqual(f, fileno)
1801 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001802 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001803 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001804 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001805 # ...but we can create another socket using the (still open)
1806 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001807 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001808 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001809 msg = sock.recv(1024)
1810 self.assertEqual(msg, MSG)
1811
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001812 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001813 self.serv_conn.send(MSG)
1814
Victor Stinner45df8202010-04-28 22:31:17 +00001815@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001816class BasicUDPTest(ThreadedUDPSocketTest):
1817
1818 def __init__(self, methodName='runTest'):
1819 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1820
1821 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001822 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001823 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001824 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001825
1826 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001827 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001828
Guido van Rossum1c938012002-06-12 21:17:20 +00001829 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001830 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001831 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001832 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833
Guido van Rossum1c938012002-06-12 21:17:20 +00001834 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001835 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001836
Guido van Rossumd8faa362007-04-27 19:54:29 +00001837 def testRecvFromNegative(self):
1838 # Negative lengths passed to recvfrom should give ValueError.
1839 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1840
1841 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001842 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001843
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001844# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1845# same test code is used with different families and types of socket
1846# (e.g. stream, datagram), and tests using recvmsg() are repeated
1847# using recvmsg_into().
1848#
1849# The generic test classes such as SendmsgTests and
1850# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1851# supplied with sockets cli_sock and serv_sock representing the
1852# client's and the server's end of the connection respectively, and
1853# attributes cli_addr and serv_addr holding their (numeric where
1854# appropriate) addresses.
1855#
1856# The final concrete test classes combine these with subclasses of
1857# SocketTestBase which set up client and server sockets of a specific
1858# type, and with subclasses of SendrecvmsgBase such as
1859# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1860# sockets to cli_sock and serv_sock and override the methods and
1861# attributes of SendrecvmsgBase to fill in destination addresses if
1862# needed when sending, check for specific flags in msg_flags, etc.
1863#
1864# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1865# recvmsg_into().
1866
1867# XXX: like the other datagram (UDP) tests in this module, the code
1868# here assumes that datagram delivery on the local machine will be
1869# reliable.
1870
1871class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1872 # Base class for sendmsg()/recvmsg() tests.
1873
1874 # Time in seconds to wait before considering a test failed, or
1875 # None for no timeout. Not all tests actually set a timeout.
1876 fail_timeout = 3.0
1877
1878 def setUp(self):
1879 self.misc_event = threading.Event()
1880 super().setUp()
1881
1882 def sendToServer(self, msg):
1883 # Send msg to the server.
1884 return self.cli_sock.send(msg)
1885
1886 # Tuple of alternative default arguments for sendmsg() when called
1887 # via sendmsgToServer() (e.g. to include a destination address).
1888 sendmsg_to_server_defaults = ()
1889
1890 def sendmsgToServer(self, *args):
1891 # Call sendmsg() on self.cli_sock with the given arguments,
1892 # filling in any arguments which are not supplied with the
1893 # corresponding items of self.sendmsg_to_server_defaults, if
1894 # any.
1895 return self.cli_sock.sendmsg(
1896 *(args + self.sendmsg_to_server_defaults[len(args):]))
1897
1898 def doRecvmsg(self, sock, bufsize, *args):
1899 # Call recvmsg() on sock with given arguments and return its
1900 # result. Should be used for tests which can use either
1901 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1902 # this method with one which emulates it using recvmsg_into(),
1903 # thus allowing the same test to be used for both methods.
1904 result = sock.recvmsg(bufsize, *args)
1905 self.registerRecvmsgResult(result)
1906 return result
1907
1908 def registerRecvmsgResult(self, result):
1909 # Called by doRecvmsg() with the return value of recvmsg() or
1910 # recvmsg_into(). Can be overridden to arrange cleanup based
1911 # on the returned ancillary data, for instance.
1912 pass
1913
1914 def checkRecvmsgAddress(self, addr1, addr2):
1915 # Called to compare the received address with the address of
1916 # the peer.
1917 self.assertEqual(addr1, addr2)
1918
1919 # Flags that are normally unset in msg_flags
1920 msg_flags_common_unset = 0
1921 for name in ("MSG_CTRUNC", "MSG_OOB"):
1922 msg_flags_common_unset |= getattr(socket, name, 0)
1923
1924 # Flags that are normally set
1925 msg_flags_common_set = 0
1926
1927 # Flags set when a complete record has been received (e.g. MSG_EOR
1928 # for SCTP)
1929 msg_flags_eor_indicator = 0
1930
1931 # Flags set when a complete record has not been received
1932 # (e.g. MSG_TRUNC for datagram sockets)
1933 msg_flags_non_eor_indicator = 0
1934
1935 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1936 # Method to check the value of msg_flags returned by recvmsg[_into]().
1937 #
1938 # Checks that all bits in msg_flags_common_set attribute are
1939 # set in "flags" and all bits in msg_flags_common_unset are
1940 # unset.
1941 #
1942 # The "eor" argument specifies whether the flags should
1943 # indicate that a full record (or datagram) has been received.
1944 # If "eor" is None, no checks are done; otherwise, checks
1945 # that:
1946 #
1947 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1948 # set and all bits in msg_flags_non_eor_indicator are unset
1949 #
1950 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1951 # are set and all bits in msg_flags_eor_indicator are unset
1952 #
1953 # If "checkset" and/or "checkunset" are supplied, they require
1954 # the given bits to be set or unset respectively, overriding
1955 # what the attributes require for those bits.
1956 #
1957 # If any bits are set in "ignore", they will not be checked,
1958 # regardless of the other inputs.
1959 #
1960 # Will raise Exception if the inputs require a bit to be both
1961 # set and unset, and it is not ignored.
1962
1963 defaultset = self.msg_flags_common_set
1964 defaultunset = self.msg_flags_common_unset
1965
1966 if eor:
1967 defaultset |= self.msg_flags_eor_indicator
1968 defaultunset |= self.msg_flags_non_eor_indicator
1969 elif eor is not None:
1970 defaultset |= self.msg_flags_non_eor_indicator
1971 defaultunset |= self.msg_flags_eor_indicator
1972
1973 # Function arguments override defaults
1974 defaultset &= ~checkunset
1975 defaultunset &= ~checkset
1976
1977 # Merge arguments with remaining defaults, and check for conflicts
1978 checkset |= defaultset
1979 checkunset |= defaultunset
1980 inboth = checkset & checkunset & ~ignore
1981 if inboth:
1982 raise Exception("contradictory set, unset requirements for flags "
1983 "{0:#x}".format(inboth))
1984
1985 # Compare with given msg_flags value
1986 mask = (checkset | checkunset) & ~ignore
1987 self.assertEqual(flags & mask, checkset & mask)
1988
1989
1990class RecvmsgIntoMixin(SendrecvmsgBase):
1991 # Mixin to implement doRecvmsg() using recvmsg_into().
1992
1993 def doRecvmsg(self, sock, bufsize, *args):
1994 buf = bytearray(bufsize)
1995 result = sock.recvmsg_into([buf], *args)
1996 self.registerRecvmsgResult(result)
1997 self.assertGreaterEqual(result[0], 0)
1998 self.assertLessEqual(result[0], bufsize)
1999 return (bytes(buf[:result[0]]),) + result[1:]
2000
2001
2002class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2003 # Defines flags to be checked in msg_flags for datagram sockets.
2004
2005 @property
2006 def msg_flags_non_eor_indicator(self):
2007 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2008
2009
2010class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2011 # Defines flags to be checked in msg_flags for SCTP sockets.
2012
2013 @property
2014 def msg_flags_eor_indicator(self):
2015 return super().msg_flags_eor_indicator | socket.MSG_EOR
2016
2017
2018class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2019 # Base class for tests on connectionless-mode sockets. Users must
2020 # supply sockets on attributes cli and serv to be mapped to
2021 # cli_sock and serv_sock respectively.
2022
2023 @property
2024 def serv_sock(self):
2025 return self.serv
2026
2027 @property
2028 def cli_sock(self):
2029 return self.cli
2030
2031 @property
2032 def sendmsg_to_server_defaults(self):
2033 return ([], [], 0, self.serv_addr)
2034
2035 def sendToServer(self, msg):
2036 return self.cli_sock.sendto(msg, self.serv_addr)
2037
2038
2039class SendrecvmsgConnectedBase(SendrecvmsgBase):
2040 # Base class for tests on connected sockets. Users must supply
2041 # sockets on attributes serv_conn and cli_conn (representing the
2042 # connections *to* the server and the client), to be mapped to
2043 # cli_sock and serv_sock respectively.
2044
2045 @property
2046 def serv_sock(self):
2047 return self.cli_conn
2048
2049 @property
2050 def cli_sock(self):
2051 return self.serv_conn
2052
2053 def checkRecvmsgAddress(self, addr1, addr2):
2054 # Address is currently "unspecified" for a connected socket,
2055 # so we don't examine it
2056 pass
2057
2058
2059class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2060 # Base class to set a timeout on server's socket.
2061
2062 def setUp(self):
2063 super().setUp()
2064 self.serv_sock.settimeout(self.fail_timeout)
2065
2066
2067class SendmsgTests(SendrecvmsgServerTimeoutBase):
2068 # Tests for sendmsg() which can use any socket type and do not
2069 # involve recvmsg() or recvmsg_into().
2070
2071 def testSendmsg(self):
2072 # Send a simple message with sendmsg().
2073 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2074
2075 def _testSendmsg(self):
2076 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2077
2078 def testSendmsgDataGenerator(self):
2079 # Send from buffer obtained from a generator (not a sequence).
2080 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2081
2082 def _testSendmsgDataGenerator(self):
2083 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2084 len(MSG))
2085
2086 def testSendmsgAncillaryGenerator(self):
2087 # Gather (empty) ancillary data from a generator.
2088 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2089
2090 def _testSendmsgAncillaryGenerator(self):
2091 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2092 len(MSG))
2093
2094 def testSendmsgArray(self):
2095 # Send data from an array instead of the usual bytes object.
2096 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2097
2098 def _testSendmsgArray(self):
2099 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2100 len(MSG))
2101
2102 def testSendmsgGather(self):
2103 # Send message data from more than one buffer (gather write).
2104 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2105
2106 def _testSendmsgGather(self):
2107 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2108
2109 def testSendmsgBadArgs(self):
2110 # Check that sendmsg() rejects invalid arguments.
2111 self.assertEqual(self.serv_sock.recv(1000), b"done")
2112
2113 def _testSendmsgBadArgs(self):
2114 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2115 self.assertRaises(TypeError, self.sendmsgToServer,
2116 b"not in an iterable")
2117 self.assertRaises(TypeError, self.sendmsgToServer,
2118 object())
2119 self.assertRaises(TypeError, self.sendmsgToServer,
2120 [object()])
2121 self.assertRaises(TypeError, self.sendmsgToServer,
2122 [MSG, object()])
2123 self.assertRaises(TypeError, self.sendmsgToServer,
2124 [MSG], object())
2125 self.assertRaises(TypeError, self.sendmsgToServer,
2126 [MSG], [], object())
2127 self.assertRaises(TypeError, self.sendmsgToServer,
2128 [MSG], [], 0, object())
2129 self.sendToServer(b"done")
2130
2131 def testSendmsgBadCmsg(self):
2132 # Check that invalid ancillary data items are rejected.
2133 self.assertEqual(self.serv_sock.recv(1000), b"done")
2134
2135 def _testSendmsgBadCmsg(self):
2136 self.assertRaises(TypeError, self.sendmsgToServer,
2137 [MSG], [object()])
2138 self.assertRaises(TypeError, self.sendmsgToServer,
2139 [MSG], [(object(), 0, b"data")])
2140 self.assertRaises(TypeError, self.sendmsgToServer,
2141 [MSG], [(0, object(), b"data")])
2142 self.assertRaises(TypeError, self.sendmsgToServer,
2143 [MSG], [(0, 0, object())])
2144 self.assertRaises(TypeError, self.sendmsgToServer,
2145 [MSG], [(0, 0)])
2146 self.assertRaises(TypeError, self.sendmsgToServer,
2147 [MSG], [(0, 0, b"data", 42)])
2148 self.sendToServer(b"done")
2149
2150 @requireAttrs(socket, "CMSG_SPACE")
2151 def testSendmsgBadMultiCmsg(self):
2152 # Check that invalid ancillary data items are rejected when
2153 # more than one item is present.
2154 self.assertEqual(self.serv_sock.recv(1000), b"done")
2155
2156 @testSendmsgBadMultiCmsg.client_skip
2157 def _testSendmsgBadMultiCmsg(self):
2158 self.assertRaises(TypeError, self.sendmsgToServer,
2159 [MSG], [0, 0, b""])
2160 self.assertRaises(TypeError, self.sendmsgToServer,
2161 [MSG], [(0, 0, b""), object()])
2162 self.sendToServer(b"done")
2163
2164 def testSendmsgExcessCmsgReject(self):
2165 # Check that sendmsg() rejects excess ancillary data items
2166 # when the number that can be sent is limited.
2167 self.assertEqual(self.serv_sock.recv(1000), b"done")
2168
2169 def _testSendmsgExcessCmsgReject(self):
2170 if not hasattr(socket, "CMSG_SPACE"):
2171 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002172 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002173 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2174 self.assertIsNone(cm.exception.errno)
2175 self.sendToServer(b"done")
2176
2177 def testSendmsgAfterClose(self):
2178 # Check that sendmsg() fails on a closed socket.
2179 pass
2180
2181 def _testSendmsgAfterClose(self):
2182 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002183 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002184
2185
2186class SendmsgStreamTests(SendmsgTests):
2187 # Tests for sendmsg() which require a stream socket and do not
2188 # involve recvmsg() or recvmsg_into().
2189
2190 def testSendmsgExplicitNoneAddr(self):
2191 # Check that peer address can be specified as None.
2192 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2193
2194 def _testSendmsgExplicitNoneAddr(self):
2195 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2196
2197 def testSendmsgTimeout(self):
2198 # Check that timeout works with sendmsg().
2199 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2200 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2201
2202 def _testSendmsgTimeout(self):
2203 try:
2204 self.cli_sock.settimeout(0.03)
2205 with self.assertRaises(socket.timeout):
2206 while True:
2207 self.sendmsgToServer([b"a"*512])
2208 finally:
2209 self.misc_event.set()
2210
2211 # XXX: would be nice to have more tests for sendmsg flags argument.
2212
2213 # Linux supports MSG_DONTWAIT when sending, but in general, it
2214 # only works when receiving. Could add other platforms if they
2215 # support it too.
2216 @skipWithClientIf(sys.platform not in {"linux2"},
2217 "MSG_DONTWAIT not known to work on this platform when "
2218 "sending")
2219 def testSendmsgDontWait(self):
2220 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2221 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2222 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2223
2224 @testSendmsgDontWait.client_skip
2225 def _testSendmsgDontWait(self):
2226 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002227 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002228 while True:
2229 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2230 self.assertIn(cm.exception.errno,
2231 (errno.EAGAIN, errno.EWOULDBLOCK))
2232 finally:
2233 self.misc_event.set()
2234
2235
2236class SendmsgConnectionlessTests(SendmsgTests):
2237 # Tests for sendmsg() which require a connectionless-mode
2238 # (e.g. datagram) socket, and do not involve recvmsg() or
2239 # recvmsg_into().
2240
2241 def testSendmsgNoDestAddr(self):
2242 # Check that sendmsg() fails when no destination address is
2243 # given for unconnected socket.
2244 pass
2245
2246 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002247 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002248 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002249 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002250 [MSG], [], 0, None)
2251
2252
2253class RecvmsgGenericTests(SendrecvmsgBase):
2254 # Tests for recvmsg() which can also be emulated using
2255 # recvmsg_into(), and can use any socket type.
2256
2257 def testRecvmsg(self):
2258 # Receive a simple message with recvmsg[_into]().
2259 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2260 self.assertEqual(msg, MSG)
2261 self.checkRecvmsgAddress(addr, self.cli_addr)
2262 self.assertEqual(ancdata, [])
2263 self.checkFlags(flags, eor=True)
2264
2265 def _testRecvmsg(self):
2266 self.sendToServer(MSG)
2267
2268 def testRecvmsgExplicitDefaults(self):
2269 # Test recvmsg[_into]() with default arguments provided explicitly.
2270 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2271 len(MSG), 0, 0)
2272 self.assertEqual(msg, MSG)
2273 self.checkRecvmsgAddress(addr, self.cli_addr)
2274 self.assertEqual(ancdata, [])
2275 self.checkFlags(flags, eor=True)
2276
2277 def _testRecvmsgExplicitDefaults(self):
2278 self.sendToServer(MSG)
2279
2280 def testRecvmsgShorter(self):
2281 # Receive a message smaller than buffer.
2282 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2283 len(MSG) + 42)
2284 self.assertEqual(msg, MSG)
2285 self.checkRecvmsgAddress(addr, self.cli_addr)
2286 self.assertEqual(ancdata, [])
2287 self.checkFlags(flags, eor=True)
2288
2289 def _testRecvmsgShorter(self):
2290 self.sendToServer(MSG)
2291
Charles-François Natali8619cd72011-10-03 19:43:15 +02002292 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2293 # datagram is received (issue #13001).
2294 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002295 def testRecvmsgTrunc(self):
2296 # Receive part of message, check for truncation indicators.
2297 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2298 len(MSG) - 3)
2299 self.assertEqual(msg, MSG[:-3])
2300 self.checkRecvmsgAddress(addr, self.cli_addr)
2301 self.assertEqual(ancdata, [])
2302 self.checkFlags(flags, eor=False)
2303
Charles-François Natali8619cd72011-10-03 19:43:15 +02002304 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002305 def _testRecvmsgTrunc(self):
2306 self.sendToServer(MSG)
2307
2308 def testRecvmsgShortAncillaryBuf(self):
2309 # Test ancillary data buffer too small to hold any ancillary data.
2310 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2311 len(MSG), 1)
2312 self.assertEqual(msg, MSG)
2313 self.checkRecvmsgAddress(addr, self.cli_addr)
2314 self.assertEqual(ancdata, [])
2315 self.checkFlags(flags, eor=True)
2316
2317 def _testRecvmsgShortAncillaryBuf(self):
2318 self.sendToServer(MSG)
2319
2320 def testRecvmsgLongAncillaryBuf(self):
2321 # Test large ancillary data buffer.
2322 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2323 len(MSG), 10240)
2324 self.assertEqual(msg, MSG)
2325 self.checkRecvmsgAddress(addr, self.cli_addr)
2326 self.assertEqual(ancdata, [])
2327 self.checkFlags(flags, eor=True)
2328
2329 def _testRecvmsgLongAncillaryBuf(self):
2330 self.sendToServer(MSG)
2331
2332 def testRecvmsgAfterClose(self):
2333 # Check that recvmsg[_into]() fails on a closed socket.
2334 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002335 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002336
2337 def _testRecvmsgAfterClose(self):
2338 pass
2339
2340 def testRecvmsgTimeout(self):
2341 # Check that timeout works.
2342 try:
2343 self.serv_sock.settimeout(0.03)
2344 self.assertRaises(socket.timeout,
2345 self.doRecvmsg, self.serv_sock, len(MSG))
2346 finally:
2347 self.misc_event.set()
2348
2349 def _testRecvmsgTimeout(self):
2350 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2351
2352 @requireAttrs(socket, "MSG_PEEK")
2353 def testRecvmsgPeek(self):
2354 # Check that MSG_PEEK in flags enables examination of pending
2355 # data without consuming it.
2356
2357 # Receive part of data with MSG_PEEK.
2358 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2359 len(MSG) - 3, 0,
2360 socket.MSG_PEEK)
2361 self.assertEqual(msg, MSG[:-3])
2362 self.checkRecvmsgAddress(addr, self.cli_addr)
2363 self.assertEqual(ancdata, [])
2364 # Ignoring MSG_TRUNC here (so this test is the same for stream
2365 # and datagram sockets). Some wording in POSIX seems to
2366 # suggest that it needn't be set when peeking, but that may
2367 # just be a slip.
2368 self.checkFlags(flags, eor=False,
2369 ignore=getattr(socket, "MSG_TRUNC", 0))
2370
2371 # Receive all data with MSG_PEEK.
2372 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2373 len(MSG), 0,
2374 socket.MSG_PEEK)
2375 self.assertEqual(msg, MSG)
2376 self.checkRecvmsgAddress(addr, self.cli_addr)
2377 self.assertEqual(ancdata, [])
2378 self.checkFlags(flags, eor=True)
2379
2380 # Check that the same data can still be received normally.
2381 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2382 self.assertEqual(msg, MSG)
2383 self.checkRecvmsgAddress(addr, self.cli_addr)
2384 self.assertEqual(ancdata, [])
2385 self.checkFlags(flags, eor=True)
2386
2387 @testRecvmsgPeek.client_skip
2388 def _testRecvmsgPeek(self):
2389 self.sendToServer(MSG)
2390
2391 @requireAttrs(socket.socket, "sendmsg")
2392 def testRecvmsgFromSendmsg(self):
2393 # Test receiving with recvmsg[_into]() when message is sent
2394 # using sendmsg().
2395 self.serv_sock.settimeout(self.fail_timeout)
2396 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2397 self.assertEqual(msg, MSG)
2398 self.checkRecvmsgAddress(addr, self.cli_addr)
2399 self.assertEqual(ancdata, [])
2400 self.checkFlags(flags, eor=True)
2401
2402 @testRecvmsgFromSendmsg.client_skip
2403 def _testRecvmsgFromSendmsg(self):
2404 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2405
2406
2407class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2408 # Tests which require a stream socket and can use either recvmsg()
2409 # or recvmsg_into().
2410
2411 def testRecvmsgEOF(self):
2412 # Receive end-of-stream indicator (b"", peer socket closed).
2413 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2414 self.assertEqual(msg, b"")
2415 self.checkRecvmsgAddress(addr, self.cli_addr)
2416 self.assertEqual(ancdata, [])
2417 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2418
2419 def _testRecvmsgEOF(self):
2420 self.cli_sock.close()
2421
2422 def testRecvmsgOverflow(self):
2423 # Receive a message in more than one chunk.
2424 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2425 len(MSG) - 3)
2426 self.checkRecvmsgAddress(addr, self.cli_addr)
2427 self.assertEqual(ancdata, [])
2428 self.checkFlags(flags, eor=False)
2429
2430 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2431 self.checkRecvmsgAddress(addr, self.cli_addr)
2432 self.assertEqual(ancdata, [])
2433 self.checkFlags(flags, eor=True)
2434
2435 msg = seg1 + seg2
2436 self.assertEqual(msg, MSG)
2437
2438 def _testRecvmsgOverflow(self):
2439 self.sendToServer(MSG)
2440
2441
2442class RecvmsgTests(RecvmsgGenericTests):
2443 # Tests for recvmsg() which can use any socket type.
2444
2445 def testRecvmsgBadArgs(self):
2446 # Check that recvmsg() rejects invalid arguments.
2447 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2448 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2449 -1, 0, 0)
2450 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2451 len(MSG), -1, 0)
2452 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2453 [bytearray(10)], 0, 0)
2454 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2455 object(), 0, 0)
2456 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2457 len(MSG), object(), 0)
2458 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2459 len(MSG), 0, object())
2460
2461 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2462 self.assertEqual(msg, MSG)
2463 self.checkRecvmsgAddress(addr, self.cli_addr)
2464 self.assertEqual(ancdata, [])
2465 self.checkFlags(flags, eor=True)
2466
2467 def _testRecvmsgBadArgs(self):
2468 self.sendToServer(MSG)
2469
2470
2471class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2472 # Tests for recvmsg_into() which can use any socket type.
2473
2474 def testRecvmsgIntoBadArgs(self):
2475 # Check that recvmsg_into() rejects invalid arguments.
2476 buf = bytearray(len(MSG))
2477 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2478 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2479 len(MSG), 0, 0)
2480 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2481 buf, 0, 0)
2482 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2483 [object()], 0, 0)
2484 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2485 [b"I'm not writable"], 0, 0)
2486 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2487 [buf, object()], 0, 0)
2488 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2489 [buf], -1, 0)
2490 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2491 [buf], object(), 0)
2492 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2493 [buf], 0, object())
2494
2495 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2496 self.assertEqual(nbytes, len(MSG))
2497 self.assertEqual(buf, bytearray(MSG))
2498 self.checkRecvmsgAddress(addr, self.cli_addr)
2499 self.assertEqual(ancdata, [])
2500 self.checkFlags(flags, eor=True)
2501
2502 def _testRecvmsgIntoBadArgs(self):
2503 self.sendToServer(MSG)
2504
2505 def testRecvmsgIntoGenerator(self):
2506 # Receive into buffer obtained from a generator (not a sequence).
2507 buf = bytearray(len(MSG))
2508 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2509 (o for o in [buf]))
2510 self.assertEqual(nbytes, len(MSG))
2511 self.assertEqual(buf, bytearray(MSG))
2512 self.checkRecvmsgAddress(addr, self.cli_addr)
2513 self.assertEqual(ancdata, [])
2514 self.checkFlags(flags, eor=True)
2515
2516 def _testRecvmsgIntoGenerator(self):
2517 self.sendToServer(MSG)
2518
2519 def testRecvmsgIntoArray(self):
2520 # Receive into an array rather than the usual bytearray.
2521 buf = array.array("B", [0] * len(MSG))
2522 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2523 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002524 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002525 self.checkRecvmsgAddress(addr, self.cli_addr)
2526 self.assertEqual(ancdata, [])
2527 self.checkFlags(flags, eor=True)
2528
2529 def _testRecvmsgIntoArray(self):
2530 self.sendToServer(MSG)
2531
2532 def testRecvmsgIntoScatter(self):
2533 # Receive into multiple buffers (scatter write).
2534 b1 = bytearray(b"----")
2535 b2 = bytearray(b"0123456789")
2536 b3 = bytearray(b"--------------")
2537 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2538 [b1, memoryview(b2)[2:9], b3])
2539 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2540 self.assertEqual(b1, bytearray(b"Mary"))
2541 self.assertEqual(b2, bytearray(b"01 had a 9"))
2542 self.assertEqual(b3, bytearray(b"little lamb---"))
2543 self.checkRecvmsgAddress(addr, self.cli_addr)
2544 self.assertEqual(ancdata, [])
2545 self.checkFlags(flags, eor=True)
2546
2547 def _testRecvmsgIntoScatter(self):
2548 self.sendToServer(b"Mary had a little lamb")
2549
2550
2551class CmsgMacroTests(unittest.TestCase):
2552 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2553 # assumptions used by sendmsg() and recvmsg[_into](), which share
2554 # code with these functions.
2555
2556 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002557 try:
2558 import _testcapi
2559 except ImportError:
2560 socklen_t_limit = 0x7fffffff
2561 else:
2562 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002563
2564 @requireAttrs(socket, "CMSG_LEN")
2565 def testCMSG_LEN(self):
2566 # Test CMSG_LEN() with various valid and invalid values,
2567 # checking the assumptions used by recvmsg() and sendmsg().
2568 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2569 values = list(range(257)) + list(range(toobig - 257, toobig))
2570
2571 # struct cmsghdr has at least three members, two of which are ints
2572 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2573 for n in values:
2574 ret = socket.CMSG_LEN(n)
2575 # This is how recvmsg() calculates the data size
2576 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2577 self.assertLessEqual(ret, self.socklen_t_limit)
2578
2579 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2580 # sendmsg() shares code with these functions, and requires
2581 # that it reject values over the limit.
2582 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2583 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2584
2585 @requireAttrs(socket, "CMSG_SPACE")
2586 def testCMSG_SPACE(self):
2587 # Test CMSG_SPACE() with various valid and invalid values,
2588 # checking the assumptions used by sendmsg().
2589 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2590 values = list(range(257)) + list(range(toobig - 257, toobig))
2591
2592 last = socket.CMSG_SPACE(0)
2593 # struct cmsghdr has at least three members, two of which are ints
2594 self.assertGreater(last, array.array("i").itemsize * 2)
2595 for n in values:
2596 ret = socket.CMSG_SPACE(n)
2597 self.assertGreaterEqual(ret, last)
2598 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2599 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2600 self.assertLessEqual(ret, self.socklen_t_limit)
2601 last = ret
2602
2603 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2604 # sendmsg() shares code with these functions, and requires
2605 # that it reject values over the limit.
2606 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2607 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2608
2609
2610class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2611 # Tests for file descriptor passing on Unix-domain sockets.
2612
2613 # Invalid file descriptor value that's unlikely to evaluate to a
2614 # real FD even if one of its bytes is replaced with a different
2615 # value (which shouldn't actually happen).
2616 badfd = -0x5555
2617
2618 def newFDs(self, n):
2619 # Return a list of n file descriptors for newly-created files
2620 # containing their list indices as ASCII numbers.
2621 fds = []
2622 for i in range(n):
2623 fd, path = tempfile.mkstemp()
2624 self.addCleanup(os.unlink, path)
2625 self.addCleanup(os.close, fd)
2626 os.write(fd, str(i).encode())
2627 fds.append(fd)
2628 return fds
2629
2630 def checkFDs(self, fds):
2631 # Check that the file descriptors in the given list contain
2632 # their correct list indices as ASCII numbers.
2633 for n, fd in enumerate(fds):
2634 os.lseek(fd, 0, os.SEEK_SET)
2635 self.assertEqual(os.read(fd, 1024), str(n).encode())
2636
2637 def registerRecvmsgResult(self, result):
2638 self.addCleanup(self.closeRecvmsgFDs, result)
2639
2640 def closeRecvmsgFDs(self, recvmsg_result):
2641 # Close all file descriptors specified in the ancillary data
2642 # of the given return value from recvmsg() or recvmsg_into().
2643 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2644 if (cmsg_level == socket.SOL_SOCKET and
2645 cmsg_type == socket.SCM_RIGHTS):
2646 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002647 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002648 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2649 for fd in fds:
2650 os.close(fd)
2651
2652 def createAndSendFDs(self, n):
2653 # Send n new file descriptors created by newFDs() to the
2654 # server, with the constant MSG as the non-ancillary data.
2655 self.assertEqual(
2656 self.sendmsgToServer([MSG],
2657 [(socket.SOL_SOCKET,
2658 socket.SCM_RIGHTS,
2659 array.array("i", self.newFDs(n)))]),
2660 len(MSG))
2661
2662 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2663 # Check that constant MSG was received with numfds file
2664 # descriptors in a maximum of maxcmsgs control messages (which
2665 # must contain only complete integers). By default, check
2666 # that MSG_CTRUNC is unset, but ignore any flags in
2667 # ignoreflags.
2668 msg, ancdata, flags, addr = result
2669 self.assertEqual(msg, MSG)
2670 self.checkRecvmsgAddress(addr, self.cli_addr)
2671 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2672 ignore=ignoreflags)
2673
2674 self.assertIsInstance(ancdata, list)
2675 self.assertLessEqual(len(ancdata), maxcmsgs)
2676 fds = array.array("i")
2677 for item in ancdata:
2678 self.assertIsInstance(item, tuple)
2679 cmsg_level, cmsg_type, cmsg_data = item
2680 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2681 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2682 self.assertIsInstance(cmsg_data, bytes)
2683 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002684 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002685
2686 self.assertEqual(len(fds), numfds)
2687 self.checkFDs(fds)
2688
2689 def testFDPassSimple(self):
2690 # Pass a single FD (array read from bytes object).
2691 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2692 len(MSG), 10240))
2693
2694 def _testFDPassSimple(self):
2695 self.assertEqual(
2696 self.sendmsgToServer(
2697 [MSG],
2698 [(socket.SOL_SOCKET,
2699 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002700 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002701 len(MSG))
2702
2703 def testMultipleFDPass(self):
2704 # Pass multiple FDs in a single array.
2705 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2706 len(MSG), 10240))
2707
2708 def _testMultipleFDPass(self):
2709 self.createAndSendFDs(4)
2710
2711 @requireAttrs(socket, "CMSG_SPACE")
2712 def testFDPassCMSG_SPACE(self):
2713 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2714 self.checkRecvmsgFDs(
2715 4, self.doRecvmsg(self.serv_sock, len(MSG),
2716 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2717
2718 @testFDPassCMSG_SPACE.client_skip
2719 def _testFDPassCMSG_SPACE(self):
2720 self.createAndSendFDs(4)
2721
2722 def testFDPassCMSG_LEN(self):
2723 # Test using CMSG_LEN() to calculate ancillary buffer size.
2724 self.checkRecvmsgFDs(1,
2725 self.doRecvmsg(self.serv_sock, len(MSG),
2726 socket.CMSG_LEN(4 * SIZEOF_INT)),
2727 # RFC 3542 says implementations may set
2728 # MSG_CTRUNC if there isn't enough space
2729 # for trailing padding.
2730 ignoreflags=socket.MSG_CTRUNC)
2731
2732 def _testFDPassCMSG_LEN(self):
2733 self.createAndSendFDs(1)
2734
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002735 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002736 @requireAttrs(socket, "CMSG_SPACE")
2737 def testFDPassSeparate(self):
2738 # Pass two FDs in two separate arrays. Arrays may be combined
2739 # into a single control message by the OS.
2740 self.checkRecvmsgFDs(2,
2741 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2742 maxcmsgs=2)
2743
2744 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002745 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002746 def _testFDPassSeparate(self):
2747 fd0, fd1 = self.newFDs(2)
2748 self.assertEqual(
2749 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2750 socket.SCM_RIGHTS,
2751 array.array("i", [fd0])),
2752 (socket.SOL_SOCKET,
2753 socket.SCM_RIGHTS,
2754 array.array("i", [fd1]))]),
2755 len(MSG))
2756
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002757 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002758 @requireAttrs(socket, "CMSG_SPACE")
2759 def testFDPassSeparateMinSpace(self):
2760 # Pass two FDs in two separate arrays, receiving them into the
2761 # minimum space for two arrays.
2762 self.checkRecvmsgFDs(2,
2763 self.doRecvmsg(self.serv_sock, len(MSG),
2764 socket.CMSG_SPACE(SIZEOF_INT) +
2765 socket.CMSG_LEN(SIZEOF_INT)),
2766 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2767
2768 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002769 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002770 def _testFDPassSeparateMinSpace(self):
2771 fd0, fd1 = self.newFDs(2)
2772 self.assertEqual(
2773 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2774 socket.SCM_RIGHTS,
2775 array.array("i", [fd0])),
2776 (socket.SOL_SOCKET,
2777 socket.SCM_RIGHTS,
2778 array.array("i", [fd1]))]),
2779 len(MSG))
2780
2781 def sendAncillaryIfPossible(self, msg, ancdata):
2782 # Try to send msg and ancdata to server, but if the system
2783 # call fails, just send msg with no ancillary data.
2784 try:
2785 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002786 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002787 # Check that it was the system call that failed
2788 self.assertIsInstance(e.errno, int)
2789 nbytes = self.sendmsgToServer([msg])
2790 self.assertEqual(nbytes, len(msg))
2791
2792 def testFDPassEmpty(self):
2793 # Try to pass an empty FD array. Can receive either no array
2794 # or an empty array.
2795 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2796 len(MSG), 10240),
2797 ignoreflags=socket.MSG_CTRUNC)
2798
2799 def _testFDPassEmpty(self):
2800 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2801 socket.SCM_RIGHTS,
2802 b"")])
2803
2804 def testFDPassPartialInt(self):
2805 # Try to pass a truncated FD array.
2806 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2807 len(MSG), 10240)
2808 self.assertEqual(msg, MSG)
2809 self.checkRecvmsgAddress(addr, self.cli_addr)
2810 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2811 self.assertLessEqual(len(ancdata), 1)
2812 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2813 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2814 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2815 self.assertLess(len(cmsg_data), SIZEOF_INT)
2816
2817 def _testFDPassPartialInt(self):
2818 self.sendAncillaryIfPossible(
2819 MSG,
2820 [(socket.SOL_SOCKET,
2821 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002822 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002823
2824 @requireAttrs(socket, "CMSG_SPACE")
2825 def testFDPassPartialIntInMiddle(self):
2826 # Try to pass two FD arrays, the first of which is truncated.
2827 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2828 len(MSG), 10240)
2829 self.assertEqual(msg, MSG)
2830 self.checkRecvmsgAddress(addr, self.cli_addr)
2831 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2832 self.assertLessEqual(len(ancdata), 2)
2833 fds = array.array("i")
2834 # Arrays may have been combined in a single control message
2835 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2836 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2837 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002838 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002839 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2840 self.assertLessEqual(len(fds), 2)
2841 self.checkFDs(fds)
2842
2843 @testFDPassPartialIntInMiddle.client_skip
2844 def _testFDPassPartialIntInMiddle(self):
2845 fd0, fd1 = self.newFDs(2)
2846 self.sendAncillaryIfPossible(
2847 MSG,
2848 [(socket.SOL_SOCKET,
2849 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002850 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002851 (socket.SOL_SOCKET,
2852 socket.SCM_RIGHTS,
2853 array.array("i", [fd1]))])
2854
2855 def checkTruncatedHeader(self, result, ignoreflags=0):
2856 # Check that no ancillary data items are returned when data is
2857 # truncated inside the cmsghdr structure.
2858 msg, ancdata, flags, addr = result
2859 self.assertEqual(msg, MSG)
2860 self.checkRecvmsgAddress(addr, self.cli_addr)
2861 self.assertEqual(ancdata, [])
2862 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2863 ignore=ignoreflags)
2864
2865 def testCmsgTruncNoBufSize(self):
2866 # Check that no ancillary data is received when no buffer size
2867 # is specified.
2868 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2869 # BSD seems to set MSG_CTRUNC only
2870 # if an item has been partially
2871 # received.
2872 ignoreflags=socket.MSG_CTRUNC)
2873
2874 def _testCmsgTruncNoBufSize(self):
2875 self.createAndSendFDs(1)
2876
2877 def testCmsgTrunc0(self):
2878 # Check that no ancillary data is received when buffer size is 0.
2879 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2880 ignoreflags=socket.MSG_CTRUNC)
2881
2882 def _testCmsgTrunc0(self):
2883 self.createAndSendFDs(1)
2884
2885 # Check that no ancillary data is returned for various non-zero
2886 # (but still too small) buffer sizes.
2887
2888 def testCmsgTrunc1(self):
2889 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2890
2891 def _testCmsgTrunc1(self):
2892 self.createAndSendFDs(1)
2893
2894 def testCmsgTrunc2Int(self):
2895 # The cmsghdr structure has at least three members, two of
2896 # which are ints, so we still shouldn't see any ancillary
2897 # data.
2898 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2899 SIZEOF_INT * 2))
2900
2901 def _testCmsgTrunc2Int(self):
2902 self.createAndSendFDs(1)
2903
2904 def testCmsgTruncLen0Minus1(self):
2905 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2906 socket.CMSG_LEN(0) - 1))
2907
2908 def _testCmsgTruncLen0Minus1(self):
2909 self.createAndSendFDs(1)
2910
2911 # The following tests try to truncate the control message in the
2912 # middle of the FD array.
2913
2914 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2915 # Check that file descriptor data is truncated to between
2916 # mindata and maxdata bytes when received with buffer size
2917 # ancbuf, and that any complete file descriptor numbers are
2918 # valid.
2919 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2920 len(MSG), ancbuf)
2921 self.assertEqual(msg, MSG)
2922 self.checkRecvmsgAddress(addr, self.cli_addr)
2923 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2924
2925 if mindata == 0 and ancdata == []:
2926 return
2927 self.assertEqual(len(ancdata), 1)
2928 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2929 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2930 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2931 self.assertGreaterEqual(len(cmsg_data), mindata)
2932 self.assertLessEqual(len(cmsg_data), maxdata)
2933 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002934 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002935 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2936 self.checkFDs(fds)
2937
2938 def testCmsgTruncLen0(self):
2939 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2940
2941 def _testCmsgTruncLen0(self):
2942 self.createAndSendFDs(1)
2943
2944 def testCmsgTruncLen0Plus1(self):
2945 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2946
2947 def _testCmsgTruncLen0Plus1(self):
2948 self.createAndSendFDs(2)
2949
2950 def testCmsgTruncLen1(self):
2951 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2952 maxdata=SIZEOF_INT)
2953
2954 def _testCmsgTruncLen1(self):
2955 self.createAndSendFDs(2)
2956
2957 def testCmsgTruncLen2Minus1(self):
2958 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2959 maxdata=(2 * SIZEOF_INT) - 1)
2960
2961 def _testCmsgTruncLen2Minus1(self):
2962 self.createAndSendFDs(2)
2963
2964
2965class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2966 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2967 # features of the RFC 3542 Advanced Sockets API for IPv6.
2968 # Currently we can only handle certain data items (e.g. traffic
2969 # class, hop limit, MTU discovery and fragmentation settings)
2970 # without resorting to unportable means such as the struct module,
2971 # but the tests here are aimed at testing the ancillary data
2972 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2973 # itself.
2974
2975 # Test value to use when setting hop limit of packet
2976 hop_limit = 2
2977
2978 # Test value to use when setting traffic class of packet.
2979 # -1 means "use kernel default".
2980 traffic_class = -1
2981
2982 def ancillaryMapping(self, ancdata):
2983 # Given ancillary data list ancdata, return a mapping from
2984 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2985 # Check that no (level, type) pair appears more than once.
2986 d = {}
2987 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2988 self.assertNotIn((cmsg_level, cmsg_type), d)
2989 d[(cmsg_level, cmsg_type)] = cmsg_data
2990 return d
2991
2992 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2993 # Receive hop limit into ancbufsize bytes of ancillary data
2994 # space. Check that data is MSG, ancillary data is not
2995 # truncated (but ignore any flags in ignoreflags), and hop
2996 # limit is between 0 and maxhop inclusive.
2997 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2998 socket.IPV6_RECVHOPLIMIT, 1)
2999 self.misc_event.set()
3000 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3001 len(MSG), ancbufsize)
3002
3003 self.assertEqual(msg, MSG)
3004 self.checkRecvmsgAddress(addr, self.cli_addr)
3005 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3006 ignore=ignoreflags)
3007
3008 self.assertEqual(len(ancdata), 1)
3009 self.assertIsInstance(ancdata[0], tuple)
3010 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3011 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3012 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3013 self.assertIsInstance(cmsg_data, bytes)
3014 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3015 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003016 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003017 self.assertGreaterEqual(a[0], 0)
3018 self.assertLessEqual(a[0], maxhop)
3019
3020 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3021 def testRecvHopLimit(self):
3022 # Test receiving the packet hop limit as ancillary data.
3023 self.checkHopLimit(ancbufsize=10240)
3024
3025 @testRecvHopLimit.client_skip
3026 def _testRecvHopLimit(self):
3027 # Need to wait until server has asked to receive ancillary
3028 # data, as implementations are not required to buffer it
3029 # otherwise.
3030 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3031 self.sendToServer(MSG)
3032
3033 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3034 def testRecvHopLimitCMSG_SPACE(self):
3035 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3036 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3037
3038 @testRecvHopLimitCMSG_SPACE.client_skip
3039 def _testRecvHopLimitCMSG_SPACE(self):
3040 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3041 self.sendToServer(MSG)
3042
3043 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3044 # 3542 says portable applications must provide space for trailing
3045 # padding. Implementations may set MSG_CTRUNC if there isn't
3046 # enough space for the padding.
3047
3048 @requireAttrs(socket.socket, "sendmsg")
3049 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3050 def testSetHopLimit(self):
3051 # Test setting hop limit on outgoing packet and receiving it
3052 # at the other end.
3053 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3054
3055 @testSetHopLimit.client_skip
3056 def _testSetHopLimit(self):
3057 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3058 self.assertEqual(
3059 self.sendmsgToServer([MSG],
3060 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3061 array.array("i", [self.hop_limit]))]),
3062 len(MSG))
3063
3064 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3065 ignoreflags=0):
3066 # Receive traffic class and hop limit into ancbufsize bytes of
3067 # ancillary data space. Check that data is MSG, ancillary
3068 # data is not truncated (but ignore any flags in ignoreflags),
3069 # and traffic class and hop limit are in range (hop limit no
3070 # more than maxhop).
3071 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3072 socket.IPV6_RECVHOPLIMIT, 1)
3073 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3074 socket.IPV6_RECVTCLASS, 1)
3075 self.misc_event.set()
3076 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3077 len(MSG), ancbufsize)
3078
3079 self.assertEqual(msg, MSG)
3080 self.checkRecvmsgAddress(addr, self.cli_addr)
3081 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3082 ignore=ignoreflags)
3083 self.assertEqual(len(ancdata), 2)
3084 ancmap = self.ancillaryMapping(ancdata)
3085
3086 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3087 self.assertEqual(len(tcdata), SIZEOF_INT)
3088 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003089 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003090 self.assertGreaterEqual(a[0], 0)
3091 self.assertLessEqual(a[0], 255)
3092
3093 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3094 self.assertEqual(len(hldata), SIZEOF_INT)
3095 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003096 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003097 self.assertGreaterEqual(a[0], 0)
3098 self.assertLessEqual(a[0], maxhop)
3099
3100 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3101 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3102 def testRecvTrafficClassAndHopLimit(self):
3103 # Test receiving traffic class and hop limit as ancillary data.
3104 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3105
3106 @testRecvTrafficClassAndHopLimit.client_skip
3107 def _testRecvTrafficClassAndHopLimit(self):
3108 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3109 self.sendToServer(MSG)
3110
3111 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3112 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3113 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3114 # Test receiving traffic class and hop limit, using
3115 # CMSG_SPACE() to calculate buffer size.
3116 self.checkTrafficClassAndHopLimit(
3117 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3118
3119 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3120 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3121 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3122 self.sendToServer(MSG)
3123
3124 @requireAttrs(socket.socket, "sendmsg")
3125 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3126 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3127 def testSetTrafficClassAndHopLimit(self):
3128 # Test setting traffic class and hop limit on outgoing packet,
3129 # and receiving them at the other end.
3130 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3131 maxhop=self.hop_limit)
3132
3133 @testSetTrafficClassAndHopLimit.client_skip
3134 def _testSetTrafficClassAndHopLimit(self):
3135 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3136 self.assertEqual(
3137 self.sendmsgToServer([MSG],
3138 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3139 array.array("i", [self.traffic_class])),
3140 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3141 array.array("i", [self.hop_limit]))]),
3142 len(MSG))
3143
3144 @requireAttrs(socket.socket, "sendmsg")
3145 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3146 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3147 def testOddCmsgSize(self):
3148 # Try to send ancillary data with first item one byte too
3149 # long. Fall back to sending with correct size if this fails,
3150 # and check that second item was handled correctly.
3151 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3152 maxhop=self.hop_limit)
3153
3154 @testOddCmsgSize.client_skip
3155 def _testOddCmsgSize(self):
3156 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3157 try:
3158 nbytes = self.sendmsgToServer(
3159 [MSG],
3160 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003161 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003162 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3163 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003164 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003165 self.assertIsInstance(e.errno, int)
3166 nbytes = self.sendmsgToServer(
3167 [MSG],
3168 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3169 array.array("i", [self.traffic_class])),
3170 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3171 array.array("i", [self.hop_limit]))])
3172 self.assertEqual(nbytes, len(MSG))
3173
3174 # Tests for proper handling of truncated ancillary data
3175
3176 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3177 # Receive hop limit into ancbufsize bytes of ancillary data
3178 # space, which should be too small to contain the ancillary
3179 # data header (if ancbufsize is None, pass no second argument
3180 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3181 # (unless included in ignoreflags), and no ancillary data is
3182 # returned.
3183 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3184 socket.IPV6_RECVHOPLIMIT, 1)
3185 self.misc_event.set()
3186 args = () if ancbufsize is None else (ancbufsize,)
3187 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3188 len(MSG), *args)
3189
3190 self.assertEqual(msg, MSG)
3191 self.checkRecvmsgAddress(addr, self.cli_addr)
3192 self.assertEqual(ancdata, [])
3193 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3194 ignore=ignoreflags)
3195
3196 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3197 def testCmsgTruncNoBufSize(self):
3198 # Check that no ancillary data is received when no ancillary
3199 # buffer size is provided.
3200 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3201 # BSD seems to set
3202 # MSG_CTRUNC only if an item
3203 # has been partially
3204 # received.
3205 ignoreflags=socket.MSG_CTRUNC)
3206
3207 @testCmsgTruncNoBufSize.client_skip
3208 def _testCmsgTruncNoBufSize(self):
3209 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3210 self.sendToServer(MSG)
3211
3212 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3213 def testSingleCmsgTrunc0(self):
3214 # Check that no ancillary data is received when ancillary
3215 # buffer size is zero.
3216 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3217 ignoreflags=socket.MSG_CTRUNC)
3218
3219 @testSingleCmsgTrunc0.client_skip
3220 def _testSingleCmsgTrunc0(self):
3221 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3222 self.sendToServer(MSG)
3223
3224 # Check that no ancillary data is returned for various non-zero
3225 # (but still too small) buffer sizes.
3226
3227 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3228 def testSingleCmsgTrunc1(self):
3229 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3230
3231 @testSingleCmsgTrunc1.client_skip
3232 def _testSingleCmsgTrunc1(self):
3233 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3234 self.sendToServer(MSG)
3235
3236 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3237 def testSingleCmsgTrunc2Int(self):
3238 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3239
3240 @testSingleCmsgTrunc2Int.client_skip
3241 def _testSingleCmsgTrunc2Int(self):
3242 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3243 self.sendToServer(MSG)
3244
3245 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3246 def testSingleCmsgTruncLen0Minus1(self):
3247 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3248
3249 @testSingleCmsgTruncLen0Minus1.client_skip
3250 def _testSingleCmsgTruncLen0Minus1(self):
3251 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3252 self.sendToServer(MSG)
3253
3254 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3255 def testSingleCmsgTruncInData(self):
3256 # Test truncation of a control message inside its associated
3257 # data. The message may be returned with its data truncated,
3258 # or not returned at all.
3259 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3260 socket.IPV6_RECVHOPLIMIT, 1)
3261 self.misc_event.set()
3262 msg, ancdata, flags, addr = self.doRecvmsg(
3263 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3264
3265 self.assertEqual(msg, MSG)
3266 self.checkRecvmsgAddress(addr, self.cli_addr)
3267 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3268
3269 self.assertLessEqual(len(ancdata), 1)
3270 if ancdata:
3271 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3272 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3273 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3274 self.assertLess(len(cmsg_data), SIZEOF_INT)
3275
3276 @testSingleCmsgTruncInData.client_skip
3277 def _testSingleCmsgTruncInData(self):
3278 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3279 self.sendToServer(MSG)
3280
3281 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3282 # Receive traffic class and hop limit into ancbufsize bytes of
3283 # ancillary data space, which should be large enough to
3284 # contain the first item, but too small to contain the header
3285 # of the second. Check that data is MSG, MSG_CTRUNC is set
3286 # (unless included in ignoreflags), and only one ancillary
3287 # data item is returned.
3288 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3289 socket.IPV6_RECVHOPLIMIT, 1)
3290 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3291 socket.IPV6_RECVTCLASS, 1)
3292 self.misc_event.set()
3293 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3294 len(MSG), ancbufsize)
3295
3296 self.assertEqual(msg, MSG)
3297 self.checkRecvmsgAddress(addr, self.cli_addr)
3298 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3299 ignore=ignoreflags)
3300
3301 self.assertEqual(len(ancdata), 1)
3302 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3303 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3304 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3305 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3306 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003307 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003308 self.assertGreaterEqual(a[0], 0)
3309 self.assertLessEqual(a[0], 255)
3310
3311 # Try the above test with various buffer sizes.
3312
3313 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3314 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3315 def testSecondCmsgTrunc0(self):
3316 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3317 ignoreflags=socket.MSG_CTRUNC)
3318
3319 @testSecondCmsgTrunc0.client_skip
3320 def _testSecondCmsgTrunc0(self):
3321 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3322 self.sendToServer(MSG)
3323
3324 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3325 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3326 def testSecondCmsgTrunc1(self):
3327 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3328
3329 @testSecondCmsgTrunc1.client_skip
3330 def _testSecondCmsgTrunc1(self):
3331 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3332 self.sendToServer(MSG)
3333
3334 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3335 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3336 def testSecondCmsgTrunc2Int(self):
3337 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3338 2 * SIZEOF_INT)
3339
3340 @testSecondCmsgTrunc2Int.client_skip
3341 def _testSecondCmsgTrunc2Int(self):
3342 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3343 self.sendToServer(MSG)
3344
3345 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3346 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3347 def testSecondCmsgTruncLen0Minus1(self):
3348 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3349 socket.CMSG_LEN(0) - 1)
3350
3351 @testSecondCmsgTruncLen0Minus1.client_skip
3352 def _testSecondCmsgTruncLen0Minus1(self):
3353 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3354 self.sendToServer(MSG)
3355
3356 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3357 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3358 def testSecomdCmsgTruncInData(self):
3359 # Test truncation of the second of two control messages inside
3360 # its associated data.
3361 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3362 socket.IPV6_RECVHOPLIMIT, 1)
3363 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3364 socket.IPV6_RECVTCLASS, 1)
3365 self.misc_event.set()
3366 msg, ancdata, flags, addr = self.doRecvmsg(
3367 self.serv_sock, len(MSG),
3368 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3369
3370 self.assertEqual(msg, MSG)
3371 self.checkRecvmsgAddress(addr, self.cli_addr)
3372 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3373
3374 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3375
3376 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3377 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3378 cmsg_types.remove(cmsg_type)
3379 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3380 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003381 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003382 self.assertGreaterEqual(a[0], 0)
3383 self.assertLessEqual(a[0], 255)
3384
3385 if ancdata:
3386 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3387 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3388 cmsg_types.remove(cmsg_type)
3389 self.assertLess(len(cmsg_data), SIZEOF_INT)
3390
3391 self.assertEqual(ancdata, [])
3392
3393 @testSecomdCmsgTruncInData.client_skip
3394 def _testSecomdCmsgTruncInData(self):
3395 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3396 self.sendToServer(MSG)
3397
3398
3399# Derive concrete test classes for different socket types.
3400
3401class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3402 SendrecvmsgConnectionlessBase,
3403 ThreadedSocketTestMixin, UDPTestBase):
3404 pass
3405
3406@requireAttrs(socket.socket, "sendmsg")
3407@unittest.skipUnless(thread, 'Threading required for this test.')
3408class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3409 pass
3410
3411@requireAttrs(socket.socket, "recvmsg")
3412@unittest.skipUnless(thread, 'Threading required for this test.')
3413class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3414 pass
3415
3416@requireAttrs(socket.socket, "recvmsg_into")
3417@unittest.skipUnless(thread, 'Threading required for this test.')
3418class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3419 pass
3420
3421
3422class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3423 SendrecvmsgConnectionlessBase,
3424 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003425
3426 def checkRecvmsgAddress(self, addr1, addr2):
3427 # Called to compare the received address with the address of
3428 # the peer, ignoring scope ID
3429 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003430
3431@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003432@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003433@requireSocket("AF_INET6", "SOCK_DGRAM")
3434@unittest.skipUnless(thread, 'Threading required for this test.')
3435class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3436 pass
3437
3438@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003439@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003440@requireSocket("AF_INET6", "SOCK_DGRAM")
3441@unittest.skipUnless(thread, 'Threading required for this test.')
3442class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3443 pass
3444
3445@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003446@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003447@requireSocket("AF_INET6", "SOCK_DGRAM")
3448@unittest.skipUnless(thread, 'Threading required for this test.')
3449class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3450 pass
3451
3452@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003453@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003454@requireAttrs(socket, "IPPROTO_IPV6")
3455@requireSocket("AF_INET6", "SOCK_DGRAM")
3456@unittest.skipUnless(thread, 'Threading required for this test.')
3457class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3458 SendrecvmsgUDP6TestBase):
3459 pass
3460
3461@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003462@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003463@requireAttrs(socket, "IPPROTO_IPV6")
3464@requireSocket("AF_INET6", "SOCK_DGRAM")
3465@unittest.skipUnless(thread, 'Threading required for this test.')
3466class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3467 RFC3542AncillaryTest,
3468 SendrecvmsgUDP6TestBase):
3469 pass
3470
3471
3472class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3473 ConnectedStreamTestMixin, TCPTestBase):
3474 pass
3475
3476@requireAttrs(socket.socket, "sendmsg")
3477@unittest.skipUnless(thread, 'Threading required for this test.')
3478class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3479 pass
3480
3481@requireAttrs(socket.socket, "recvmsg")
3482@unittest.skipUnless(thread, 'Threading required for this test.')
3483class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3484 SendrecvmsgTCPTestBase):
3485 pass
3486
3487@requireAttrs(socket.socket, "recvmsg_into")
3488@unittest.skipUnless(thread, 'Threading required for this test.')
3489class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3490 SendrecvmsgTCPTestBase):
3491 pass
3492
3493
3494class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3495 SendrecvmsgConnectedBase,
3496 ConnectedStreamTestMixin, SCTPStreamBase):
3497 pass
3498
3499@requireAttrs(socket.socket, "sendmsg")
3500@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3501@unittest.skipUnless(thread, 'Threading required for this test.')
3502class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3503 pass
3504
3505@requireAttrs(socket.socket, "recvmsg")
3506@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3507@unittest.skipUnless(thread, 'Threading required for this test.')
3508class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3509 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003510
3511 def testRecvmsgEOF(self):
3512 try:
3513 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3514 except OSError as e:
3515 if e.errno != errno.ENOTCONN:
3516 raise
3517 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003518
3519@requireAttrs(socket.socket, "recvmsg_into")
3520@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3521@unittest.skipUnless(thread, 'Threading required for this test.')
3522class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3523 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003524
3525 def testRecvmsgEOF(self):
3526 try:
3527 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3528 except OSError as e:
3529 if e.errno != errno.ENOTCONN:
3530 raise
3531 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003532
3533
3534class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3535 ConnectedStreamTestMixin, UnixStreamBase):
3536 pass
3537
3538@requireAttrs(socket.socket, "sendmsg")
3539@requireAttrs(socket, "AF_UNIX")
3540@unittest.skipUnless(thread, 'Threading required for this test.')
3541class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3542 pass
3543
3544@requireAttrs(socket.socket, "recvmsg")
3545@requireAttrs(socket, "AF_UNIX")
3546@unittest.skipUnless(thread, 'Threading required for this test.')
3547class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3548 SendrecvmsgUnixStreamTestBase):
3549 pass
3550
3551@requireAttrs(socket.socket, "recvmsg_into")
3552@requireAttrs(socket, "AF_UNIX")
3553@unittest.skipUnless(thread, 'Threading required for this test.')
3554class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3555 SendrecvmsgUnixStreamTestBase):
3556 pass
3557
3558@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3559@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3560@unittest.skipUnless(thread, 'Threading required for this test.')
3561class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3562 pass
3563
3564@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3565@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3566@unittest.skipUnless(thread, 'Threading required for this test.')
3567class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3568 SendrecvmsgUnixStreamTestBase):
3569 pass
3570
3571
3572# Test interrupting the interruptible send/receive methods with a
3573# signal when a timeout is set. These tests avoid having multiple
3574# threads alive during the test so that the OS cannot deliver the
3575# signal to the wrong one.
3576
3577class InterruptedTimeoutBase(unittest.TestCase):
3578 # Base class for interrupted send/receive tests. Installs an
3579 # empty handler for SIGALRM and removes it on teardown, along with
3580 # any scheduled alarms.
3581
3582 def setUp(self):
3583 super().setUp()
3584 orig_alrm_handler = signal.signal(signal.SIGALRM,
3585 lambda signum, frame: None)
3586 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3587 self.addCleanup(self.setAlarm, 0)
3588
3589 # Timeout for socket operations
3590 timeout = 4.0
3591
3592 # Provide setAlarm() method to schedule delivery of SIGALRM after
3593 # given number of seconds, or cancel it if zero, and an
3594 # appropriate time value to use. Use setitimer() if available.
3595 if hasattr(signal, "setitimer"):
3596 alarm_time = 0.05
3597
3598 def setAlarm(self, seconds):
3599 signal.setitimer(signal.ITIMER_REAL, seconds)
3600 else:
3601 # Old systems may deliver the alarm up to one second early
3602 alarm_time = 2
3603
3604 def setAlarm(self, seconds):
3605 signal.alarm(seconds)
3606
3607
3608# Require siginterrupt() in order to ensure that system calls are
3609# interrupted by default.
3610@requireAttrs(signal, "siginterrupt")
3611@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3612 "Don't have signal.alarm or signal.setitimer")
3613class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3614 # Test interrupting the recv*() methods with signals when a
3615 # timeout is set.
3616
3617 def setUp(self):
3618 super().setUp()
3619 self.serv.settimeout(self.timeout)
3620
3621 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003622 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003623 # errno of EINTR when interrupted by a signal.
3624 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003625 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003626 func(*args, **kwargs)
3627 self.assertNotIsInstance(cm.exception, socket.timeout)
3628 self.assertEqual(cm.exception.errno, errno.EINTR)
3629
3630 def testInterruptedRecvTimeout(self):
3631 self.checkInterruptedRecv(self.serv.recv, 1024)
3632
3633 def testInterruptedRecvIntoTimeout(self):
3634 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3635
3636 def testInterruptedRecvfromTimeout(self):
3637 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3638
3639 def testInterruptedRecvfromIntoTimeout(self):
3640 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3641
3642 @requireAttrs(socket.socket, "recvmsg")
3643 def testInterruptedRecvmsgTimeout(self):
3644 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3645
3646 @requireAttrs(socket.socket, "recvmsg_into")
3647 def testInterruptedRecvmsgIntoTimeout(self):
3648 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3649
3650
3651# Require siginterrupt() in order to ensure that system calls are
3652# interrupted by default.
3653@requireAttrs(signal, "siginterrupt")
3654@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3655 "Don't have signal.alarm or signal.setitimer")
3656@unittest.skipUnless(thread, 'Threading required for this test.')
3657class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3658 ThreadSafeCleanupTestCase,
3659 SocketListeningTestMixin, TCPTestBase):
3660 # Test interrupting the interruptible send*() methods with signals
3661 # when a timeout is set.
3662
3663 def setUp(self):
3664 super().setUp()
3665 self.serv_conn = self.newSocket()
3666 self.addCleanup(self.serv_conn.close)
3667 # Use a thread to complete the connection, but wait for it to
3668 # terminate before running the test, so that there is only one
3669 # thread to accept the signal.
3670 cli_thread = threading.Thread(target=self.doConnect)
3671 cli_thread.start()
3672 self.cli_conn, addr = self.serv.accept()
3673 self.addCleanup(self.cli_conn.close)
3674 cli_thread.join()
3675 self.serv_conn.settimeout(self.timeout)
3676
3677 def doConnect(self):
3678 self.serv_conn.connect(self.serv_addr)
3679
3680 def checkInterruptedSend(self, func, *args, **kwargs):
3681 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003682 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003683 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003684 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003685 while True:
3686 self.setAlarm(self.alarm_time)
3687 func(*args, **kwargs)
3688 self.assertNotIsInstance(cm.exception, socket.timeout)
3689 self.assertEqual(cm.exception.errno, errno.EINTR)
3690
Ned Deilyc5640382014-02-03 13:58:31 -08003691 # Issue #12958: The following tests have problems on OS X prior to 10.7
3692 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003693 def testInterruptedSendTimeout(self):
3694 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3695
Ned Deilyc5640382014-02-03 13:58:31 -08003696 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003697 def testInterruptedSendtoTimeout(self):
3698 # Passing an actual address here as Python's wrapper for
3699 # sendto() doesn't allow passing a zero-length one; POSIX
3700 # requires that the address is ignored since the socket is
3701 # connection-mode, however.
3702 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3703 self.serv_addr)
3704
Ned Deilyc5640382014-02-03 13:58:31 -08003705 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003706 @requireAttrs(socket.socket, "sendmsg")
3707 def testInterruptedSendmsgTimeout(self):
3708 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3709
3710
Victor Stinner45df8202010-04-28 22:31:17 +00003711@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003712class TCPCloserTest(ThreadedTCPSocketTest):
3713
3714 def testClose(self):
3715 conn, addr = self.serv.accept()
3716 conn.close()
3717
3718 sd = self.cli
3719 read, write, err = select.select([sd], [], [], 1.0)
3720 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003721 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003722
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003723 # Calling close() many times should be safe.
3724 conn.close()
3725 conn.close()
3726
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003727 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003728 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003729 time.sleep(1.0)
3730
Serhiy Storchaka43767632013-11-03 21:31:38 +02003731@unittest.skipUnless(hasattr(socket, 'socketpair'),
3732 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003733@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003734class BasicSocketPairTest(SocketPairTest):
3735
3736 def __init__(self, methodName='runTest'):
3737 SocketPairTest.__init__(self, methodName=methodName)
3738
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003739 def _check_defaults(self, sock):
3740 self.assertIsInstance(sock, socket.socket)
3741 if hasattr(socket, 'AF_UNIX'):
3742 self.assertEqual(sock.family, socket.AF_UNIX)
3743 else:
3744 self.assertEqual(sock.family, socket.AF_INET)
3745 self.assertEqual(sock.type, socket.SOCK_STREAM)
3746 self.assertEqual(sock.proto, 0)
3747
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003748 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003749 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003750
3751 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003752 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003753
Dave Cole331708b2004-08-09 04:51:41 +00003754 def testRecv(self):
3755 msg = self.serv.recv(1024)
3756 self.assertEqual(msg, MSG)
3757
3758 def _testRecv(self):
3759 self.cli.send(MSG)
3760
3761 def testSend(self):
3762 self.serv.send(MSG)
3763
3764 def _testSend(self):
3765 msg = self.cli.recv(1024)
3766 self.assertEqual(msg, MSG)
3767
Victor Stinner45df8202010-04-28 22:31:17 +00003768@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003769class NonBlockingTCPTests(ThreadedTCPSocketTest):
3770
3771 def __init__(self, methodName='runTest'):
3772 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3773
3774 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003775 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003776 self.serv.setblocking(True)
3777 self.assertIsNone(self.serv.gettimeout())
3778 self.serv.setblocking(False)
3779 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003780 start = time.time()
3781 try:
3782 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003783 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003784 pass
3785 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003786 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003787
3788 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003789 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003790
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003791 @support.cpython_only
3792 def testSetBlocking_overflow(self):
3793 # Issue 15989
3794 import _testcapi
3795 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3796 self.skipTest('needs UINT_MAX < ULONG_MAX')
3797 self.serv.setblocking(False)
3798 self.assertEqual(self.serv.gettimeout(), 0.0)
3799 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3800 self.assertIsNone(self.serv.gettimeout())
3801
3802 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3803
Serhiy Storchaka43767632013-11-03 21:31:38 +02003804 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3805 'test needs socket.SOCK_NONBLOCK')
3806 @support.requires_linux_version(2, 6, 28)
3807 def testInitNonBlocking(self):
3808 # reinit server socket
3809 self.serv.close()
3810 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3811 socket.SOCK_NONBLOCK)
3812 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003813 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003814 # actual testing
3815 start = time.time()
3816 try:
3817 self.serv.accept()
3818 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003819 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003820 end = time.time()
3821 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3822
3823 def _testInitNonBlocking(self):
3824 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003825
Antoine Pitrou600232b2011-01-05 21:03:42 +00003826 def testInheritFlags(self):
3827 # Issue #7995: when calling accept() on a listening socket with a
3828 # timeout, the resulting socket should not be non-blocking.
3829 self.serv.settimeout(10)
3830 try:
3831 conn, addr = self.serv.accept()
3832 message = conn.recv(len(MSG))
3833 finally:
3834 conn.close()
3835 self.serv.settimeout(None)
3836
3837 def _testInheritFlags(self):
3838 time.sleep(0.1)
3839 self.cli.connect((HOST, self.port))
3840 time.sleep(0.5)
3841 self.cli.send(MSG)
3842
Guido van Rossum24e4af82002-06-12 19:18:08 +00003843 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003844 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003845 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003846 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003847 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003848 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003849 pass
3850 else:
3851 self.fail("Error trying to do non-blocking accept.")
3852 read, write, err = select.select([self.serv], [], [])
3853 if self.serv in read:
3854 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003855 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003856 else:
3857 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003858
Guido van Rossum24e4af82002-06-12 19:18:08 +00003859 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003860 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003861 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003862
3863 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003864 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003865 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003866 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003867
3868 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003869 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003870 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003871
3872 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003873 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003874 conn, addr = self.serv.accept()
3875 conn.setblocking(0)
3876 try:
3877 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003878 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003879 pass
3880 else:
3881 self.fail("Error trying to do non-blocking recv.")
3882 read, write, err = select.select([conn], [], [])
3883 if conn in read:
3884 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003885 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003886 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003887 else:
3888 self.fail("Error during select call to non-blocking socket.")
3889
3890 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003891 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003892 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003893 self.cli.send(MSG)
3894
Victor Stinner45df8202010-04-28 22:31:17 +00003895@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003896class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003897 """Unit tests for the object returned by socket.makefile()
3898
Antoine Pitrou834bd812010-10-13 16:17:14 +00003899 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003900 the client connection. You can read from this file to
3901 get output from the server.
3902
Antoine Pitrou834bd812010-10-13 16:17:14 +00003903 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003904 server connection. You can write to this file to send output
3905 to the client.
3906 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003907
Guido van Rossume9f66142002-08-07 15:46:19 +00003908 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003909 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003910 errors = 'strict'
3911 newline = None
3912
3913 read_mode = 'rb'
3914 read_msg = MSG
3915 write_mode = 'wb'
3916 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003917
Guido van Rossum24e4af82002-06-12 19:18:08 +00003918 def __init__(self, methodName='runTest'):
3919 SocketConnectedTest.__init__(self, methodName=methodName)
3920
3921 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003922 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3923 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003924 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003925 self.read_file = self.cli_conn.makefile(
3926 self.read_mode, self.bufsize,
3927 encoding = self.encoding,
3928 errors = self.errors,
3929 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003930
3931 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003932 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003933 self.read_file.close()
3934 self.assertTrue(self.read_file.closed)
3935 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003936 SocketConnectedTest.tearDown(self)
3937
3938 def clientSetUp(self):
3939 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 self.write_file = self.serv_conn.makefile(
3941 self.write_mode, self.bufsize,
3942 encoding = self.encoding,
3943 errors = self.errors,
3944 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003945
3946 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003947 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003948 self.write_file.close()
3949 self.assertTrue(self.write_file.closed)
3950 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003951 SocketConnectedTest.clientTearDown(self)
3952
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003953 def testReadAfterTimeout(self):
3954 # Issue #7322: A file object must disallow further reads
3955 # after a timeout has occurred.
3956 self.cli_conn.settimeout(1)
3957 self.read_file.read(3)
3958 # First read raises a timeout
3959 self.assertRaises(socket.timeout, self.read_file.read, 1)
3960 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003961 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003962 self.read_file.read(1)
3963 self.assertIn("cannot read from timed out object", str(ctx.exception))
3964
3965 def _testReadAfterTimeout(self):
3966 self.write_file.write(self.write_msg[0:3])
3967 self.write_file.flush()
3968 self.serv_finished.wait()
3969
Guido van Rossum24e4af82002-06-12 19:18:08 +00003970 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003971 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003972 first_seg = self.read_file.read(len(self.read_msg)-3)
3973 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003974 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003975 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003976
3977 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 self.write_file.write(self.write_msg)
3979 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003980
Guido van Rossum8c943832002-08-08 01:00:28 +00003981 def testFullRead(self):
3982 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003983 msg = self.read_file.read()
3984 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003985
3986 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003987 self.write_file.write(self.write_msg)
3988 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003989
Guido van Rossum24e4af82002-06-12 19:18:08 +00003990 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003991 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003992 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003993 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003995 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003996 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003997 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003998 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003999
4000 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 self.write_file.write(self.write_msg)
4002 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004003
4004 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004005 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004006 line = self.read_file.readline()
4007 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004008
4009 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010 self.write_file.write(self.write_msg)
4011 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004012
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004013 def testCloseAfterMakefile(self):
4014 # The file returned by makefile should keep the socket open.
4015 self.cli_conn.close()
4016 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017 msg = self.read_file.read()
4018 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004019
4020 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004021 self.write_file.write(self.write_msg)
4022 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004023
4024 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004025 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004026 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 if isinstance(self.read_msg, str):
4028 msg = msg.decode()
4029 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004030
4031 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004032 self.write_file.write(self.write_msg)
4033 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004034
Tim Peters116d83c2004-03-28 02:20:45 +00004035 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004036 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004037
4038 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004039 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004040
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004041 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004042 self.assertEqual(self.read_file.mode, self.read_mode)
4043 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004044
4045 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004046 self.assertEqual(self.write_file.mode, self.write_mode)
4047 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004048
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004049 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 self.read_file.close()
4051 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004052 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004053 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004054
4055 def _testRealClose(self):
4056 pass
4057
4058
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004059class FileObjectInterruptedTestCase(unittest.TestCase):
4060 """Test that the file object correctly handles EINTR internally."""
4061
4062 class MockSocket(object):
4063 def __init__(self, recv_funcs=()):
4064 # A generator that returns callables that we'll call for each
4065 # call to recv().
4066 self._recv_step = iter(recv_funcs)
4067
4068 def recv_into(self, buffer):
4069 data = next(self._recv_step)()
4070 assert len(buffer) >= len(data)
4071 buffer[:len(data)] = data
4072 return len(data)
4073
4074 def _decref_socketios(self):
4075 pass
4076
4077 def _textiowrap_for_test(self, buffering=-1):
4078 raw = socket.SocketIO(self, "r")
4079 if buffering < 0:
4080 buffering = io.DEFAULT_BUFFER_SIZE
4081 if buffering == 0:
4082 return raw
4083 buffer = io.BufferedReader(raw, buffering)
4084 text = io.TextIOWrapper(buffer, None, None)
4085 text.mode = "rb"
4086 return text
4087
4088 @staticmethod
4089 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004090 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004091
4092 def _textiowrap_mock_socket(self, mock, buffering=-1):
4093 raw = socket.SocketIO(mock, "r")
4094 if buffering < 0:
4095 buffering = io.DEFAULT_BUFFER_SIZE
4096 if buffering == 0:
4097 return raw
4098 buffer = io.BufferedReader(raw, buffering)
4099 text = io.TextIOWrapper(buffer, None, None)
4100 text.mode = "rb"
4101 return text
4102
4103 def _test_readline(self, size=-1, buffering=-1):
4104 mock_sock = self.MockSocket(recv_funcs=[
4105 lambda : b"This is the first line\nAnd the sec",
4106 self._raise_eintr,
4107 lambda : b"ond line is here\n",
4108 lambda : b"",
4109 lambda : b"", # XXX(gps): io library does an extra EOF read
4110 ])
4111 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004112 self.assertEqual(fo.readline(size), "This is the first line\n")
4113 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004114
4115 def _test_read(self, size=-1, buffering=-1):
4116 mock_sock = self.MockSocket(recv_funcs=[
4117 lambda : b"This is the first line\nAnd the sec",
4118 self._raise_eintr,
4119 lambda : b"ond line is here\n",
4120 lambda : b"",
4121 lambda : b"", # XXX(gps): io library does an extra EOF read
4122 ])
4123 expecting = (b"This is the first line\n"
4124 b"And the second line is here\n")
4125 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4126 if buffering == 0:
4127 data = b''
4128 else:
4129 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004130 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004131 while len(data) != len(expecting):
4132 part = fo.read(size)
4133 if not part:
4134 break
4135 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004136 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004137
4138 def test_default(self):
4139 self._test_readline()
4140 self._test_readline(size=100)
4141 self._test_read()
4142 self._test_read(size=100)
4143
4144 def test_with_1k_buffer(self):
4145 self._test_readline(buffering=1024)
4146 self._test_readline(size=100, buffering=1024)
4147 self._test_read(buffering=1024)
4148 self._test_read(size=100, buffering=1024)
4149
4150 def _test_readline_no_buffer(self, size=-1):
4151 mock_sock = self.MockSocket(recv_funcs=[
4152 lambda : b"a",
4153 lambda : b"\n",
4154 lambda : b"B",
4155 self._raise_eintr,
4156 lambda : b"b",
4157 lambda : b"",
4158 ])
4159 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004160 self.assertEqual(fo.readline(size), b"a\n")
4161 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004162
4163 def test_no_buffer(self):
4164 self._test_readline_no_buffer()
4165 self._test_readline_no_buffer(size=4)
4166 self._test_read(buffering=0)
4167 self._test_read(size=100, buffering=0)
4168
4169
Guido van Rossume9f66142002-08-07 15:46:19 +00004170class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4171
4172 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004173
Guido van Rossume9f66142002-08-07 15:46:19 +00004174 In this case (and in this case only), it should be possible to
4175 create a file object, read a line from it, create another file
4176 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004177 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004178 when reading multiple requests from the same socket."""
4179
4180 bufsize = 0 # Use unbuffered mode
4181
4182 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004183 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004184 line = self.read_file.readline() # first line
4185 self.assertEqual(line, b"A. " + self.write_msg) # first line
4186 self.read_file = self.cli_conn.makefile('rb', 0)
4187 line = self.read_file.readline() # second line
4188 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004189
4190 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004191 self.write_file.write(b"A. " + self.write_msg)
4192 self.write_file.write(b"B. " + self.write_msg)
4193 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004194
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004195 def testMakefileClose(self):
4196 # The file returned by makefile should keep the socket open...
4197 self.cli_conn.close()
4198 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004199 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004200 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004201 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004202 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004203
4204 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004205 self.write_file.write(self.write_msg)
4206 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004207
4208 def testMakefileCloseSocketDestroy(self):
4209 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004210 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004211 refcount_after = sys.getrefcount(self.cli_conn)
4212 self.assertEqual(refcount_before - 1, refcount_after)
4213
4214 def _testMakefileCloseSocketDestroy(self):
4215 pass
4216
Antoine Pitrou98b46702010-09-18 22:59:00 +00004217 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004218 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004219 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4220
4221 def testSmallReadNonBlocking(self):
4222 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004223 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4224 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004225 self.evt1.set()
4226 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004227 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004228 if first_seg is None:
4229 # Data not arrived (can happen under Windows), wait a bit
4230 time.sleep(0.5)
4231 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004232 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004233 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004234 self.assertEqual(n, 3)
4235 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004236 self.assertEqual(msg, self.read_msg)
4237 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4238 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004239
4240 def _testSmallReadNonBlocking(self):
4241 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 self.write_file.write(self.write_msg)
4243 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004244 self.evt2.set()
4245 # Avoid cloding the socket before the server test has finished,
4246 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4247 self.serv_finished.wait(5.0)
4248
4249 def testWriteNonBlocking(self):
4250 self.cli_finished.wait(5.0)
4251 # The client thread can't skip directly - the SkipTest exception
4252 # would appear as a failure.
4253 if self.serv_skipped:
4254 self.skipTest(self.serv_skipped)
4255
4256 def _testWriteNonBlocking(self):
4257 self.serv_skipped = None
4258 self.serv_conn.setblocking(False)
4259 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004260 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004261 LIMIT = 10
4262 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004263 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004264 self.assertGreater(n, 0)
4265 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004266 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004267 if n is None:
4268 # Succeeded
4269 break
4270 self.assertGreater(n, 0)
4271 else:
4272 # Let us know that this test didn't manage to establish
4273 # the expected conditions. This is not a failure in itself but,
4274 # if it happens repeatedly, the test should be fixed.
4275 self.serv_skipped = "failed to saturate the socket buffer"
4276
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004277
Guido van Rossum8c943832002-08-08 01:00:28 +00004278class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4279
4280 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4281
4282
4283class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4284
4285 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004286
Thomas Woutersb2137042007-02-01 18:02:27 +00004287
Antoine Pitrou834bd812010-10-13 16:17:14 +00004288class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4289 """Tests for socket.makefile() in text mode (rather than binary)"""
4290
4291 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004292 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004293 write_mode = 'wb'
4294 write_msg = MSG
4295 newline = ''
4296
4297
4298class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4299 """Tests for socket.makefile() in text mode (rather than binary)"""
4300
4301 read_mode = 'rb'
4302 read_msg = MSG
4303 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004304 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004305 newline = ''
4306
4307
4308class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4309 """Tests for socket.makefile() in text mode (rather than binary)"""
4310
4311 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004312 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004313 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004314 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004315 newline = ''
4316
4317
Guido van Rossumd8faa362007-04-27 19:54:29 +00004318class NetworkConnectionTest(object):
4319 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004320
Guido van Rossumd8faa362007-04-27 19:54:29 +00004321 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004322 # We're inherited below by BasicTCPTest2, which also inherits
4323 # BasicTCPTest, which defines self.port referenced below.
4324 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004325 self.serv_conn = self.cli
4326
4327class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4328 """Tests that NetworkConnection does not break existing TCP functionality.
4329 """
4330
4331class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004332
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004333 class MockSocket(socket.socket):
4334 def connect(self, *args):
4335 raise socket.timeout('timed out')
4336
4337 @contextlib.contextmanager
4338 def mocked_socket_module(self):
4339 """Return a socket which times out on connect"""
4340 old_socket = socket.socket
4341 socket.socket = self.MockSocket
4342 try:
4343 yield
4344 finally:
4345 socket.socket = old_socket
4346
4347 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004348 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004349 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004350 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004351 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004352 cli.connect((HOST, port))
4353 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4354
4355 def test_create_connection(self):
4356 # Issue #9792: errors raised by create_connection() should have
4357 # a proper errno attribute.
4358 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004359 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004360 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004361
4362 # Issue #16257: create_connection() calls getaddrinfo() against
4363 # 'localhost'. This may result in an IPV6 addr being returned
4364 # as well as an IPV4 one:
4365 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4366 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4367 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4368 #
4369 # create_connection() enumerates through all the addresses returned
4370 # and if it doesn't successfully bind to any of them, it propagates
4371 # the last exception it encountered.
4372 #
4373 # On Solaris, ENETUNREACH is returned in this circumstance instead
4374 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4375 # expected errnos.
4376 expected_errnos = [ errno.ECONNREFUSED, ]
4377 if hasattr(errno, 'ENETUNREACH'):
4378 expected_errnos.append(errno.ENETUNREACH)
4379
4380 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004381
4382 def test_create_connection_timeout(self):
4383 # Issue #9792: create_connection() should not recast timeout errors
4384 # as generic socket errors.
4385 with self.mocked_socket_module():
4386 with self.assertRaises(socket.timeout):
4387 socket.create_connection((HOST, 1234))
4388
Guido van Rossumd8faa362007-04-27 19:54:29 +00004389
Victor Stinner45df8202010-04-28 22:31:17 +00004390@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004391class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4392
4393 def __init__(self, methodName='runTest'):
4394 SocketTCPTest.__init__(self, methodName=methodName)
4395 ThreadableTest.__init__(self)
4396
4397 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004398 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004399
4400 def clientTearDown(self):
4401 self.cli.close()
4402 self.cli = None
4403 ThreadableTest.clientTearDown(self)
4404
4405 def _justAccept(self):
4406 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004407 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004408
4409 testFamily = _justAccept
4410 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004411 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004412 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004413 self.assertEqual(self.cli.family, 2)
4414
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004415 testSourceAddress = _justAccept
4416 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004417 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4418 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004419 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004420 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004421 # The port number being used is sufficient to show that the bind()
4422 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004423
Guido van Rossumd8faa362007-04-27 19:54:29 +00004424 testTimeoutDefault = _justAccept
4425 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004426 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004427 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004428 socket.setdefaulttimeout(42)
4429 try:
4430 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004431 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004432 finally:
4433 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004434 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004435
4436 testTimeoutNone = _justAccept
4437 def _testTimeoutNone(self):
4438 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004439 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004440 socket.setdefaulttimeout(30)
4441 try:
4442 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004443 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004444 finally:
4445 socket.setdefaulttimeout(None)
4446 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004447
4448 testTimeoutValueNamed = _justAccept
4449 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004450 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004451 self.assertEqual(self.cli.gettimeout(), 30)
4452
4453 testTimeoutValueNonamed = _justAccept
4454 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004455 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004456 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004457 self.assertEqual(self.cli.gettimeout(), 30)
4458
Victor Stinner45df8202010-04-28 22:31:17 +00004459@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004460class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4461
4462 def __init__(self, methodName='runTest'):
4463 SocketTCPTest.__init__(self, methodName=methodName)
4464 ThreadableTest.__init__(self)
4465
4466 def clientSetUp(self):
4467 pass
4468
4469 def clientTearDown(self):
4470 self.cli.close()
4471 self.cli = None
4472 ThreadableTest.clientTearDown(self)
4473
4474 def testInsideTimeout(self):
4475 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004476 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004477 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004478 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004479 testOutsideTimeout = testInsideTimeout
4480
4481 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004482 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004483 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004484 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004485
4486 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004487 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004488 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004489
4490
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004491class TCPTimeoutTest(SocketTCPTest):
4492
4493 def testTCPTimeout(self):
4494 def raise_timeout(*args, **kwargs):
4495 self.serv.settimeout(1.0)
4496 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004497 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004498 "Error generating a timeout exception (TCP)")
4499
4500 def testTimeoutZero(self):
4501 ok = False
4502 try:
4503 self.serv.settimeout(0.0)
4504 foo = self.serv.accept()
4505 except socket.timeout:
4506 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004507 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004508 ok = True
4509 except:
4510 self.fail("caught unexpected exception (TCP)")
4511 if not ok:
4512 self.fail("accept() returned success when we did not expect it")
4513
Serhiy Storchaka43767632013-11-03 21:31:38 +02004514 @unittest.skipUnless(hasattr(signal, 'alarm'),
4515 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004516 def testInterruptedTimeout(self):
4517 # XXX I don't know how to do this test on MSWindows or any other
4518 # plaform that doesn't support signal.alarm() or os.kill(), though
4519 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004520 self.serv.settimeout(5.0) # must be longer than alarm
4521 class Alarm(Exception):
4522 pass
4523 def alarm_handler(signal, frame):
4524 raise Alarm
4525 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4526 try:
4527 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4528 try:
4529 foo = self.serv.accept()
4530 except socket.timeout:
4531 self.fail("caught timeout instead of Alarm")
4532 except Alarm:
4533 pass
4534 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004535 self.fail("caught other exception instead of Alarm:"
4536 " %s(%s):\n%s" %
4537 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004538 else:
4539 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004540 finally:
4541 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004542 except Alarm:
4543 self.fail("got Alarm in wrong place")
4544 finally:
4545 # no alarm can be pending. Safe to restore old handler.
4546 signal.signal(signal.SIGALRM, old_alarm)
4547
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004548class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004549
4550 def testUDPTimeout(self):
4551 def raise_timeout(*args, **kwargs):
4552 self.serv.settimeout(1.0)
4553 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004554 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004555 "Error generating a timeout exception (UDP)")
4556
4557 def testTimeoutZero(self):
4558 ok = False
4559 try:
4560 self.serv.settimeout(0.0)
4561 foo = self.serv.recv(1024)
4562 except socket.timeout:
4563 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004564 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004565 ok = True
4566 except:
4567 self.fail("caught unexpected exception (UDP)")
4568 if not ok:
4569 self.fail("recv() returned success when we did not expect it")
4570
4571class TestExceptions(unittest.TestCase):
4572
4573 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004574 self.assertTrue(issubclass(OSError, Exception))
4575 self.assertTrue(issubclass(socket.herror, OSError))
4576 self.assertTrue(issubclass(socket.gaierror, OSError))
4577 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004578
Serhiy Storchaka43767632013-11-03 21:31:38 +02004579@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004580class TestLinuxAbstractNamespace(unittest.TestCase):
4581
4582 UNIX_PATH_MAX = 108
4583
4584 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004585 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004586 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4587 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004588 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004589 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4590 s2.connect(s1.getsockname())
4591 with s1.accept()[0] as s3:
4592 self.assertEqual(s1.getsockname(), address)
4593 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004594
4595 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004596 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004597 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4598 s.bind(address)
4599 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004600
4601 def testNameOverflow(self):
4602 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004603 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004604 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004605
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004606 def testStrName(self):
4607 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004608 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4609 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004610 s.bind("\x00python\x00test\x00")
4611 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004612 finally:
4613 s.close()
4614
Serhiy Storchaka43767632013-11-03 21:31:38 +02004615@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004616class TestUnixDomain(unittest.TestCase):
4617
4618 def setUp(self):
4619 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4620
4621 def tearDown(self):
4622 self.sock.close()
4623
4624 def encoded(self, path):
4625 # Return the given path encoded in the file system encoding,
4626 # or skip the test if this is not possible.
4627 try:
4628 return os.fsencode(path)
4629 except UnicodeEncodeError:
4630 self.skipTest(
4631 "Pathname {0!a} cannot be represented in file "
4632 "system encoding {1!r}".format(
4633 path, sys.getfilesystemencoding()))
4634
Antoine Pitrou16374872011-12-16 15:04:12 +01004635 def bind(self, sock, path):
4636 # Bind the socket
4637 try:
4638 sock.bind(path)
4639 except OSError as e:
4640 if str(e) == "AF_UNIX path too long":
4641 self.skipTest(
4642 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4643 .format(path))
4644 else:
4645 raise
4646
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004647 def testStrAddr(self):
4648 # Test binding to and retrieving a normal string pathname.
4649 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004650 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004651 self.addCleanup(support.unlink, path)
4652 self.assertEqual(self.sock.getsockname(), path)
4653
4654 def testBytesAddr(self):
4655 # Test binding to a bytes pathname.
4656 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004657 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004658 self.addCleanup(support.unlink, path)
4659 self.assertEqual(self.sock.getsockname(), path)
4660
4661 def testSurrogateescapeBind(self):
4662 # Test binding to a valid non-ASCII pathname, with the
4663 # non-ASCII bytes supplied using surrogateescape encoding.
4664 path = os.path.abspath(support.TESTFN_UNICODE)
4665 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004666 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004667 self.addCleanup(support.unlink, path)
4668 self.assertEqual(self.sock.getsockname(), path)
4669
4670 def testUnencodableAddr(self):
4671 # Test binding to a pathname that cannot be encoded in the
4672 # file system encoding.
4673 if support.TESTFN_UNENCODABLE is None:
4674 self.skipTest("No unencodable filename available")
4675 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004676 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004677 self.addCleanup(support.unlink, path)
4678 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004679
Victor Stinner45df8202010-04-28 22:31:17 +00004680@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004681class BufferIOTest(SocketConnectedTest):
4682 """
4683 Test the buffer versions of socket.recv() and socket.send().
4684 """
4685 def __init__(self, methodName='runTest'):
4686 SocketConnectedTest.__init__(self, methodName=methodName)
4687
Antoine Pitrou25480782010-03-17 22:50:28 +00004688 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004689 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004690 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004691 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004692 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004693 self.assertEqual(msg, MSG)
4694
Antoine Pitrou25480782010-03-17 22:50:28 +00004695 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004696 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004697 self.serv_conn.send(buf)
4698
Antoine Pitrou25480782010-03-17 22:50:28 +00004699 def testRecvIntoBytearray(self):
4700 buf = bytearray(1024)
4701 nbytes = self.cli_conn.recv_into(buf)
4702 self.assertEqual(nbytes, len(MSG))
4703 msg = buf[:len(MSG)]
4704 self.assertEqual(msg, MSG)
4705
4706 _testRecvIntoBytearray = _testRecvIntoArray
4707
4708 def testRecvIntoMemoryview(self):
4709 buf = bytearray(1024)
4710 nbytes = self.cli_conn.recv_into(memoryview(buf))
4711 self.assertEqual(nbytes, len(MSG))
4712 msg = buf[:len(MSG)]
4713 self.assertEqual(msg, MSG)
4714
4715 _testRecvIntoMemoryview = _testRecvIntoArray
4716
4717 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004718 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004719 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004720 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004721 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004722 self.assertEqual(msg, MSG)
4723
Antoine Pitrou25480782010-03-17 22:50:28 +00004724 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004725 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004726 self.serv_conn.send(buf)
4727
Antoine Pitrou25480782010-03-17 22:50:28 +00004728 def testRecvFromIntoBytearray(self):
4729 buf = bytearray(1024)
4730 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4731 self.assertEqual(nbytes, len(MSG))
4732 msg = buf[:len(MSG)]
4733 self.assertEqual(msg, MSG)
4734
4735 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4736
4737 def testRecvFromIntoMemoryview(self):
4738 buf = bytearray(1024)
4739 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4740 self.assertEqual(nbytes, len(MSG))
4741 msg = buf[:len(MSG)]
4742 self.assertEqual(msg, MSG)
4743
4744 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4745
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004746 def testRecvFromIntoSmallBuffer(self):
4747 # See issue #20246.
4748 buf = bytearray(8)
4749 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4750
4751 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004752 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004753
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004754 def testRecvFromIntoEmptyBuffer(self):
4755 buf = bytearray()
4756 self.cli_conn.recvfrom_into(buf)
4757 self.cli_conn.recvfrom_into(buf, 0)
4758
4759 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4760
Christian Heimes043d6f62008-01-07 17:19:16 +00004761
4762TIPC_STYPE = 2000
4763TIPC_LOWER = 200
4764TIPC_UPPER = 210
4765
4766def isTipcAvailable():
4767 """Check if the TIPC module is loaded
4768
4769 The TIPC module is not loaded automatically on Ubuntu and probably
4770 other Linux distros.
4771 """
4772 if not hasattr(socket, "AF_TIPC"):
4773 return False
4774 if not os.path.isfile("/proc/modules"):
4775 return False
4776 with open("/proc/modules") as f:
4777 for line in f:
4778 if line.startswith("tipc "):
4779 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004780 return False
4781
Serhiy Storchaka43767632013-11-03 21:31:38 +02004782@unittest.skipUnless(isTipcAvailable(),
4783 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004784class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004785 def testRDM(self):
4786 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4787 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004788 self.addCleanup(srv.close)
4789 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004790
4791 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4792 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4793 TIPC_LOWER, TIPC_UPPER)
4794 srv.bind(srvaddr)
4795
4796 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4797 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4798 cli.sendto(MSG, sendaddr)
4799
4800 msg, recvaddr = srv.recvfrom(1024)
4801
4802 self.assertEqual(cli.getsockname(), recvaddr)
4803 self.assertEqual(msg, MSG)
4804
4805
Serhiy Storchaka43767632013-11-03 21:31:38 +02004806@unittest.skipUnless(isTipcAvailable(),
4807 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004808class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004809 def __init__(self, methodName = 'runTest'):
4810 unittest.TestCase.__init__(self, methodName = methodName)
4811 ThreadableTest.__init__(self)
4812
4813 def setUp(self):
4814 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004815 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004816 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4817 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4818 TIPC_LOWER, TIPC_UPPER)
4819 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004820 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004821 self.serverExplicitReady()
4822 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004823 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004824
4825 def clientSetUp(self):
4826 # The is a hittable race between serverExplicitReady() and the
4827 # accept() call; sleep a little while to avoid it, otherwise
4828 # we could get an exception
4829 time.sleep(0.1)
4830 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004831 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004832 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4833 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4834 self.cli.connect(addr)
4835 self.cliaddr = self.cli.getsockname()
4836
4837 def testStream(self):
4838 msg = self.conn.recv(1024)
4839 self.assertEqual(msg, MSG)
4840 self.assertEqual(self.cliaddr, self.connaddr)
4841
4842 def _testStream(self):
4843 self.cli.send(MSG)
4844 self.cli.close()
4845
4846
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004847@unittest.skipUnless(thread, 'Threading required for this test.')
4848class ContextManagersTest(ThreadedTCPSocketTest):
4849
4850 def _testSocketClass(self):
4851 # base test
4852 with socket.socket() as sock:
4853 self.assertFalse(sock._closed)
4854 self.assertTrue(sock._closed)
4855 # close inside with block
4856 with socket.socket() as sock:
4857 sock.close()
4858 self.assertTrue(sock._closed)
4859 # exception inside with block
4860 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004861 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004862 self.assertTrue(sock._closed)
4863
4864 def testCreateConnectionBase(self):
4865 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004866 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004867 data = conn.recv(1024)
4868 conn.sendall(data)
4869
4870 def _testCreateConnectionBase(self):
4871 address = self.serv.getsockname()
4872 with socket.create_connection(address) as sock:
4873 self.assertFalse(sock._closed)
4874 sock.sendall(b'foo')
4875 self.assertEqual(sock.recv(1024), b'foo')
4876 self.assertTrue(sock._closed)
4877
4878 def testCreateConnectionClose(self):
4879 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004880 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004881 data = conn.recv(1024)
4882 conn.sendall(data)
4883
4884 def _testCreateConnectionClose(self):
4885 address = self.serv.getsockname()
4886 with socket.create_connection(address) as sock:
4887 sock.close()
4888 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004889 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004890
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004891
Victor Stinnerdaf45552013-08-28 00:53:59 +02004892class InheritanceTest(unittest.TestCase):
4893 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4894 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004895 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004896 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004897 with socket.socket(socket.AF_INET,
4898 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4899 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004900 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004901
4902 def test_default_inheritable(self):
4903 sock = socket.socket()
4904 with sock:
4905 self.assertEqual(sock.get_inheritable(), False)
4906
4907 def test_dup(self):
4908 sock = socket.socket()
4909 with sock:
4910 newsock = sock.dup()
4911 sock.close()
4912 with newsock:
4913 self.assertEqual(newsock.get_inheritable(), False)
4914
4915 def test_set_inheritable(self):
4916 sock = socket.socket()
4917 with sock:
4918 sock.set_inheritable(True)
4919 self.assertEqual(sock.get_inheritable(), True)
4920
4921 sock.set_inheritable(False)
4922 self.assertEqual(sock.get_inheritable(), False)
4923
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004924 @unittest.skipIf(fcntl is None, "need fcntl")
4925 def test_get_inheritable_cloexec(self):
4926 sock = socket.socket()
4927 with sock:
4928 fd = sock.fileno()
4929 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004930
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004931 # clear FD_CLOEXEC flag
4932 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4933 flags &= ~fcntl.FD_CLOEXEC
4934 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004935
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004936 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004937
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004938 @unittest.skipIf(fcntl is None, "need fcntl")
4939 def test_set_inheritable_cloexec(self):
4940 sock = socket.socket()
4941 with sock:
4942 fd = sock.fileno()
4943 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4944 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004945
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004946 sock.set_inheritable(True)
4947 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4948 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004949
4950
Victor Stinnerdaf45552013-08-28 00:53:59 +02004951 @unittest.skipUnless(hasattr(socket, "socketpair"),
4952 "need socket.socketpair()")
4953 def test_socketpair(self):
4954 s1, s2 = socket.socketpair()
4955 self.addCleanup(s1.close)
4956 self.addCleanup(s2.close)
4957 self.assertEqual(s1.get_inheritable(), False)
4958 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004959
4960
4961@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4962 "SOCK_NONBLOCK not defined")
4963class NonblockConstantTest(unittest.TestCase):
4964 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4965 if nonblock:
4966 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4967 self.assertEqual(s.gettimeout(), timeout)
4968 else:
4969 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4970 self.assertEqual(s.gettimeout(), None)
4971
Charles-François Natali239bb962011-06-03 12:55:15 +02004972 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004973 def test_SOCK_NONBLOCK(self):
4974 # a lot of it seems silly and redundant, but I wanted to test that
4975 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004976 with socket.socket(socket.AF_INET,
4977 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4978 self.checkNonblock(s)
4979 s.setblocking(1)
4980 self.checkNonblock(s, False)
4981 s.setblocking(0)
4982 self.checkNonblock(s)
4983 s.settimeout(None)
4984 self.checkNonblock(s, False)
4985 s.settimeout(2.0)
4986 self.checkNonblock(s, timeout=2.0)
4987 s.setblocking(1)
4988 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004989 # defaulttimeout
4990 t = socket.getdefaulttimeout()
4991 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004992 with socket.socket() as s:
4993 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004994 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004995 with socket.socket() as s:
4996 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004997 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004998 with socket.socket() as s:
4999 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005000 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005001 with socket.socket() as s:
5002 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005003 socket.setdefaulttimeout(t)
5004
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005005
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005006@unittest.skipUnless(os.name == "nt", "Windows specific")
5007@unittest.skipUnless(multiprocessing, "need multiprocessing")
5008class TestSocketSharing(SocketTCPTest):
5009 # This must be classmethod and not staticmethod or multiprocessing
5010 # won't be able to bootstrap it.
5011 @classmethod
5012 def remoteProcessServer(cls, q):
5013 # Recreate socket from shared data
5014 sdata = q.get()
5015 message = q.get()
5016
5017 s = socket.fromshare(sdata)
5018 s2, c = s.accept()
5019
5020 # Send the message
5021 s2.sendall(message)
5022 s2.close()
5023 s.close()
5024
5025 def testShare(self):
5026 # Transfer the listening server socket to another process
5027 # and service it from there.
5028
5029 # Create process:
5030 q = multiprocessing.Queue()
5031 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5032 p.start()
5033
5034 # Get the shared socket data
5035 data = self.serv.share(p.pid)
5036
5037 # Pass the shared socket to the other process
5038 addr = self.serv.getsockname()
5039 self.serv.close()
5040 q.put(data)
5041
5042 # The data that the server will send us
5043 message = b"slapmahfro"
5044 q.put(message)
5045
5046 # Connect
5047 s = socket.create_connection(addr)
5048 # listen for the data
5049 m = []
5050 while True:
5051 data = s.recv(100)
5052 if not data:
5053 break
5054 m.append(data)
5055 s.close()
5056 received = b"".join(m)
5057 self.assertEqual(received, message)
5058 p.join()
5059
5060 def testShareLength(self):
5061 data = self.serv.share(os.getpid())
5062 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5063 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5064
5065 def compareSockets(self, org, other):
5066 # socket sharing is expected to work only for blocking socket
5067 # since the internal python timout value isn't transfered.
5068 self.assertEqual(org.gettimeout(), None)
5069 self.assertEqual(org.gettimeout(), other.gettimeout())
5070
5071 self.assertEqual(org.family, other.family)
5072 self.assertEqual(org.type, other.type)
5073 # If the user specified "0" for proto, then
5074 # internally windows will have picked the correct value.
5075 # Python introspection on the socket however will still return
5076 # 0. For the shared socket, the python value is recreated
5077 # from the actual value, so it may not compare correctly.
5078 if org.proto != 0:
5079 self.assertEqual(org.proto, other.proto)
5080
5081 def testShareLocal(self):
5082 data = self.serv.share(os.getpid())
5083 s = socket.fromshare(data)
5084 try:
5085 self.compareSockets(self.serv, s)
5086 finally:
5087 s.close()
5088
5089 def testTypes(self):
5090 families = [socket.AF_INET, socket.AF_INET6]
5091 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5092 for f in families:
5093 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005094 try:
5095 source = socket.socket(f, t)
5096 except OSError:
5097 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005098 try:
5099 data = source.share(os.getpid())
5100 shared = socket.fromshare(data)
5101 try:
5102 self.compareSockets(source, shared)
5103 finally:
5104 shared.close()
5105 finally:
5106 source.close()
5107
5108
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005109@unittest.skipUnless(thread, 'Threading required for this test.')
5110class SendfileUsingSendTest(ThreadedTCPSocketTest):
5111 """
5112 Test the send() implementation of socket.sendfile().
5113 """
5114
5115 FILESIZE = (10 * 1024 * 1024) # 10MB
5116 BUFSIZE = 8192
5117 FILEDATA = b""
5118 TIMEOUT = 2
5119
5120 @classmethod
5121 def setUpClass(cls):
5122 def chunks(total, step):
5123 assert total >= step
5124 while total > step:
5125 yield step
5126 total -= step
5127 if total:
5128 yield total
5129
5130 chunk = b"".join([random.choice(string.ascii_letters).encode()
5131 for i in range(cls.BUFSIZE)])
5132 with open(support.TESTFN, 'wb') as f:
5133 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5134 f.write(chunk)
5135 with open(support.TESTFN, 'rb') as f:
5136 cls.FILEDATA = f.read()
5137 assert len(cls.FILEDATA) == cls.FILESIZE
5138
5139 @classmethod
5140 def tearDownClass(cls):
5141 support.unlink(support.TESTFN)
5142
5143 def accept_conn(self):
5144 self.serv.settimeout(self.TIMEOUT)
5145 conn, addr = self.serv.accept()
5146 conn.settimeout(self.TIMEOUT)
5147 self.addCleanup(conn.close)
5148 return conn
5149
5150 def recv_data(self, conn):
5151 received = []
5152 while True:
5153 chunk = conn.recv(self.BUFSIZE)
5154 if not chunk:
5155 break
5156 received.append(chunk)
5157 return b''.join(received)
5158
5159 def meth_from_sock(self, sock):
5160 # Depending on the mixin class being run return either send()
5161 # or sendfile() method implementation.
5162 return getattr(sock, "_sendfile_use_send")
5163
5164 # regular file
5165
5166 def _testRegularFile(self):
5167 address = self.serv.getsockname()
5168 file = open(support.TESTFN, 'rb')
5169 with socket.create_connection(address) as sock, file as file:
5170 meth = self.meth_from_sock(sock)
5171 sent = meth(file)
5172 self.assertEqual(sent, self.FILESIZE)
5173 self.assertEqual(file.tell(), self.FILESIZE)
5174
5175 def testRegularFile(self):
5176 conn = self.accept_conn()
5177 data = self.recv_data(conn)
5178 self.assertEqual(len(data), self.FILESIZE)
5179 self.assertEqual(data, self.FILEDATA)
5180
5181 # non regular file
5182
5183 def _testNonRegularFile(self):
5184 address = self.serv.getsockname()
5185 file = io.BytesIO(self.FILEDATA)
5186 with socket.create_connection(address) as sock, file as file:
5187 sent = sock.sendfile(file)
5188 self.assertEqual(sent, self.FILESIZE)
5189 self.assertEqual(file.tell(), self.FILESIZE)
5190 self.assertRaises(socket._GiveupOnSendfile,
5191 sock._sendfile_use_sendfile, file)
5192
5193 def testNonRegularFile(self):
5194 conn = self.accept_conn()
5195 data = self.recv_data(conn)
5196 self.assertEqual(len(data), self.FILESIZE)
5197 self.assertEqual(data, self.FILEDATA)
5198
5199 # empty file
5200
5201 def _testEmptyFileSend(self):
5202 address = self.serv.getsockname()
5203 filename = support.TESTFN + "2"
5204 with open(filename, 'wb'):
5205 self.addCleanup(support.unlink, filename)
5206 file = open(filename, 'rb')
5207 with socket.create_connection(address) as sock, file as file:
5208 meth = self.meth_from_sock(sock)
5209 sent = meth(file)
5210 self.assertEqual(sent, 0)
5211 self.assertEqual(file.tell(), 0)
5212
5213 def testEmptyFileSend(self):
5214 conn = self.accept_conn()
5215 data = self.recv_data(conn)
5216 self.assertEqual(data, b"")
5217
5218 # offset
5219
5220 def _testOffset(self):
5221 address = self.serv.getsockname()
5222 file = open(support.TESTFN, 'rb')
5223 with socket.create_connection(address) as sock, file as file:
5224 meth = self.meth_from_sock(sock)
5225 sent = meth(file, offset=5000)
5226 self.assertEqual(sent, self.FILESIZE - 5000)
5227 self.assertEqual(file.tell(), self.FILESIZE)
5228
5229 def testOffset(self):
5230 conn = self.accept_conn()
5231 data = self.recv_data(conn)
5232 self.assertEqual(len(data), self.FILESIZE - 5000)
5233 self.assertEqual(data, self.FILEDATA[5000:])
5234
5235 # count
5236
5237 def _testCount(self):
5238 address = self.serv.getsockname()
5239 file = open(support.TESTFN, 'rb')
5240 with socket.create_connection(address, timeout=2) as sock, file as file:
5241 count = 5000007
5242 meth = self.meth_from_sock(sock)
5243 sent = meth(file, count=count)
5244 self.assertEqual(sent, count)
5245 self.assertEqual(file.tell(), count)
5246
5247 def testCount(self):
5248 count = 5000007
5249 conn = self.accept_conn()
5250 data = self.recv_data(conn)
5251 self.assertEqual(len(data), count)
5252 self.assertEqual(data, self.FILEDATA[:count])
5253
5254 # count small
5255
5256 def _testCountSmall(self):
5257 address = self.serv.getsockname()
5258 file = open(support.TESTFN, 'rb')
5259 with socket.create_connection(address, timeout=2) as sock, file as file:
5260 count = 1
5261 meth = self.meth_from_sock(sock)
5262 sent = meth(file, count=count)
5263 self.assertEqual(sent, count)
5264 self.assertEqual(file.tell(), count)
5265
5266 def testCountSmall(self):
5267 count = 1
5268 conn = self.accept_conn()
5269 data = self.recv_data(conn)
5270 self.assertEqual(len(data), count)
5271 self.assertEqual(data, self.FILEDATA[:count])
5272
5273 # count + offset
5274
5275 def _testCountWithOffset(self):
5276 address = self.serv.getsockname()
5277 file = open(support.TESTFN, 'rb')
5278 with socket.create_connection(address, timeout=2) as sock, file as file:
5279 count = 100007
5280 meth = self.meth_from_sock(sock)
5281 sent = meth(file, offset=2007, count=count)
5282 self.assertEqual(sent, count)
5283 self.assertEqual(file.tell(), count + 2007)
5284
5285 def testCountWithOffset(self):
5286 count = 100007
5287 conn = self.accept_conn()
5288 data = self.recv_data(conn)
5289 self.assertEqual(len(data), count)
5290 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5291
5292 # non blocking sockets are not supposed to work
5293
5294 def _testNonBlocking(self):
5295 address = self.serv.getsockname()
5296 file = open(support.TESTFN, 'rb')
5297 with socket.create_connection(address) as sock, file as file:
5298 sock.setblocking(False)
5299 meth = self.meth_from_sock(sock)
5300 self.assertRaises(ValueError, meth, file)
5301 self.assertRaises(ValueError, sock.sendfile, file)
5302
5303 def testNonBlocking(self):
5304 conn = self.accept_conn()
5305 if conn.recv(8192):
5306 self.fail('was not supposed to receive any data')
5307
5308 # timeout (non-triggered)
5309
5310 def _testWithTimeout(self):
5311 address = self.serv.getsockname()
5312 file = open(support.TESTFN, 'rb')
5313 with socket.create_connection(address, timeout=2) as sock, file as file:
5314 meth = self.meth_from_sock(sock)
5315 sent = meth(file)
5316 self.assertEqual(sent, self.FILESIZE)
5317
5318 def testWithTimeout(self):
5319 conn = self.accept_conn()
5320 data = self.recv_data(conn)
5321 self.assertEqual(len(data), self.FILESIZE)
5322 self.assertEqual(data, self.FILEDATA)
5323
5324 # timeout (triggered)
5325
5326 def _testWithTimeoutTriggeredSend(self):
5327 address = self.serv.getsockname()
5328 file = open(support.TESTFN, 'rb')
5329 with socket.create_connection(address, timeout=0.01) as sock, \
5330 file as file:
5331 meth = self.meth_from_sock(sock)
5332 self.assertRaises(socket.timeout, meth, file)
5333
5334 def testWithTimeoutTriggeredSend(self):
5335 conn = self.accept_conn()
5336 conn.recv(88192)
5337
5338 # errors
5339
5340 def _test_errors(self):
5341 pass
5342
5343 def test_errors(self):
5344 with open(support.TESTFN, 'rb') as file:
5345 with socket.socket(type=socket.SOCK_DGRAM) as s:
5346 meth = self.meth_from_sock(s)
5347 self.assertRaisesRegex(
5348 ValueError, "SOCK_STREAM", meth, file)
5349 with open(support.TESTFN, 'rt') as file:
5350 with socket.socket() as s:
5351 meth = self.meth_from_sock(s)
5352 self.assertRaisesRegex(
5353 ValueError, "binary mode", meth, file)
5354 with open(support.TESTFN, 'rb') as file:
5355 with socket.socket() as s:
5356 meth = self.meth_from_sock(s)
5357 self.assertRaisesRegex(TypeError, "positive integer",
5358 meth, file, count='2')
5359 self.assertRaisesRegex(TypeError, "positive integer",
5360 meth, file, count=0.1)
5361 self.assertRaisesRegex(ValueError, "positive integer",
5362 meth, file, count=0)
5363 self.assertRaisesRegex(ValueError, "positive integer",
5364 meth, file, count=-1)
5365
5366
5367@unittest.skipUnless(thread, 'Threading required for this test.')
5368@unittest.skipUnless(hasattr(os, "sendfile"),
5369 'os.sendfile() required for this test.')
5370class SendfileUsingSendfileTest(SendfileUsingSendTest):
5371 """
5372 Test the sendfile() implementation of socket.sendfile().
5373 """
5374 def meth_from_sock(self, sock):
5375 return getattr(sock, "_sendfile_use_sendfile")
5376
5377
Guido van Rossumb995eb72002-07-31 16:08:40 +00005378def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005379 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005380 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005381
5382 tests.extend([
5383 NonBlockingTCPTests,
5384 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005385 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005386 UnbufferedFileObjectClassTestCase,
5387 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005388 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005389 UnicodeReadFileObjectClassTestCase,
5390 UnicodeWriteFileObjectClassTestCase,
5391 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005392 NetworkConnectionNoServer,
5393 NetworkConnectionAttributesTest,
5394 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005395 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005396 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005397 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005398 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005399 tests.append(BasicSocketPairTest)
5400 tests.append(TestUnixDomain)
5401 tests.append(TestLinuxAbstractNamespace)
5402 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005403 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005404 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005405 tests.extend([
5406 CmsgMacroTests,
5407 SendmsgUDPTest,
5408 RecvmsgUDPTest,
5409 RecvmsgIntoUDPTest,
5410 SendmsgUDP6Test,
5411 RecvmsgUDP6Test,
5412 RecvmsgRFC3542AncillaryUDP6Test,
5413 RecvmsgIntoRFC3542AncillaryUDP6Test,
5414 RecvmsgIntoUDP6Test,
5415 SendmsgTCPTest,
5416 RecvmsgTCPTest,
5417 RecvmsgIntoTCPTest,
5418 SendmsgSCTPStreamTest,
5419 RecvmsgSCTPStreamTest,
5420 RecvmsgIntoSCTPStreamTest,
5421 SendmsgUnixStreamTest,
5422 RecvmsgUnixStreamTest,
5423 RecvmsgIntoUnixStreamTest,
5424 RecvmsgSCMRightsStreamTest,
5425 RecvmsgIntoSCMRightsStreamTest,
5426 # These are slow when setitimer() is not available
5427 InterruptedRecvTimeoutTest,
5428 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005429 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005430 SendfileUsingSendTest,
5431 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005432 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005433
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005434 thread_info = support.threading_setup()
5435 support.run_unittest(*tests)
5436 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005437
5438if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005439 test_main()