blob: c5975c8c9e5613ea418d21e516f8b7dd9376fa1e [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
Martin Panter46f50722016-05-26 05:35:26 +0000202 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000203 '_' to indicate the client portion of the test. Ex:
204
205 def testFoo(self):
206 # Server portion
207
208 def _testFoo(self):
209 # Client portion
210
211 Any exceptions raised by the clients during their tests
212 are caught and transferred to the main thread to alert
213 the testing framework.
214
215 Note, the server setup function cannot call any blocking
216 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 the blocking call (such as in setting up a client/server
219 connection and performing the accept() in setUp().
220 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221
222 def __init__(self):
223 # Swap the true setup function
224 self.__setUp = self.setUp
225 self.__tearDown = self.tearDown
226 self.setUp = self._setUp
227 self.tearDown = self._tearDown
228
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 def serverExplicitReady(self):
230 """This method allows the server to explicitly indicate that
231 it wants the client thread to proceed. This is useful if the
232 server is about to execute a blocking routine that is
233 dependent upon the client thread during its setup routine."""
234 self.server_ready.set()
235
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000237 self.server_ready = threading.Event()
238 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000240 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200241 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242
243 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000244 methodname = self.id()
245 i = methodname.rfind('.')
246 methodname = methodname[i+1:]
247 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000248 self.client_thread = thread.start_new_thread(
249 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200251 try:
252 self.__setUp()
253 except:
254 self.server_crashed = True
255 raise
256 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000257 self.server_ready.set()
258 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259
260 def _tearDown(self):
261 self.__tearDown()
262 self.done.wait()
263
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000264 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000265 exc = self.queue.get()
266 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267
268 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000269 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200271 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200272 if self.server_crashed:
273 self.clientTearDown()
274 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000275 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000276 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 try:
278 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000279 except BaseException as e:
280 self.queue.put(e)
281 finally:
282 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283
284 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000285 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286
287 def clientTearDown(self):
288 self.done.set()
289 thread.exit()
290
291class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
292
293 def __init__(self, methodName='runTest'):
294 SocketTCPTest.__init__(self, methodName=methodName)
295 ThreadableTest.__init__(self)
296
297 def clientSetUp(self):
298 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
299
300 def clientTearDown(self):
301 self.cli.close()
302 self.cli = None
303 ThreadableTest.clientTearDown(self)
304
305class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
306
307 def __init__(self, methodName='runTest'):
308 SocketUDPTest.__init__(self, methodName=methodName)
309 ThreadableTest.__init__(self)
310
311 def clientSetUp(self):
312 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
313
Brian Curtin3beb38f2010-11-04 03:41:43 +0000314 def clientTearDown(self):
315 self.cli.close()
316 self.cli = None
317 ThreadableTest.clientTearDown(self)
318
Charles-François Natali47413c12011-10-06 19:47:44 +0200319class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
320
321 def __init__(self, methodName='runTest'):
322 SocketCANTest.__init__(self, methodName=methodName)
323 ThreadableTest.__init__(self)
324
325 def clientSetUp(self):
326 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
327 try:
328 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200329 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200330 # skipTest should not be called here, and will be called in the
331 # server instead
332 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200333
334 def clientTearDown(self):
335 self.cli.close()
336 self.cli = None
337 ThreadableTest.clientTearDown(self)
338
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100339class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
340
341 def __init__(self, methodName='runTest'):
342 SocketRDSTest.__init__(self, methodName=methodName)
343 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100344
345 def clientSetUp(self):
346 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
347 try:
348 # RDS sockets must be bound explicitly to send or receive data
349 self.cli.bind((HOST, 0))
350 self.cli_addr = self.cli.getsockname()
351 except OSError:
352 # skipTest should not be called here, and will be called in the
353 # server instead
354 pass
355
356 def clientTearDown(self):
357 self.cli.close()
358 self.cli = None
359 ThreadableTest.clientTearDown(self)
360
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000362 """Socket tests for client-server connection.
363
364 self.cli_conn is a client socket connected to the server. The
365 setUp() method guarantees that it is connected to the server.
366 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000367
368 def __init__(self, methodName='runTest'):
369 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
370
371 def setUp(self):
372 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000373 # Indicate explicitly we're ready for the client thread to
374 # proceed and then perform the blocking call to accept
375 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 conn, addr = self.serv.accept()
377 self.cli_conn = conn
378
379 def tearDown(self):
380 self.cli_conn.close()
381 self.cli_conn = None
382 ThreadedTCPSocketTest.tearDown(self)
383
384 def clientSetUp(self):
385 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000386 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 self.serv_conn = self.cli
388
389 def clientTearDown(self):
390 self.serv_conn.close()
391 self.serv_conn = None
392 ThreadedTCPSocketTest.clientTearDown(self)
393
Dave Cole331708b2004-08-09 04:51:41 +0000394class SocketPairTest(unittest.TestCase, ThreadableTest):
395
396 def __init__(self, methodName='runTest'):
397 unittest.TestCase.__init__(self, methodName=methodName)
398 ThreadableTest.__init__(self)
399
400 def setUp(self):
401 self.serv, self.cli = socket.socketpair()
402
403 def tearDown(self):
404 self.serv.close()
405 self.serv = None
406
407 def clientSetUp(self):
408 pass
409
410 def clientTearDown(self):
411 self.cli.close()
412 self.cli = None
413 ThreadableTest.clientTearDown(self)
414
Tim Peters494aaee2004-08-09 18:54:11 +0000415
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000416# The following classes are used by the sendmsg()/recvmsg() tests.
417# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
418# gives a drop-in replacement for SocketConnectedTest, but different
419# address families can be used, and the attributes serv_addr and
420# cli_addr will be set to the addresses of the endpoints.
421
422class SocketTestBase(unittest.TestCase):
423 """A base class for socket tests.
424
425 Subclasses must provide methods newSocket() to return a new socket
426 and bindSock(sock) to bind it to an unused address.
427
428 Creates a socket self.serv and sets self.serv_addr to its address.
429 """
430
431 def setUp(self):
432 self.serv = self.newSocket()
433 self.bindServer()
434
435 def bindServer(self):
436 """Bind server socket and set self.serv_addr to its address."""
437 self.bindSock(self.serv)
438 self.serv_addr = self.serv.getsockname()
439
440 def tearDown(self):
441 self.serv.close()
442 self.serv = None
443
444
445class SocketListeningTestMixin(SocketTestBase):
446 """Mixin to listen on the server socket."""
447
448 def setUp(self):
449 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100450 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000451
452
453class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
454 ThreadableTest):
455 """Mixin to add client socket and allow client/server tests.
456
457 Client socket is self.cli and its address is self.cli_addr. See
458 ThreadableTest for usage information.
459 """
460
461 def __init__(self, *args, **kwargs):
462 super().__init__(*args, **kwargs)
463 ThreadableTest.__init__(self)
464
465 def clientSetUp(self):
466 self.cli = self.newClientSocket()
467 self.bindClient()
468
469 def newClientSocket(self):
470 """Return a new socket for use as client."""
471 return self.newSocket()
472
473 def bindClient(self):
474 """Bind client socket and set self.cli_addr to its address."""
475 self.bindSock(self.cli)
476 self.cli_addr = self.cli.getsockname()
477
478 def clientTearDown(self):
479 self.cli.close()
480 self.cli = None
481 ThreadableTest.clientTearDown(self)
482
483
484class ConnectedStreamTestMixin(SocketListeningTestMixin,
485 ThreadedSocketTestMixin):
486 """Mixin to allow client/server stream tests with connected client.
487
488 Server's socket representing connection to client is self.cli_conn
489 and client's connection to server is self.serv_conn. (Based on
490 SocketConnectedTest.)
491 """
492
493 def setUp(self):
494 super().setUp()
495 # Indicate explicitly we're ready for the client thread to
496 # proceed and then perform the blocking call to accept
497 self.serverExplicitReady()
498 conn, addr = self.serv.accept()
499 self.cli_conn = conn
500
501 def tearDown(self):
502 self.cli_conn.close()
503 self.cli_conn = None
504 super().tearDown()
505
506 def clientSetUp(self):
507 super().clientSetUp()
508 self.cli.connect(self.serv_addr)
509 self.serv_conn = self.cli
510
511 def clientTearDown(self):
512 self.serv_conn.close()
513 self.serv_conn = None
514 super().clientTearDown()
515
516
517class UnixSocketTestBase(SocketTestBase):
518 """Base class for Unix-domain socket tests."""
519
520 # This class is used for file descriptor passing tests, so we
521 # create the sockets in a private directory so that other users
522 # can't send anything that might be problematic for a privileged
523 # user running the tests.
524
525 def setUp(self):
526 self.dir_path = tempfile.mkdtemp()
527 self.addCleanup(os.rmdir, self.dir_path)
528 super().setUp()
529
530 def bindSock(self, sock):
531 path = tempfile.mktemp(dir=self.dir_path)
532 sock.bind(path)
533 self.addCleanup(support.unlink, path)
534
535class UnixStreamBase(UnixSocketTestBase):
536 """Base class for Unix-domain SOCK_STREAM tests."""
537
538 def newSocket(self):
539 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
540
541
542class InetTestBase(SocketTestBase):
543 """Base class for IPv4 socket tests."""
544
545 host = HOST
546
547 def setUp(self):
548 super().setUp()
549 self.port = self.serv_addr[1]
550
551 def bindSock(self, sock):
552 support.bind_port(sock, host=self.host)
553
554class TCPTestBase(InetTestBase):
555 """Base class for TCP-over-IPv4 tests."""
556
557 def newSocket(self):
558 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
559
560class UDPTestBase(InetTestBase):
561 """Base class for UDP-over-IPv4 tests."""
562
563 def newSocket(self):
564 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
565
566class SCTPStreamBase(InetTestBase):
567 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
568
569 def newSocket(self):
570 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
571 socket.IPPROTO_SCTP)
572
573
574class Inet6TestBase(InetTestBase):
575 """Base class for IPv6 socket tests."""
576
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200577 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000578
579class UDP6TestBase(Inet6TestBase):
580 """Base class for UDP-over-IPv6 tests."""
581
582 def newSocket(self):
583 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
584
585
586# Test-skipping decorators for use with ThreadableTest.
587
588def skipWithClientIf(condition, reason):
589 """Skip decorated test if condition is true, add client_skip decorator.
590
591 If the decorated object is not a class, sets its attribute
592 "client_skip" to a decorator which will return an empty function
593 if the test is to be skipped, or the original function if it is
594 not. This can be used to avoid running the client part of a
595 skipped test when using ThreadableTest.
596 """
597 def client_pass(*args, **kwargs):
598 pass
599 def skipdec(obj):
600 retval = unittest.skip(reason)(obj)
601 if not isinstance(obj, type):
602 retval.client_skip = lambda f: client_pass
603 return retval
604 def noskipdec(obj):
605 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
606 obj.client_skip = lambda f: f
607 return obj
608 return skipdec if condition else noskipdec
609
610
611def requireAttrs(obj, *attributes):
612 """Skip decorated test if obj is missing any of the given attributes.
613
614 Sets client_skip attribute as skipWithClientIf() does.
615 """
616 missing = [name for name in attributes if not hasattr(obj, name)]
617 return skipWithClientIf(
618 missing, "don't have " + ", ".join(name for name in missing))
619
620
621def requireSocket(*args):
622 """Skip decorated test if a socket cannot be created with given arguments.
623
624 When an argument is given as a string, will use the value of that
625 attribute of the socket module, or skip the test if it doesn't
626 exist. Sets client_skip attribute as skipWithClientIf() does.
627 """
628 err = None
629 missing = [obj for obj in args if
630 isinstance(obj, str) and not hasattr(socket, obj)]
631 if missing:
632 err = "don't have " + ", ".join(name for name in missing)
633 else:
634 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
635 for obj in args]
636 try:
637 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200638 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000639 # XXX: check errno?
640 err = str(e)
641 else:
642 s.close()
643 return skipWithClientIf(
644 err is not None,
645 "can't create socket({0}): {1}".format(
646 ", ".join(str(o) for o in args), err))
647
648
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649#######################################################################
650## Begin Tests
651
652class GeneralModuleTests(unittest.TestCase):
653
Ethan Furman7184bac2014-10-14 18:56:53 -0700654 def test_SocketType_is_socketobject(self):
655 import _socket
656 self.assertTrue(socket.SocketType is _socket.socket)
657 s = socket.socket()
658 self.assertIsInstance(s, socket.SocketType)
659 s.close()
660
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000661 def test_repr(self):
662 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200663 with s:
664 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000665 self.assertIn('family=%s' % socket.AF_INET, repr(s))
666 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200667 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200668 self.assertNotIn('raddr', repr(s))
669 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200670 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200671 self.assertIn(str(s.getsockname()), repr(s))
672 self.assertIn('[closed]', repr(s))
673 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000674
Victor Stinnere254e532014-07-26 14:36:55 +0200675 @unittest.skipUnless(_socket is not None, 'need _socket module')
676 def test_csocket_repr(self):
677 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
678 try:
679 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
680 % (s.fileno(), s.family, s.type, s.proto))
681 self.assertEqual(repr(s), expected)
682 finally:
683 s.close()
684 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
685 % (s.family, s.type, s.proto))
686 self.assertEqual(repr(s), expected)
687
Raymond Hettinger027bb632004-05-31 03:09:25 +0000688 def test_weakref(self):
689 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
690 p = proxy(s)
691 self.assertEqual(p.fileno(), s.fileno())
692 s.close()
693 s = None
694 try:
695 p.fileno()
696 except ReferenceError:
697 pass
698 else:
699 self.fail('Socket proxy still exists')
700
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300703 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200704 with self.assertRaises(OSError, msg=msg % 'OSError'):
705 raise OSError
706 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200708 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710
Ezio Melotti63e42302011-05-07 19:47:48 +0300711 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000712 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300713 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
714 self.addCleanup(s.close)
715 s.bind(('', 0))
716 sockname = s.getsockname()
717 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300719 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300720 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400721 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300723 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300724 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400725 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300726 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300727 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300728 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300729 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300730 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300732 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400733 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300734 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300735 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300736 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400737 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300739 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300740 self.assertIn('not NoneType', str(cm.exception))
741 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300742 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300743 self.assertIn('an integer is required', str(cm.exception))
744 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300745 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300749 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300750 self.assertIn('(1 given)', str(cm.exception))
751 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300752 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300753 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300754
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 socket.AF_INET
758 socket.SOCK_STREAM
759 socket.SOCK_DGRAM
760 socket.SOCK_RAW
761 socket.SOCK_RDM
762 socket.SOCK_SEQPACKET
763 socket.SOL_SOCKET
764 socket.SO_REUSEADDR
765
Guido van Rossum654c11e2002-06-13 20:24:17 +0000766 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000768 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000769 try:
770 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200771 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000772 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600773 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000774 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000775 try:
776 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200777 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000778 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600779 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000780 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000781 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000782 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000783 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000784
Charles-François Natali0cc86852013-09-13 19:53:08 +0200785 def test_host_resolution(self):
786 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
787 '1:1:1:1:1:1:1:1:1']:
788 self.assertRaises(OSError, socket.gethostbyname, addr)
789 self.assertRaises(OSError, socket.gethostbyaddr, addr)
790
791 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
792 self.assertEqual(socket.gethostbyname(addr), addr)
793
794 # we don't test support.HOSTv6 because there's a chance it doesn't have
795 # a matching name entry (e.g. 'ip6-localhost')
796 for host in [support.HOST]:
797 self.assertIn(host, socket.gethostbyaddr(host)[2])
798
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000799 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
800 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
801 def test_sethostname(self):
802 oldhn = socket.gethostname()
803 try:
804 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200805 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000806 if e.errno == errno.EPERM:
807 self.skipTest("test should be run as root")
808 else:
809 raise
810 try:
811 # running test as root!
812 self.assertEqual(socket.gethostname(), 'new')
813 # Should work with bytes objects too
814 socket.sethostname(b'bar')
815 self.assertEqual(socket.gethostname(), 'bar')
816 finally:
817 socket.sethostname(oldhn)
818
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700819 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
820 'socket.if_nameindex() not available.')
821 def testInterfaceNameIndex(self):
822 interfaces = socket.if_nameindex()
823 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200824 self.assertIsInstance(index, int)
825 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700826 # interface indices are non-zero integers
827 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200828 _index = socket.if_nametoindex(name)
829 self.assertIsInstance(_index, int)
830 self.assertEqual(index, _index)
831 _name = socket.if_indextoname(index)
832 self.assertIsInstance(_name, str)
833 self.assertEqual(name, _name)
834
835 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
836 'socket.if_nameindex() not available.')
837 def testInvalidInterfaceNameIndex(self):
838 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200839 self.assertRaises(OSError, socket.if_indextoname, 0)
840 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200841 # test with invalid values
842 self.assertRaises(TypeError, socket.if_nametoindex, 0)
843 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700844
Serhiy Storchaka43767632013-11-03 21:31:38 +0200845 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
846 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000847 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200849 try:
850 # On some versions, this loses a reference
851 orig = sys.getrefcount(__name__)
852 socket.getnameinfo(__name__,0)
853 except TypeError:
854 if sys.getrefcount(__name__) != orig:
855 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000856
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 try:
860 # On some versions, this crashes the interpreter.
861 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200862 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000864
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000865 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000866 # This just checks that htons etc. are their own inverse,
867 # when looking at the lower 16 or 32 bits.
868 sizes = {socket.htonl: 32, socket.ntohl: 32,
869 socket.htons: 16, socket.ntohs: 16}
870 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000871 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000872 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
873 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000874
Guido van Rossuma2627af2002-09-14 00:58:46 +0000875 swapped = func(mask)
876 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000877 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000878
Guido van Rossum018919a2007-01-15 00:07:32 +0000879 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000880 good_values = [ 1, 2, 3, 1, 2, 3 ]
881 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000882 for k in good_values:
883 socket.ntohl(k)
884 socket.ntohs(k)
885 socket.htonl(k)
886 socket.htons(k)
887 for k in bad_values:
888 self.assertRaises(OverflowError, socket.ntohl, k)
889 self.assertRaises(OverflowError, socket.ntohs, k)
890 self.assertRaises(OverflowError, socket.htonl, k)
891 self.assertRaises(OverflowError, socket.htons, k)
892
Barry Warsaw11b91a02004-06-28 00:50:43 +0000893 def testGetServBy(self):
894 eq = self.assertEqual
895 # Find one service that exists, then check all the related interfaces.
896 # I've ordered this by protocols that have both a tcp and udp
897 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200898 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200899 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000900 # avoid the 'echo' service on this platform, as there is an
901 # assumption breaking non-standard port/protocol entry
902 services = ('daytime', 'qotd', 'domain')
903 else:
904 services = ('echo', 'daytime', 'domain')
905 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000906 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000907 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000908 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200909 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000910 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000911 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200912 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000913 # Try same call with optional protocol omitted
914 port2 = socket.getservbyname(service)
915 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400916 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000917 try:
918 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200919 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000920 udpport = None
921 else:
922 eq(udpport, port)
923 # Now make sure the lookup by port returns the same service name
924 eq(socket.getservbyport(port2), service)
925 eq(socket.getservbyport(port, 'tcp'), service)
926 if udpport is not None:
927 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000928 # Make sure getservbyport does not accept out of range ports.
929 self.assertRaises(OverflowError, socket.getservbyport, -1)
930 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000932 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000934 # The default timeout should initially be None
935 self.assertEqual(socket.getdefaulttimeout(), None)
936 s = socket.socket()
937 self.assertEqual(s.gettimeout(), None)
938 s.close()
939
940 # Set the default timeout to 10, and see if it propagates
941 socket.setdefaulttimeout(10)
942 self.assertEqual(socket.getdefaulttimeout(), 10)
943 s = socket.socket()
944 self.assertEqual(s.gettimeout(), 10)
945 s.close()
946
947 # Reset the default timeout to None, and see if it propagates
948 socket.setdefaulttimeout(None)
949 self.assertEqual(socket.getdefaulttimeout(), None)
950 s = socket.socket()
951 self.assertEqual(s.gettimeout(), None)
952 s.close()
953
954 # Check that setting it to an invalid value raises ValueError
955 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
956
957 # Check that setting it to an invalid type raises TypeError
958 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
959
Serhiy Storchaka43767632013-11-03 21:31:38 +0200960 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
961 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000962 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000963 # Test that issue1008086 and issue767150 are fixed.
964 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000965 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
966 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000967
Serhiy Storchaka43767632013-11-03 21:31:38 +0200968 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
969 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000970 def testIPv4toString(self):
971 from socket import inet_aton as f, inet_pton, AF_INET
972 g = lambda a: inet_pton(AF_INET, a)
973
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100974 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200975 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100976 )
977
Ezio Melottib3aedd42010-11-20 19:04:17 +0000978 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
979 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
980 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
981 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
982 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100983 assertInvalid(f, '0.0.0.')
984 assertInvalid(f, '300.0.0.0')
985 assertInvalid(f, 'a.0.0.0')
986 assertInvalid(f, '1.2.3.4.5')
987 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000988
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
990 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
991 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
992 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100993 assertInvalid(g, '0.0.0.')
994 assertInvalid(g, '300.0.0.0')
995 assertInvalid(g, 'a.0.0.0')
996 assertInvalid(g, '1.2.3.4.5')
997 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000998
Serhiy Storchaka43767632013-11-03 21:31:38 +0200999 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1000 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001001 def testIPv6toString(self):
1002 try:
1003 from socket import inet_pton, AF_INET6, has_ipv6
1004 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001005 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001006 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001007 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001008
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001009 if sys.platform == "win32":
1010 try:
1011 inet_pton(AF_INET6, '::')
1012 except OSError as e:
1013 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001014 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001015
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001017 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001018 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001019 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001020
Ezio Melottib3aedd42010-11-20 19:04:17 +00001021 self.assertEqual(b'\x00' * 16, f('::'))
1022 self.assertEqual(b'\x00' * 16, f('0::0'))
1023 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1024 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001025 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001026 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1027 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 self.assertEqual(
1029 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1030 f('ad42:abc::127:0:254:2')
1031 )
1032 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1033 assertInvalid('0x20::')
1034 assertInvalid(':::')
1035 assertInvalid('::0::')
1036 assertInvalid('1::abc::')
1037 assertInvalid('1::abc::def')
1038 assertInvalid('1:2:3:4:5:6:')
1039 assertInvalid('1:2:3:4:5:6')
1040 assertInvalid('1:2:3:4:5:6:7:8:')
1041 assertInvalid('1:2:3:4:5:6:7:8:0')
1042
1043 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1044 f('::254.42.23.64')
1045 )
1046 self.assertEqual(
1047 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1048 f('42::a29b:254.42.23.64')
1049 )
1050 self.assertEqual(
1051 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1052 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1053 )
1054 assertInvalid('255.254.253.252')
1055 assertInvalid('1::260.2.3.0')
1056 assertInvalid('1::0.be.e.0')
1057 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1058 assertInvalid('::1.2.3.4:0')
1059 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001060
Serhiy Storchaka43767632013-11-03 21:31:38 +02001061 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1062 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001063 def testStringToIPv4(self):
1064 from socket import inet_ntoa as f, inet_ntop, AF_INET
1065 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001066 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001067 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001068 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001069
Ezio Melottib3aedd42010-11-20 19:04:17 +00001070 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1071 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1072 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1073 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001074 assertInvalid(f, b'\x00' * 3)
1075 assertInvalid(f, b'\x00' * 5)
1076 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001077 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001078
Ezio Melottib3aedd42010-11-20 19:04:17 +00001079 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1080 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1081 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001082 assertInvalid(g, b'\x00' * 3)
1083 assertInvalid(g, b'\x00' * 5)
1084 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001085 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001086
Serhiy Storchaka43767632013-11-03 21:31:38 +02001087 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1088 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001089 def testStringToIPv6(self):
1090 try:
1091 from socket import inet_ntop, AF_INET6, has_ipv6
1092 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001093 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001094 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001095 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001096
1097 if sys.platform == "win32":
1098 try:
1099 inet_ntop(AF_INET6, b'\x00' * 16)
1100 except OSError as e:
1101 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001102 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001103
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001104 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001105 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001106 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001107 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual('::', f(b'\x00' * 16))
1110 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1111 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001112 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001113 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001114 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001115 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001116
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001117 assertInvalid(b'\x12' * 15)
1118 assertInvalid(b'\x12' * 17)
1119 assertInvalid(b'\x12' * 4)
1120
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001121 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001122
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001123 def testSockName(self):
1124 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001125 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001127 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001128 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001129 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001130 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1131 # it reasonable to get the host's addr in addition to 0.0.0.0.
1132 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001133 try:
1134 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001135 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001136 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001137 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001138 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001139 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140
1141 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001142 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 # We know a socket should start without reuse==0
1144 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001145 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001146 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001147 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148
1149 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001150 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001152 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1154 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001155 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001156
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001157 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001158 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001159 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1160 sock.settimeout(1)
1161 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001162 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001163
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001164 def testNewAttributes(self):
1165 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001166
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001167 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1168 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001169 if hasattr(socket, 'SOCK_CLOEXEC'):
1170 self.assertIn(sock.type,
1171 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1172 socket.SOCK_STREAM))
1173 else:
1174 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001175 self.assertEqual(sock.proto, 0)
1176 sock.close()
1177
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001178 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001179 sock = socket.socket()
1180 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001181 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001182 big_port = port + 65536
1183 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001184 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1185 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1186 # Since find_unused_port() is inherently subject to race conditions, we
1187 # call it a couple times if necessary.
1188 for i in itertools.count():
1189 port = support.find_unused_port()
1190 try:
1191 sock.bind((HOST, port))
1192 except OSError as e:
1193 if e.errno != errno.EADDRINUSE or i == 5:
1194 raise
1195 else:
1196 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001197
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001198 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001199 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001200 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1201 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1202 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1203 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001204 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1205 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001206 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001207 self.assertRaises(ValueError, s.ioctl, -1, None)
1208 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001209
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001210 def testGetaddrinfo(self):
1211 try:
1212 socket.getaddrinfo('localhost', 80)
1213 except socket.gaierror as err:
1214 if err.errno == socket.EAI_SERVICE:
1215 # see http://bugs.python.org/issue1282647
1216 self.skipTest("buggy libc version")
1217 raise
1218 # len of every sequence is supposed to be == 5
1219 for info in socket.getaddrinfo(HOST, None):
1220 self.assertEqual(len(info), 5)
1221 # host can be a domain name, a string representation of an
1222 # IPv4/v6 address or None
1223 socket.getaddrinfo('localhost', 80)
1224 socket.getaddrinfo('127.0.0.1', 80)
1225 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001226 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001227 socket.getaddrinfo('::1', 80)
1228 # port can be a string service name such as "http", a numeric
1229 # port number or None
1230 socket.getaddrinfo(HOST, "http")
1231 socket.getaddrinfo(HOST, 80)
1232 socket.getaddrinfo(HOST, None)
1233 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001234 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1235 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001236 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001237 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1238 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001239 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001240 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1241 for _, socktype, _, _, _ in infos:
1242 self.assertEqual(socktype, socket.SOCK_STREAM)
1243 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001244 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001245 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1246 # a server willing to support both IPv4 and IPv6 will
1247 # usually do this
1248 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1249 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001250 # test keyword arguments
1251 a = socket.getaddrinfo(HOST, None)
1252 b = socket.getaddrinfo(host=HOST, port=None)
1253 self.assertEqual(a, b)
1254 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1255 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1256 self.assertEqual(a, b)
1257 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1258 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1259 self.assertEqual(a, b)
1260 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1261 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1262 self.assertEqual(a, b)
1263 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1264 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1265 self.assertEqual(a, b)
1266 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1267 socket.AI_PASSIVE)
1268 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1269 type=socket.SOCK_STREAM, proto=0,
1270 flags=socket.AI_PASSIVE)
1271 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001272 # Issue #6697.
1273 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001274
Ned Deilyb24f4812014-02-13 22:50:42 -08001275 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001276 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001277 try:
1278 # The arguments here are undefined and the call may succeed
1279 # or fail. All we care here is that it doesn't segfault.
1280 socket.getaddrinfo("localhost", None, 0, 0, 0,
1281 socket.AI_NUMERICSERV)
1282 except socket.gaierror:
1283 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001284
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001285 def test_getnameinfo(self):
1286 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001287 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001288
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001289 @unittest.skipUnless(support.is_resource_enabled('network'),
1290 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001291 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001292 # Check for internet access before running test
1293 # (issue #12804, issue #25138).
1294 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001295 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001296
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001297 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001298 domain = 'испытание.pythontest.net'
1299 socket.gethostbyname(domain)
1300 socket.gethostbyname_ex(domain)
1301 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001302 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1303 # have a reverse entry yet
1304 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001305
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001306 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001307 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001308 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1309 self.skipTest("signal.alarm and socket.socketpair required for this test")
1310 # Our signal handlers clobber the C errno by calling a math function
1311 # with an invalid domain value.
1312 def ok_handler(*args):
1313 self.assertRaises(ValueError, math.acosh, 0)
1314 def raising_handler(*args):
1315 self.assertRaises(ValueError, math.acosh, 0)
1316 1 // 0
1317 c, s = socket.socketpair()
1318 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1319 try:
1320 if with_timeout:
1321 # Just above the one second minimum for signal.alarm
1322 c.settimeout(1.5)
1323 with self.assertRaises(ZeroDivisionError):
1324 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001325 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001326 if with_timeout:
1327 signal.signal(signal.SIGALRM, ok_handler)
1328 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001329 self.assertRaises(socket.timeout, c.sendall,
1330 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001331 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001332 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001333 signal.signal(signal.SIGALRM, old_alarm)
1334 c.close()
1335 s.close()
1336
1337 def test_sendall_interrupted(self):
1338 self.check_sendall_interrupted(False)
1339
1340 def test_sendall_interrupted_with_timeout(self):
1341 self.check_sendall_interrupted(True)
1342
Antoine Pitroue033e062010-10-29 10:38:18 +00001343 def test_dealloc_warn(self):
1344 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1345 r = repr(sock)
1346 with self.assertWarns(ResourceWarning) as cm:
1347 sock = None
1348 support.gc_collect()
1349 self.assertIn(r, str(cm.warning.args[0]))
1350 # An open socket file object gets dereferenced after the socket
1351 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1352 f = sock.makefile('rb')
1353 r = repr(sock)
1354 sock = None
1355 support.gc_collect()
1356 with self.assertWarns(ResourceWarning):
1357 f = None
1358 support.gc_collect()
1359
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001360 def test_name_closed_socketio(self):
1361 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1362 fp = sock.makefile("rb")
1363 fp.close()
1364 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1365
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001366 def test_unusable_closed_socketio(self):
1367 with socket.socket() as sock:
1368 fp = sock.makefile("rb", buffering=0)
1369 self.assertTrue(fp.readable())
1370 self.assertFalse(fp.writable())
1371 self.assertFalse(fp.seekable())
1372 fp.close()
1373 self.assertRaises(ValueError, fp.readable)
1374 self.assertRaises(ValueError, fp.writable)
1375 self.assertRaises(ValueError, fp.seekable)
1376
Berker Peksag3fe64d02016-02-18 17:34:00 +02001377 def test_makefile_mode(self):
1378 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1379 with self.subTest(mode=mode):
1380 with socket.socket() as sock:
1381 with sock.makefile(mode) as fp:
1382 self.assertEqual(fp.mode, mode)
1383
1384 def test_makefile_invalid_mode(self):
1385 for mode in 'rt', 'x', '+', 'a':
1386 with self.subTest(mode=mode):
1387 with socket.socket() as sock:
1388 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1389 sock.makefile(mode)
1390
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001391 def test_pickle(self):
1392 sock = socket.socket()
1393 with sock:
1394 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1395 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001396 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1397 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1398 self.assertEqual(family, socket.AF_INET)
1399 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1400 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001401
Serhiy Storchaka78980432013-01-15 01:12:17 +02001402 def test_listen_backlog(self):
1403 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001404 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1405 srv.bind((HOST, 0))
1406 srv.listen(backlog)
1407
1408 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001409 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001410 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001411
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001412 @support.cpython_only
1413 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001414 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001415 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001416 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1417 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001418 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001419 srv.close()
1420
Charles-François Natali42663332012-01-02 15:57:30 +01001421 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001422 def test_flowinfo(self):
1423 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001424 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001425 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001426 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001427
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001428 def test_str_for_enums(self):
1429 # Make sure that the AF_* and SOCK_* constants have enum-like string
1430 # reprs.
1431 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1432 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001433 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001434
1435 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1436 def test_uknown_socket_family_repr(self):
1437 # Test that when created with a family that's not one of the known
1438 # AF_*/SOCK_* constants, socket.family just returns the number.
1439 #
1440 # To do this we fool socket.socket into believing it already has an
1441 # open fd because on this path it doesn't actually verify the family and
1442 # type and populates the socket object.
1443 #
1444 # On Windows this trick won't work, so the test is skipped.
1445 fd, _ = tempfile.mkstemp()
1446 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1447 self.assertEqual(s.family, 42424)
1448 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001449
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001450 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1451 def test__sendfile_use_sendfile(self):
1452 class File:
1453 def __init__(self, fd):
1454 self.fd = fd
1455
1456 def fileno(self):
1457 return self.fd
1458 with socket.socket() as sock:
1459 fd = os.open(os.curdir, os.O_RDONLY)
1460 os.close(fd)
1461 with self.assertRaises(socket._GiveupOnSendfile):
1462 sock._sendfile_use_sendfile(File(fd))
1463 with self.assertRaises(OverflowError):
1464 sock._sendfile_use_sendfile(File(2**1000))
1465 with self.assertRaises(TypeError):
1466 sock._sendfile_use_sendfile(File(None))
1467
1468
Charles-François Natali47413c12011-10-06 19:47:44 +02001469@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1470class BasicCANTest(unittest.TestCase):
1471
1472 def testCrucialConstants(self):
1473 socket.AF_CAN
1474 socket.PF_CAN
1475 socket.CAN_RAW
1476
Charles-François Natali773e42d2013-02-05 19:42:01 +01001477 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1478 'socket.CAN_BCM required for this test.')
1479 def testBCMConstants(self):
1480 socket.CAN_BCM
1481
1482 # opcodes
1483 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1484 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1485 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1486 socket.CAN_BCM_TX_SEND # send one CAN frame
1487 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1488 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1489 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1490 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1491 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1492 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1493 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1494 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1495
Charles-François Natali47413c12011-10-06 19:47:44 +02001496 def testCreateSocket(self):
1497 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1498 pass
1499
Charles-François Natali773e42d2013-02-05 19:42:01 +01001500 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1501 'socket.CAN_BCM required for this test.')
1502 def testCreateBCMSocket(self):
1503 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1504 pass
1505
Charles-François Natali47413c12011-10-06 19:47:44 +02001506 def testBindAny(self):
1507 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1508 s.bind(('', ))
1509
1510 def testTooLongInterfaceName(self):
1511 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1512 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001513 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001514 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001515
1516 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1517 'socket.CAN_RAW_LOOPBACK required for this test.')
1518 def testLoopback(self):
1519 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1520 for loopback in (0, 1):
1521 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1522 loopback)
1523 self.assertEqual(loopback,
1524 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1525
1526 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1527 'socket.CAN_RAW_FILTER required for this test.')
1528 def testFilter(self):
1529 can_id, can_mask = 0x200, 0x700
1530 can_filter = struct.pack("=II", can_id, can_mask)
1531 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1532 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1533 self.assertEqual(can_filter,
1534 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001535 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001536
1537
1538@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001539@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001540class CANTest(ThreadedCANSocketTest):
1541
Charles-François Natali47413c12011-10-06 19:47:44 +02001542 def __init__(self, methodName='runTest'):
1543 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1544
1545 @classmethod
1546 def build_can_frame(cls, can_id, data):
1547 """Build a CAN frame."""
1548 can_dlc = len(data)
1549 data = data.ljust(8, b'\x00')
1550 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1551
1552 @classmethod
1553 def dissect_can_frame(cls, frame):
1554 """Dissect a CAN frame."""
1555 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1556 return (can_id, can_dlc, data[:can_dlc])
1557
1558 def testSendFrame(self):
1559 cf, addr = self.s.recvfrom(self.bufsize)
1560 self.assertEqual(self.cf, cf)
1561 self.assertEqual(addr[0], self.interface)
1562 self.assertEqual(addr[1], socket.AF_CAN)
1563
1564 def _testSendFrame(self):
1565 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1566 self.cli.send(self.cf)
1567
1568 def testSendMaxFrame(self):
1569 cf, addr = self.s.recvfrom(self.bufsize)
1570 self.assertEqual(self.cf, cf)
1571
1572 def _testSendMaxFrame(self):
1573 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1574 self.cli.send(self.cf)
1575
1576 def testSendMultiFrames(self):
1577 cf, addr = self.s.recvfrom(self.bufsize)
1578 self.assertEqual(self.cf1, cf)
1579
1580 cf, addr = self.s.recvfrom(self.bufsize)
1581 self.assertEqual(self.cf2, cf)
1582
1583 def _testSendMultiFrames(self):
1584 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1585 self.cli.send(self.cf1)
1586
1587 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1588 self.cli.send(self.cf2)
1589
Charles-François Natali773e42d2013-02-05 19:42:01 +01001590 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1591 'socket.CAN_BCM required for this test.')
1592 def _testBCM(self):
1593 cf, addr = self.cli.recvfrom(self.bufsize)
1594 self.assertEqual(self.cf, cf)
1595 can_id, can_dlc, data = self.dissect_can_frame(cf)
1596 self.assertEqual(self.can_id, can_id)
1597 self.assertEqual(self.data, data)
1598
1599 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1600 'socket.CAN_BCM required for this test.')
1601 def testBCM(self):
1602 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1603 self.addCleanup(bcm.close)
1604 bcm.connect((self.interface,))
1605 self.can_id = 0x123
1606 self.data = bytes([0xc0, 0xff, 0xee])
1607 self.cf = self.build_can_frame(self.can_id, self.data)
1608 opcode = socket.CAN_BCM_TX_SEND
1609 flags = 0
1610 count = 0
1611 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1612 bcm_can_id = 0x0222
1613 nframes = 1
1614 assert len(self.cf) == 16
1615 header = struct.pack(self.bcm_cmd_msg_fmt,
1616 opcode,
1617 flags,
1618 count,
1619 ival1_seconds,
1620 ival1_usec,
1621 ival2_seconds,
1622 ival2_usec,
1623 bcm_can_id,
1624 nframes,
1625 )
1626 header_plus_frame = header + self.cf
1627 bytes_sent = bcm.send(header_plus_frame)
1628 self.assertEqual(bytes_sent, len(header_plus_frame))
1629
Charles-François Natali47413c12011-10-06 19:47:44 +02001630
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001631@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1632class BasicRDSTest(unittest.TestCase):
1633
1634 def testCrucialConstants(self):
1635 socket.AF_RDS
1636 socket.PF_RDS
1637
1638 def testCreateSocket(self):
1639 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1640 pass
1641
1642 def testSocketBufferSize(self):
1643 bufsize = 16384
1644 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1645 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1646 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1647
1648
1649@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1650@unittest.skipUnless(thread, 'Threading required for this test.')
1651class RDSTest(ThreadedRDSSocketTest):
1652
1653 def __init__(self, methodName='runTest'):
1654 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1655
Charles-François Natali240c55f2011-11-10 20:33:36 +01001656 def setUp(self):
1657 super().setUp()
1658 self.evt = threading.Event()
1659
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001660 def testSendAndRecv(self):
1661 data, addr = self.serv.recvfrom(self.bufsize)
1662 self.assertEqual(self.data, data)
1663 self.assertEqual(self.cli_addr, addr)
1664
1665 def _testSendAndRecv(self):
1666 self.data = b'spam'
1667 self.cli.sendto(self.data, 0, (HOST, self.port))
1668
1669 def testPeek(self):
1670 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1671 self.assertEqual(self.data, data)
1672 data, addr = self.serv.recvfrom(self.bufsize)
1673 self.assertEqual(self.data, data)
1674
1675 def _testPeek(self):
1676 self.data = b'spam'
1677 self.cli.sendto(self.data, 0, (HOST, self.port))
1678
1679 @requireAttrs(socket.socket, 'recvmsg')
1680 def testSendAndRecvMsg(self):
1681 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1682 self.assertEqual(self.data, data)
1683
1684 @requireAttrs(socket.socket, 'sendmsg')
1685 def _testSendAndRecvMsg(self):
1686 self.data = b'hello ' * 10
1687 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1688
1689 def testSendAndRecvMulti(self):
1690 data, addr = self.serv.recvfrom(self.bufsize)
1691 self.assertEqual(self.data1, data)
1692
1693 data, addr = self.serv.recvfrom(self.bufsize)
1694 self.assertEqual(self.data2, data)
1695
1696 def _testSendAndRecvMulti(self):
1697 self.data1 = b'bacon'
1698 self.cli.sendto(self.data1, 0, (HOST, self.port))
1699
1700 self.data2 = b'egg'
1701 self.cli.sendto(self.data2, 0, (HOST, self.port))
1702
1703 def testSelect(self):
1704 r, w, x = select.select([self.serv], [], [], 3.0)
1705 self.assertIn(self.serv, r)
1706 data, addr = self.serv.recvfrom(self.bufsize)
1707 self.assertEqual(self.data, data)
1708
1709 def _testSelect(self):
1710 self.data = b'select'
1711 self.cli.sendto(self.data, 0, (HOST, self.port))
1712
1713 def testCongestion(self):
1714 # wait until the sender is done
1715 self.evt.wait()
1716
1717 def _testCongestion(self):
1718 # test the behavior in case of congestion
1719 self.data = b'fill'
1720 self.cli.setblocking(False)
1721 try:
1722 # try to lower the receiver's socket buffer size
1723 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1724 except OSError:
1725 pass
1726 with self.assertRaises(OSError) as cm:
1727 try:
1728 # fill the receiver's socket buffer
1729 while True:
1730 self.cli.sendto(self.data, 0, (HOST, self.port))
1731 finally:
1732 # signal the receiver we're done
1733 self.evt.set()
1734 # sendto() should have failed with ENOBUFS
1735 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1736 # and we should have received a congestion notification through poll
1737 r, w, x = select.select([self.serv], [], [], 3.0)
1738 self.assertIn(self.serv, r)
1739
1740
Victor Stinner45df8202010-04-28 22:31:17 +00001741@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001742class BasicTCPTest(SocketConnectedTest):
1743
1744 def __init__(self, methodName='runTest'):
1745 SocketConnectedTest.__init__(self, methodName=methodName)
1746
1747 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001748 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001749 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001750 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001751
1752 def _testRecv(self):
1753 self.serv_conn.send(MSG)
1754
1755 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001756 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001757 seg1 = self.cli_conn.recv(len(MSG) - 3)
1758 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001759 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001760 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001761
1762 def _testOverFlowRecv(self):
1763 self.serv_conn.send(MSG)
1764
1765 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001766 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001767 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001768 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001769
1770 def _testRecvFrom(self):
1771 self.serv_conn.send(MSG)
1772
1773 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001774 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001775 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1776 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001777 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001778 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001779
1780 def _testOverFlowRecvFrom(self):
1781 self.serv_conn.send(MSG)
1782
1783 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001784 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001785 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001786 while 1:
1787 read = self.cli_conn.recv(1024)
1788 if not read:
1789 break
Guido van Rossume531e292002-08-08 20:28:34 +00001790 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001791 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001792
1793 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001794 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001795 self.serv_conn.sendall(big_chunk)
1796
1797 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001798 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001799 fd = self.cli_conn.fileno()
1800 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001801 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001802 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001803 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001804 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001805
1806 def _testFromFd(self):
1807 self.serv_conn.send(MSG)
1808
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001809 def testDup(self):
1810 # Testing dup()
1811 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001812 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001813 msg = sock.recv(1024)
1814 self.assertEqual(msg, MSG)
1815
1816 def _testDup(self):
1817 self.serv_conn.send(MSG)
1818
Guido van Rossum24e4af82002-06-12 19:18:08 +00001819 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001820 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001821 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001822 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001823 # wait for _testShutdown to finish: on OS X, when the server
1824 # closes the connection the client also becomes disconnected,
1825 # and the client's shutdown call will fail. (Issue #4397.)
1826 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001827
1828 def _testShutdown(self):
1829 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001830 self.serv_conn.shutdown(2)
1831
1832 testShutdown_overflow = support.cpython_only(testShutdown)
1833
1834 @support.cpython_only
1835 def _testShutdown_overflow(self):
1836 import _testcapi
1837 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001838 # Issue 15989
1839 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1840 _testcapi.INT_MAX + 1)
1841 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1842 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001843 self.serv_conn.shutdown(2)
1844
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001845 def testDetach(self):
1846 # Testing detach()
1847 fileno = self.cli_conn.fileno()
1848 f = self.cli_conn.detach()
1849 self.assertEqual(f, fileno)
1850 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001851 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001852 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001853 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001854 # ...but we can create another socket using the (still open)
1855 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001856 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001857 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001858 msg = sock.recv(1024)
1859 self.assertEqual(msg, MSG)
1860
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001861 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001862 self.serv_conn.send(MSG)
1863
Victor Stinner45df8202010-04-28 22:31:17 +00001864@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001865class BasicUDPTest(ThreadedUDPSocketTest):
1866
1867 def __init__(self, methodName='runTest'):
1868 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1869
1870 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001871 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001872 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001873 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001874
1875 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001876 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001877
Guido van Rossum1c938012002-06-12 21:17:20 +00001878 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001879 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001880 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001881 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001882
Guido van Rossum1c938012002-06-12 21:17:20 +00001883 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001884 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001885
Guido van Rossumd8faa362007-04-27 19:54:29 +00001886 def testRecvFromNegative(self):
1887 # Negative lengths passed to recvfrom should give ValueError.
1888 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1889
1890 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001891 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001892
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001893# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1894# same test code is used with different families and types of socket
1895# (e.g. stream, datagram), and tests using recvmsg() are repeated
1896# using recvmsg_into().
1897#
1898# The generic test classes such as SendmsgTests and
1899# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1900# supplied with sockets cli_sock and serv_sock representing the
1901# client's and the server's end of the connection respectively, and
1902# attributes cli_addr and serv_addr holding their (numeric where
1903# appropriate) addresses.
1904#
1905# The final concrete test classes combine these with subclasses of
1906# SocketTestBase which set up client and server sockets of a specific
1907# type, and with subclasses of SendrecvmsgBase such as
1908# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1909# sockets to cli_sock and serv_sock and override the methods and
1910# attributes of SendrecvmsgBase to fill in destination addresses if
1911# needed when sending, check for specific flags in msg_flags, etc.
1912#
1913# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1914# recvmsg_into().
1915
1916# XXX: like the other datagram (UDP) tests in this module, the code
1917# here assumes that datagram delivery on the local machine will be
1918# reliable.
1919
1920class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1921 # Base class for sendmsg()/recvmsg() tests.
1922
1923 # Time in seconds to wait before considering a test failed, or
1924 # None for no timeout. Not all tests actually set a timeout.
1925 fail_timeout = 3.0
1926
1927 def setUp(self):
1928 self.misc_event = threading.Event()
1929 super().setUp()
1930
1931 def sendToServer(self, msg):
1932 # Send msg to the server.
1933 return self.cli_sock.send(msg)
1934
1935 # Tuple of alternative default arguments for sendmsg() when called
1936 # via sendmsgToServer() (e.g. to include a destination address).
1937 sendmsg_to_server_defaults = ()
1938
1939 def sendmsgToServer(self, *args):
1940 # Call sendmsg() on self.cli_sock with the given arguments,
1941 # filling in any arguments which are not supplied with the
1942 # corresponding items of self.sendmsg_to_server_defaults, if
1943 # any.
1944 return self.cli_sock.sendmsg(
1945 *(args + self.sendmsg_to_server_defaults[len(args):]))
1946
1947 def doRecvmsg(self, sock, bufsize, *args):
1948 # Call recvmsg() on sock with given arguments and return its
1949 # result. Should be used for tests which can use either
1950 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1951 # this method with one which emulates it using recvmsg_into(),
1952 # thus allowing the same test to be used for both methods.
1953 result = sock.recvmsg(bufsize, *args)
1954 self.registerRecvmsgResult(result)
1955 return result
1956
1957 def registerRecvmsgResult(self, result):
1958 # Called by doRecvmsg() with the return value of recvmsg() or
1959 # recvmsg_into(). Can be overridden to arrange cleanup based
1960 # on the returned ancillary data, for instance.
1961 pass
1962
1963 def checkRecvmsgAddress(self, addr1, addr2):
1964 # Called to compare the received address with the address of
1965 # the peer.
1966 self.assertEqual(addr1, addr2)
1967
1968 # Flags that are normally unset in msg_flags
1969 msg_flags_common_unset = 0
1970 for name in ("MSG_CTRUNC", "MSG_OOB"):
1971 msg_flags_common_unset |= getattr(socket, name, 0)
1972
1973 # Flags that are normally set
1974 msg_flags_common_set = 0
1975
1976 # Flags set when a complete record has been received (e.g. MSG_EOR
1977 # for SCTP)
1978 msg_flags_eor_indicator = 0
1979
1980 # Flags set when a complete record has not been received
1981 # (e.g. MSG_TRUNC for datagram sockets)
1982 msg_flags_non_eor_indicator = 0
1983
1984 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1985 # Method to check the value of msg_flags returned by recvmsg[_into]().
1986 #
1987 # Checks that all bits in msg_flags_common_set attribute are
1988 # set in "flags" and all bits in msg_flags_common_unset are
1989 # unset.
1990 #
1991 # The "eor" argument specifies whether the flags should
1992 # indicate that a full record (or datagram) has been received.
1993 # If "eor" is None, no checks are done; otherwise, checks
1994 # that:
1995 #
1996 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1997 # set and all bits in msg_flags_non_eor_indicator are unset
1998 #
1999 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2000 # are set and all bits in msg_flags_eor_indicator are unset
2001 #
2002 # If "checkset" and/or "checkunset" are supplied, they require
2003 # the given bits to be set or unset respectively, overriding
2004 # what the attributes require for those bits.
2005 #
2006 # If any bits are set in "ignore", they will not be checked,
2007 # regardless of the other inputs.
2008 #
2009 # Will raise Exception if the inputs require a bit to be both
2010 # set and unset, and it is not ignored.
2011
2012 defaultset = self.msg_flags_common_set
2013 defaultunset = self.msg_flags_common_unset
2014
2015 if eor:
2016 defaultset |= self.msg_flags_eor_indicator
2017 defaultunset |= self.msg_flags_non_eor_indicator
2018 elif eor is not None:
2019 defaultset |= self.msg_flags_non_eor_indicator
2020 defaultunset |= self.msg_flags_eor_indicator
2021
2022 # Function arguments override defaults
2023 defaultset &= ~checkunset
2024 defaultunset &= ~checkset
2025
2026 # Merge arguments with remaining defaults, and check for conflicts
2027 checkset |= defaultset
2028 checkunset |= defaultunset
2029 inboth = checkset & checkunset & ~ignore
2030 if inboth:
2031 raise Exception("contradictory set, unset requirements for flags "
2032 "{0:#x}".format(inboth))
2033
2034 # Compare with given msg_flags value
2035 mask = (checkset | checkunset) & ~ignore
2036 self.assertEqual(flags & mask, checkset & mask)
2037
2038
2039class RecvmsgIntoMixin(SendrecvmsgBase):
2040 # Mixin to implement doRecvmsg() using recvmsg_into().
2041
2042 def doRecvmsg(self, sock, bufsize, *args):
2043 buf = bytearray(bufsize)
2044 result = sock.recvmsg_into([buf], *args)
2045 self.registerRecvmsgResult(result)
2046 self.assertGreaterEqual(result[0], 0)
2047 self.assertLessEqual(result[0], bufsize)
2048 return (bytes(buf[:result[0]]),) + result[1:]
2049
2050
2051class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2052 # Defines flags to be checked in msg_flags for datagram sockets.
2053
2054 @property
2055 def msg_flags_non_eor_indicator(self):
2056 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2057
2058
2059class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2060 # Defines flags to be checked in msg_flags for SCTP sockets.
2061
2062 @property
2063 def msg_flags_eor_indicator(self):
2064 return super().msg_flags_eor_indicator | socket.MSG_EOR
2065
2066
2067class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2068 # Base class for tests on connectionless-mode sockets. Users must
2069 # supply sockets on attributes cli and serv to be mapped to
2070 # cli_sock and serv_sock respectively.
2071
2072 @property
2073 def serv_sock(self):
2074 return self.serv
2075
2076 @property
2077 def cli_sock(self):
2078 return self.cli
2079
2080 @property
2081 def sendmsg_to_server_defaults(self):
2082 return ([], [], 0, self.serv_addr)
2083
2084 def sendToServer(self, msg):
2085 return self.cli_sock.sendto(msg, self.serv_addr)
2086
2087
2088class SendrecvmsgConnectedBase(SendrecvmsgBase):
2089 # Base class for tests on connected sockets. Users must supply
2090 # sockets on attributes serv_conn and cli_conn (representing the
2091 # connections *to* the server and the client), to be mapped to
2092 # cli_sock and serv_sock respectively.
2093
2094 @property
2095 def serv_sock(self):
2096 return self.cli_conn
2097
2098 @property
2099 def cli_sock(self):
2100 return self.serv_conn
2101
2102 def checkRecvmsgAddress(self, addr1, addr2):
2103 # Address is currently "unspecified" for a connected socket,
2104 # so we don't examine it
2105 pass
2106
2107
2108class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2109 # Base class to set a timeout on server's socket.
2110
2111 def setUp(self):
2112 super().setUp()
2113 self.serv_sock.settimeout(self.fail_timeout)
2114
2115
2116class SendmsgTests(SendrecvmsgServerTimeoutBase):
2117 # Tests for sendmsg() which can use any socket type and do not
2118 # involve recvmsg() or recvmsg_into().
2119
2120 def testSendmsg(self):
2121 # Send a simple message with sendmsg().
2122 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2123
2124 def _testSendmsg(self):
2125 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2126
2127 def testSendmsgDataGenerator(self):
2128 # Send from buffer obtained from a generator (not a sequence).
2129 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2130
2131 def _testSendmsgDataGenerator(self):
2132 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2133 len(MSG))
2134
2135 def testSendmsgAncillaryGenerator(self):
2136 # Gather (empty) ancillary data from a generator.
2137 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2138
2139 def _testSendmsgAncillaryGenerator(self):
2140 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2141 len(MSG))
2142
2143 def testSendmsgArray(self):
2144 # Send data from an array instead of the usual bytes object.
2145 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2146
2147 def _testSendmsgArray(self):
2148 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2149 len(MSG))
2150
2151 def testSendmsgGather(self):
2152 # Send message data from more than one buffer (gather write).
2153 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2154
2155 def _testSendmsgGather(self):
2156 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2157
2158 def testSendmsgBadArgs(self):
2159 # Check that sendmsg() rejects invalid arguments.
2160 self.assertEqual(self.serv_sock.recv(1000), b"done")
2161
2162 def _testSendmsgBadArgs(self):
2163 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2164 self.assertRaises(TypeError, self.sendmsgToServer,
2165 b"not in an iterable")
2166 self.assertRaises(TypeError, self.sendmsgToServer,
2167 object())
2168 self.assertRaises(TypeError, self.sendmsgToServer,
2169 [object()])
2170 self.assertRaises(TypeError, self.sendmsgToServer,
2171 [MSG, object()])
2172 self.assertRaises(TypeError, self.sendmsgToServer,
2173 [MSG], object())
2174 self.assertRaises(TypeError, self.sendmsgToServer,
2175 [MSG], [], object())
2176 self.assertRaises(TypeError, self.sendmsgToServer,
2177 [MSG], [], 0, object())
2178 self.sendToServer(b"done")
2179
2180 def testSendmsgBadCmsg(self):
2181 # Check that invalid ancillary data items are rejected.
2182 self.assertEqual(self.serv_sock.recv(1000), b"done")
2183
2184 def _testSendmsgBadCmsg(self):
2185 self.assertRaises(TypeError, self.sendmsgToServer,
2186 [MSG], [object()])
2187 self.assertRaises(TypeError, self.sendmsgToServer,
2188 [MSG], [(object(), 0, b"data")])
2189 self.assertRaises(TypeError, self.sendmsgToServer,
2190 [MSG], [(0, object(), b"data")])
2191 self.assertRaises(TypeError, self.sendmsgToServer,
2192 [MSG], [(0, 0, object())])
2193 self.assertRaises(TypeError, self.sendmsgToServer,
2194 [MSG], [(0, 0)])
2195 self.assertRaises(TypeError, self.sendmsgToServer,
2196 [MSG], [(0, 0, b"data", 42)])
2197 self.sendToServer(b"done")
2198
2199 @requireAttrs(socket, "CMSG_SPACE")
2200 def testSendmsgBadMultiCmsg(self):
2201 # Check that invalid ancillary data items are rejected when
2202 # more than one item is present.
2203 self.assertEqual(self.serv_sock.recv(1000), b"done")
2204
2205 @testSendmsgBadMultiCmsg.client_skip
2206 def _testSendmsgBadMultiCmsg(self):
2207 self.assertRaises(TypeError, self.sendmsgToServer,
2208 [MSG], [0, 0, b""])
2209 self.assertRaises(TypeError, self.sendmsgToServer,
2210 [MSG], [(0, 0, b""), object()])
2211 self.sendToServer(b"done")
2212
2213 def testSendmsgExcessCmsgReject(self):
2214 # Check that sendmsg() rejects excess ancillary data items
2215 # when the number that can be sent is limited.
2216 self.assertEqual(self.serv_sock.recv(1000), b"done")
2217
2218 def _testSendmsgExcessCmsgReject(self):
2219 if not hasattr(socket, "CMSG_SPACE"):
2220 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002221 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002222 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2223 self.assertIsNone(cm.exception.errno)
2224 self.sendToServer(b"done")
2225
2226 def testSendmsgAfterClose(self):
2227 # Check that sendmsg() fails on a closed socket.
2228 pass
2229
2230 def _testSendmsgAfterClose(self):
2231 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002232 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002233
2234
2235class SendmsgStreamTests(SendmsgTests):
2236 # Tests for sendmsg() which require a stream socket and do not
2237 # involve recvmsg() or recvmsg_into().
2238
2239 def testSendmsgExplicitNoneAddr(self):
2240 # Check that peer address can be specified as None.
2241 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2242
2243 def _testSendmsgExplicitNoneAddr(self):
2244 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2245
2246 def testSendmsgTimeout(self):
2247 # Check that timeout works with sendmsg().
2248 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2249 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2250
2251 def _testSendmsgTimeout(self):
2252 try:
2253 self.cli_sock.settimeout(0.03)
2254 with self.assertRaises(socket.timeout):
2255 while True:
2256 self.sendmsgToServer([b"a"*512])
2257 finally:
2258 self.misc_event.set()
2259
2260 # XXX: would be nice to have more tests for sendmsg flags argument.
2261
2262 # Linux supports MSG_DONTWAIT when sending, but in general, it
2263 # only works when receiving. Could add other platforms if they
2264 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002265 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002266 "MSG_DONTWAIT not known to work on this platform when "
2267 "sending")
2268 def testSendmsgDontWait(self):
2269 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2270 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2271 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2272
2273 @testSendmsgDontWait.client_skip
2274 def _testSendmsgDontWait(self):
2275 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002276 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002277 while True:
2278 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2279 self.assertIn(cm.exception.errno,
2280 (errno.EAGAIN, errno.EWOULDBLOCK))
2281 finally:
2282 self.misc_event.set()
2283
2284
2285class SendmsgConnectionlessTests(SendmsgTests):
2286 # Tests for sendmsg() which require a connectionless-mode
2287 # (e.g. datagram) socket, and do not involve recvmsg() or
2288 # recvmsg_into().
2289
2290 def testSendmsgNoDestAddr(self):
2291 # Check that sendmsg() fails when no destination address is
2292 # given for unconnected socket.
2293 pass
2294
2295 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002296 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002297 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002298 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002299 [MSG], [], 0, None)
2300
2301
2302class RecvmsgGenericTests(SendrecvmsgBase):
2303 # Tests for recvmsg() which can also be emulated using
2304 # recvmsg_into(), and can use any socket type.
2305
2306 def testRecvmsg(self):
2307 # Receive a simple message with recvmsg[_into]().
2308 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2309 self.assertEqual(msg, MSG)
2310 self.checkRecvmsgAddress(addr, self.cli_addr)
2311 self.assertEqual(ancdata, [])
2312 self.checkFlags(flags, eor=True)
2313
2314 def _testRecvmsg(self):
2315 self.sendToServer(MSG)
2316
2317 def testRecvmsgExplicitDefaults(self):
2318 # Test recvmsg[_into]() with default arguments provided explicitly.
2319 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2320 len(MSG), 0, 0)
2321 self.assertEqual(msg, MSG)
2322 self.checkRecvmsgAddress(addr, self.cli_addr)
2323 self.assertEqual(ancdata, [])
2324 self.checkFlags(flags, eor=True)
2325
2326 def _testRecvmsgExplicitDefaults(self):
2327 self.sendToServer(MSG)
2328
2329 def testRecvmsgShorter(self):
2330 # Receive a message smaller than buffer.
2331 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2332 len(MSG) + 42)
2333 self.assertEqual(msg, MSG)
2334 self.checkRecvmsgAddress(addr, self.cli_addr)
2335 self.assertEqual(ancdata, [])
2336 self.checkFlags(flags, eor=True)
2337
2338 def _testRecvmsgShorter(self):
2339 self.sendToServer(MSG)
2340
Charles-François Natali8619cd72011-10-03 19:43:15 +02002341 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2342 # datagram is received (issue #13001).
2343 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002344 def testRecvmsgTrunc(self):
2345 # Receive part of message, check for truncation indicators.
2346 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2347 len(MSG) - 3)
2348 self.assertEqual(msg, MSG[:-3])
2349 self.checkRecvmsgAddress(addr, self.cli_addr)
2350 self.assertEqual(ancdata, [])
2351 self.checkFlags(flags, eor=False)
2352
Charles-François Natali8619cd72011-10-03 19:43:15 +02002353 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002354 def _testRecvmsgTrunc(self):
2355 self.sendToServer(MSG)
2356
2357 def testRecvmsgShortAncillaryBuf(self):
2358 # Test ancillary data buffer too small to hold any ancillary data.
2359 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2360 len(MSG), 1)
2361 self.assertEqual(msg, MSG)
2362 self.checkRecvmsgAddress(addr, self.cli_addr)
2363 self.assertEqual(ancdata, [])
2364 self.checkFlags(flags, eor=True)
2365
2366 def _testRecvmsgShortAncillaryBuf(self):
2367 self.sendToServer(MSG)
2368
2369 def testRecvmsgLongAncillaryBuf(self):
2370 # Test large ancillary data buffer.
2371 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2372 len(MSG), 10240)
2373 self.assertEqual(msg, MSG)
2374 self.checkRecvmsgAddress(addr, self.cli_addr)
2375 self.assertEqual(ancdata, [])
2376 self.checkFlags(flags, eor=True)
2377
2378 def _testRecvmsgLongAncillaryBuf(self):
2379 self.sendToServer(MSG)
2380
2381 def testRecvmsgAfterClose(self):
2382 # Check that recvmsg[_into]() fails on a closed socket.
2383 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002384 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002385
2386 def _testRecvmsgAfterClose(self):
2387 pass
2388
2389 def testRecvmsgTimeout(self):
2390 # Check that timeout works.
2391 try:
2392 self.serv_sock.settimeout(0.03)
2393 self.assertRaises(socket.timeout,
2394 self.doRecvmsg, self.serv_sock, len(MSG))
2395 finally:
2396 self.misc_event.set()
2397
2398 def _testRecvmsgTimeout(self):
2399 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2400
2401 @requireAttrs(socket, "MSG_PEEK")
2402 def testRecvmsgPeek(self):
2403 # Check that MSG_PEEK in flags enables examination of pending
2404 # data without consuming it.
2405
2406 # Receive part of data with MSG_PEEK.
2407 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2408 len(MSG) - 3, 0,
2409 socket.MSG_PEEK)
2410 self.assertEqual(msg, MSG[:-3])
2411 self.checkRecvmsgAddress(addr, self.cli_addr)
2412 self.assertEqual(ancdata, [])
2413 # Ignoring MSG_TRUNC here (so this test is the same for stream
2414 # and datagram sockets). Some wording in POSIX seems to
2415 # suggest that it needn't be set when peeking, but that may
2416 # just be a slip.
2417 self.checkFlags(flags, eor=False,
2418 ignore=getattr(socket, "MSG_TRUNC", 0))
2419
2420 # Receive all data with MSG_PEEK.
2421 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2422 len(MSG), 0,
2423 socket.MSG_PEEK)
2424 self.assertEqual(msg, MSG)
2425 self.checkRecvmsgAddress(addr, self.cli_addr)
2426 self.assertEqual(ancdata, [])
2427 self.checkFlags(flags, eor=True)
2428
2429 # Check that the same data can still be received normally.
2430 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2431 self.assertEqual(msg, MSG)
2432 self.checkRecvmsgAddress(addr, self.cli_addr)
2433 self.assertEqual(ancdata, [])
2434 self.checkFlags(flags, eor=True)
2435
2436 @testRecvmsgPeek.client_skip
2437 def _testRecvmsgPeek(self):
2438 self.sendToServer(MSG)
2439
2440 @requireAttrs(socket.socket, "sendmsg")
2441 def testRecvmsgFromSendmsg(self):
2442 # Test receiving with recvmsg[_into]() when message is sent
2443 # using sendmsg().
2444 self.serv_sock.settimeout(self.fail_timeout)
2445 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2446 self.assertEqual(msg, MSG)
2447 self.checkRecvmsgAddress(addr, self.cli_addr)
2448 self.assertEqual(ancdata, [])
2449 self.checkFlags(flags, eor=True)
2450
2451 @testRecvmsgFromSendmsg.client_skip
2452 def _testRecvmsgFromSendmsg(self):
2453 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2454
2455
2456class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2457 # Tests which require a stream socket and can use either recvmsg()
2458 # or recvmsg_into().
2459
2460 def testRecvmsgEOF(self):
2461 # Receive end-of-stream indicator (b"", peer socket closed).
2462 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2463 self.assertEqual(msg, b"")
2464 self.checkRecvmsgAddress(addr, self.cli_addr)
2465 self.assertEqual(ancdata, [])
2466 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2467
2468 def _testRecvmsgEOF(self):
2469 self.cli_sock.close()
2470
2471 def testRecvmsgOverflow(self):
2472 # Receive a message in more than one chunk.
2473 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2474 len(MSG) - 3)
2475 self.checkRecvmsgAddress(addr, self.cli_addr)
2476 self.assertEqual(ancdata, [])
2477 self.checkFlags(flags, eor=False)
2478
2479 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2480 self.checkRecvmsgAddress(addr, self.cli_addr)
2481 self.assertEqual(ancdata, [])
2482 self.checkFlags(flags, eor=True)
2483
2484 msg = seg1 + seg2
2485 self.assertEqual(msg, MSG)
2486
2487 def _testRecvmsgOverflow(self):
2488 self.sendToServer(MSG)
2489
2490
2491class RecvmsgTests(RecvmsgGenericTests):
2492 # Tests for recvmsg() which can use any socket type.
2493
2494 def testRecvmsgBadArgs(self):
2495 # Check that recvmsg() rejects invalid arguments.
2496 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2497 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2498 -1, 0, 0)
2499 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2500 len(MSG), -1, 0)
2501 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2502 [bytearray(10)], 0, 0)
2503 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2504 object(), 0, 0)
2505 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2506 len(MSG), object(), 0)
2507 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2508 len(MSG), 0, object())
2509
2510 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2511 self.assertEqual(msg, MSG)
2512 self.checkRecvmsgAddress(addr, self.cli_addr)
2513 self.assertEqual(ancdata, [])
2514 self.checkFlags(flags, eor=True)
2515
2516 def _testRecvmsgBadArgs(self):
2517 self.sendToServer(MSG)
2518
2519
2520class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2521 # Tests for recvmsg_into() which can use any socket type.
2522
2523 def testRecvmsgIntoBadArgs(self):
2524 # Check that recvmsg_into() rejects invalid arguments.
2525 buf = bytearray(len(MSG))
2526 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2527 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2528 len(MSG), 0, 0)
2529 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2530 buf, 0, 0)
2531 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2532 [object()], 0, 0)
2533 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2534 [b"I'm not writable"], 0, 0)
2535 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2536 [buf, object()], 0, 0)
2537 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2538 [buf], -1, 0)
2539 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2540 [buf], object(), 0)
2541 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2542 [buf], 0, object())
2543
2544 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2545 self.assertEqual(nbytes, len(MSG))
2546 self.assertEqual(buf, bytearray(MSG))
2547 self.checkRecvmsgAddress(addr, self.cli_addr)
2548 self.assertEqual(ancdata, [])
2549 self.checkFlags(flags, eor=True)
2550
2551 def _testRecvmsgIntoBadArgs(self):
2552 self.sendToServer(MSG)
2553
2554 def testRecvmsgIntoGenerator(self):
2555 # Receive into buffer obtained from a generator (not a sequence).
2556 buf = bytearray(len(MSG))
2557 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2558 (o for o in [buf]))
2559 self.assertEqual(nbytes, len(MSG))
2560 self.assertEqual(buf, bytearray(MSG))
2561 self.checkRecvmsgAddress(addr, self.cli_addr)
2562 self.assertEqual(ancdata, [])
2563 self.checkFlags(flags, eor=True)
2564
2565 def _testRecvmsgIntoGenerator(self):
2566 self.sendToServer(MSG)
2567
2568 def testRecvmsgIntoArray(self):
2569 # Receive into an array rather than the usual bytearray.
2570 buf = array.array("B", [0] * len(MSG))
2571 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2572 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002573 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002574 self.checkRecvmsgAddress(addr, self.cli_addr)
2575 self.assertEqual(ancdata, [])
2576 self.checkFlags(flags, eor=True)
2577
2578 def _testRecvmsgIntoArray(self):
2579 self.sendToServer(MSG)
2580
2581 def testRecvmsgIntoScatter(self):
2582 # Receive into multiple buffers (scatter write).
2583 b1 = bytearray(b"----")
2584 b2 = bytearray(b"0123456789")
2585 b3 = bytearray(b"--------------")
2586 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2587 [b1, memoryview(b2)[2:9], b3])
2588 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2589 self.assertEqual(b1, bytearray(b"Mary"))
2590 self.assertEqual(b2, bytearray(b"01 had a 9"))
2591 self.assertEqual(b3, bytearray(b"little lamb---"))
2592 self.checkRecvmsgAddress(addr, self.cli_addr)
2593 self.assertEqual(ancdata, [])
2594 self.checkFlags(flags, eor=True)
2595
2596 def _testRecvmsgIntoScatter(self):
2597 self.sendToServer(b"Mary had a little lamb")
2598
2599
2600class CmsgMacroTests(unittest.TestCase):
2601 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2602 # assumptions used by sendmsg() and recvmsg[_into](), which share
2603 # code with these functions.
2604
2605 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002606 try:
2607 import _testcapi
2608 except ImportError:
2609 socklen_t_limit = 0x7fffffff
2610 else:
2611 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002612
2613 @requireAttrs(socket, "CMSG_LEN")
2614 def testCMSG_LEN(self):
2615 # Test CMSG_LEN() with various valid and invalid values,
2616 # checking the assumptions used by recvmsg() and sendmsg().
2617 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2618 values = list(range(257)) + list(range(toobig - 257, toobig))
2619
2620 # struct cmsghdr has at least three members, two of which are ints
2621 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2622 for n in values:
2623 ret = socket.CMSG_LEN(n)
2624 # This is how recvmsg() calculates the data size
2625 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2626 self.assertLessEqual(ret, self.socklen_t_limit)
2627
2628 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2629 # sendmsg() shares code with these functions, and requires
2630 # that it reject values over the limit.
2631 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2632 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2633
2634 @requireAttrs(socket, "CMSG_SPACE")
2635 def testCMSG_SPACE(self):
2636 # Test CMSG_SPACE() with various valid and invalid values,
2637 # checking the assumptions used by sendmsg().
2638 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2639 values = list(range(257)) + list(range(toobig - 257, toobig))
2640
2641 last = socket.CMSG_SPACE(0)
2642 # struct cmsghdr has at least three members, two of which are ints
2643 self.assertGreater(last, array.array("i").itemsize * 2)
2644 for n in values:
2645 ret = socket.CMSG_SPACE(n)
2646 self.assertGreaterEqual(ret, last)
2647 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2648 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2649 self.assertLessEqual(ret, self.socklen_t_limit)
2650 last = ret
2651
2652 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2653 # sendmsg() shares code with these functions, and requires
2654 # that it reject values over the limit.
2655 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2656 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2657
2658
2659class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2660 # Tests for file descriptor passing on Unix-domain sockets.
2661
2662 # Invalid file descriptor value that's unlikely to evaluate to a
2663 # real FD even if one of its bytes is replaced with a different
2664 # value (which shouldn't actually happen).
2665 badfd = -0x5555
2666
2667 def newFDs(self, n):
2668 # Return a list of n file descriptors for newly-created files
2669 # containing their list indices as ASCII numbers.
2670 fds = []
2671 for i in range(n):
2672 fd, path = tempfile.mkstemp()
2673 self.addCleanup(os.unlink, path)
2674 self.addCleanup(os.close, fd)
2675 os.write(fd, str(i).encode())
2676 fds.append(fd)
2677 return fds
2678
2679 def checkFDs(self, fds):
2680 # Check that the file descriptors in the given list contain
2681 # their correct list indices as ASCII numbers.
2682 for n, fd in enumerate(fds):
2683 os.lseek(fd, 0, os.SEEK_SET)
2684 self.assertEqual(os.read(fd, 1024), str(n).encode())
2685
2686 def registerRecvmsgResult(self, result):
2687 self.addCleanup(self.closeRecvmsgFDs, result)
2688
2689 def closeRecvmsgFDs(self, recvmsg_result):
2690 # Close all file descriptors specified in the ancillary data
2691 # of the given return value from recvmsg() or recvmsg_into().
2692 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2693 if (cmsg_level == socket.SOL_SOCKET and
2694 cmsg_type == socket.SCM_RIGHTS):
2695 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002696 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002697 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2698 for fd in fds:
2699 os.close(fd)
2700
2701 def createAndSendFDs(self, n):
2702 # Send n new file descriptors created by newFDs() to the
2703 # server, with the constant MSG as the non-ancillary data.
2704 self.assertEqual(
2705 self.sendmsgToServer([MSG],
2706 [(socket.SOL_SOCKET,
2707 socket.SCM_RIGHTS,
2708 array.array("i", self.newFDs(n)))]),
2709 len(MSG))
2710
2711 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2712 # Check that constant MSG was received with numfds file
2713 # descriptors in a maximum of maxcmsgs control messages (which
2714 # must contain only complete integers). By default, check
2715 # that MSG_CTRUNC is unset, but ignore any flags in
2716 # ignoreflags.
2717 msg, ancdata, flags, addr = result
2718 self.assertEqual(msg, MSG)
2719 self.checkRecvmsgAddress(addr, self.cli_addr)
2720 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2721 ignore=ignoreflags)
2722
2723 self.assertIsInstance(ancdata, list)
2724 self.assertLessEqual(len(ancdata), maxcmsgs)
2725 fds = array.array("i")
2726 for item in ancdata:
2727 self.assertIsInstance(item, tuple)
2728 cmsg_level, cmsg_type, cmsg_data = item
2729 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2730 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2731 self.assertIsInstance(cmsg_data, bytes)
2732 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002733 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002734
2735 self.assertEqual(len(fds), numfds)
2736 self.checkFDs(fds)
2737
2738 def testFDPassSimple(self):
2739 # Pass a single FD (array read from bytes object).
2740 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2741 len(MSG), 10240))
2742
2743 def _testFDPassSimple(self):
2744 self.assertEqual(
2745 self.sendmsgToServer(
2746 [MSG],
2747 [(socket.SOL_SOCKET,
2748 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002749 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002750 len(MSG))
2751
2752 def testMultipleFDPass(self):
2753 # Pass multiple FDs in a single array.
2754 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2755 len(MSG), 10240))
2756
2757 def _testMultipleFDPass(self):
2758 self.createAndSendFDs(4)
2759
2760 @requireAttrs(socket, "CMSG_SPACE")
2761 def testFDPassCMSG_SPACE(self):
2762 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2763 self.checkRecvmsgFDs(
2764 4, self.doRecvmsg(self.serv_sock, len(MSG),
2765 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2766
2767 @testFDPassCMSG_SPACE.client_skip
2768 def _testFDPassCMSG_SPACE(self):
2769 self.createAndSendFDs(4)
2770
2771 def testFDPassCMSG_LEN(self):
2772 # Test using CMSG_LEN() to calculate ancillary buffer size.
2773 self.checkRecvmsgFDs(1,
2774 self.doRecvmsg(self.serv_sock, len(MSG),
2775 socket.CMSG_LEN(4 * SIZEOF_INT)),
2776 # RFC 3542 says implementations may set
2777 # MSG_CTRUNC if there isn't enough space
2778 # for trailing padding.
2779 ignoreflags=socket.MSG_CTRUNC)
2780
2781 def _testFDPassCMSG_LEN(self):
2782 self.createAndSendFDs(1)
2783
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002784 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002785 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002786 @requireAttrs(socket, "CMSG_SPACE")
2787 def testFDPassSeparate(self):
2788 # Pass two FDs in two separate arrays. Arrays may be combined
2789 # into a single control message by the OS.
2790 self.checkRecvmsgFDs(2,
2791 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2792 maxcmsgs=2)
2793
2794 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002795 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002796 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002797 def _testFDPassSeparate(self):
2798 fd0, fd1 = self.newFDs(2)
2799 self.assertEqual(
2800 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2801 socket.SCM_RIGHTS,
2802 array.array("i", [fd0])),
2803 (socket.SOL_SOCKET,
2804 socket.SCM_RIGHTS,
2805 array.array("i", [fd1]))]),
2806 len(MSG))
2807
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002808 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002809 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002810 @requireAttrs(socket, "CMSG_SPACE")
2811 def testFDPassSeparateMinSpace(self):
2812 # Pass two FDs in two separate arrays, receiving them into the
2813 # minimum space for two arrays.
2814 self.checkRecvmsgFDs(2,
2815 self.doRecvmsg(self.serv_sock, len(MSG),
2816 socket.CMSG_SPACE(SIZEOF_INT) +
2817 socket.CMSG_LEN(SIZEOF_INT)),
2818 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2819
2820 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002821 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002822 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002823 def _testFDPassSeparateMinSpace(self):
2824 fd0, fd1 = self.newFDs(2)
2825 self.assertEqual(
2826 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2827 socket.SCM_RIGHTS,
2828 array.array("i", [fd0])),
2829 (socket.SOL_SOCKET,
2830 socket.SCM_RIGHTS,
2831 array.array("i", [fd1]))]),
2832 len(MSG))
2833
2834 def sendAncillaryIfPossible(self, msg, ancdata):
2835 # Try to send msg and ancdata to server, but if the system
2836 # call fails, just send msg with no ancillary data.
2837 try:
2838 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002839 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002840 # Check that it was the system call that failed
2841 self.assertIsInstance(e.errno, int)
2842 nbytes = self.sendmsgToServer([msg])
2843 self.assertEqual(nbytes, len(msg))
2844
2845 def testFDPassEmpty(self):
2846 # Try to pass an empty FD array. Can receive either no array
2847 # or an empty array.
2848 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2849 len(MSG), 10240),
2850 ignoreflags=socket.MSG_CTRUNC)
2851
2852 def _testFDPassEmpty(self):
2853 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2854 socket.SCM_RIGHTS,
2855 b"")])
2856
2857 def testFDPassPartialInt(self):
2858 # Try to pass a truncated FD array.
2859 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2860 len(MSG), 10240)
2861 self.assertEqual(msg, MSG)
2862 self.checkRecvmsgAddress(addr, self.cli_addr)
2863 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2864 self.assertLessEqual(len(ancdata), 1)
2865 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2866 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2867 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2868 self.assertLess(len(cmsg_data), SIZEOF_INT)
2869
2870 def _testFDPassPartialInt(self):
2871 self.sendAncillaryIfPossible(
2872 MSG,
2873 [(socket.SOL_SOCKET,
2874 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002875 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002876
2877 @requireAttrs(socket, "CMSG_SPACE")
2878 def testFDPassPartialIntInMiddle(self):
2879 # Try to pass two FD arrays, the first of which is truncated.
2880 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2881 len(MSG), 10240)
2882 self.assertEqual(msg, MSG)
2883 self.checkRecvmsgAddress(addr, self.cli_addr)
2884 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2885 self.assertLessEqual(len(ancdata), 2)
2886 fds = array.array("i")
2887 # Arrays may have been combined in a single control message
2888 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2889 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2890 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002891 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002892 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2893 self.assertLessEqual(len(fds), 2)
2894 self.checkFDs(fds)
2895
2896 @testFDPassPartialIntInMiddle.client_skip
2897 def _testFDPassPartialIntInMiddle(self):
2898 fd0, fd1 = self.newFDs(2)
2899 self.sendAncillaryIfPossible(
2900 MSG,
2901 [(socket.SOL_SOCKET,
2902 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002903 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002904 (socket.SOL_SOCKET,
2905 socket.SCM_RIGHTS,
2906 array.array("i", [fd1]))])
2907
2908 def checkTruncatedHeader(self, result, ignoreflags=0):
2909 # Check that no ancillary data items are returned when data is
2910 # truncated inside the cmsghdr structure.
2911 msg, ancdata, flags, addr = result
2912 self.assertEqual(msg, MSG)
2913 self.checkRecvmsgAddress(addr, self.cli_addr)
2914 self.assertEqual(ancdata, [])
2915 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2916 ignore=ignoreflags)
2917
2918 def testCmsgTruncNoBufSize(self):
2919 # Check that no ancillary data is received when no buffer size
2920 # is specified.
2921 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2922 # BSD seems to set MSG_CTRUNC only
2923 # if an item has been partially
2924 # received.
2925 ignoreflags=socket.MSG_CTRUNC)
2926
2927 def _testCmsgTruncNoBufSize(self):
2928 self.createAndSendFDs(1)
2929
2930 def testCmsgTrunc0(self):
2931 # Check that no ancillary data is received when buffer size is 0.
2932 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2933 ignoreflags=socket.MSG_CTRUNC)
2934
2935 def _testCmsgTrunc0(self):
2936 self.createAndSendFDs(1)
2937
2938 # Check that no ancillary data is returned for various non-zero
2939 # (but still too small) buffer sizes.
2940
2941 def testCmsgTrunc1(self):
2942 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2943
2944 def _testCmsgTrunc1(self):
2945 self.createAndSendFDs(1)
2946
2947 def testCmsgTrunc2Int(self):
2948 # The cmsghdr structure has at least three members, two of
2949 # which are ints, so we still shouldn't see any ancillary
2950 # data.
2951 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2952 SIZEOF_INT * 2))
2953
2954 def _testCmsgTrunc2Int(self):
2955 self.createAndSendFDs(1)
2956
2957 def testCmsgTruncLen0Minus1(self):
2958 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2959 socket.CMSG_LEN(0) - 1))
2960
2961 def _testCmsgTruncLen0Minus1(self):
2962 self.createAndSendFDs(1)
2963
2964 # The following tests try to truncate the control message in the
2965 # middle of the FD array.
2966
2967 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2968 # Check that file descriptor data is truncated to between
2969 # mindata and maxdata bytes when received with buffer size
2970 # ancbuf, and that any complete file descriptor numbers are
2971 # valid.
2972 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2973 len(MSG), ancbuf)
2974 self.assertEqual(msg, MSG)
2975 self.checkRecvmsgAddress(addr, self.cli_addr)
2976 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2977
2978 if mindata == 0 and ancdata == []:
2979 return
2980 self.assertEqual(len(ancdata), 1)
2981 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2982 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2983 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2984 self.assertGreaterEqual(len(cmsg_data), mindata)
2985 self.assertLessEqual(len(cmsg_data), maxdata)
2986 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002987 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002988 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2989 self.checkFDs(fds)
2990
2991 def testCmsgTruncLen0(self):
2992 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2993
2994 def _testCmsgTruncLen0(self):
2995 self.createAndSendFDs(1)
2996
2997 def testCmsgTruncLen0Plus1(self):
2998 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2999
3000 def _testCmsgTruncLen0Plus1(self):
3001 self.createAndSendFDs(2)
3002
3003 def testCmsgTruncLen1(self):
3004 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3005 maxdata=SIZEOF_INT)
3006
3007 def _testCmsgTruncLen1(self):
3008 self.createAndSendFDs(2)
3009
3010 def testCmsgTruncLen2Minus1(self):
3011 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3012 maxdata=(2 * SIZEOF_INT) - 1)
3013
3014 def _testCmsgTruncLen2Minus1(self):
3015 self.createAndSendFDs(2)
3016
3017
3018class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3019 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3020 # features of the RFC 3542 Advanced Sockets API for IPv6.
3021 # Currently we can only handle certain data items (e.g. traffic
3022 # class, hop limit, MTU discovery and fragmentation settings)
3023 # without resorting to unportable means such as the struct module,
3024 # but the tests here are aimed at testing the ancillary data
3025 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3026 # itself.
3027
3028 # Test value to use when setting hop limit of packet
3029 hop_limit = 2
3030
3031 # Test value to use when setting traffic class of packet.
3032 # -1 means "use kernel default".
3033 traffic_class = -1
3034
3035 def ancillaryMapping(self, ancdata):
3036 # Given ancillary data list ancdata, return a mapping from
3037 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3038 # Check that no (level, type) pair appears more than once.
3039 d = {}
3040 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3041 self.assertNotIn((cmsg_level, cmsg_type), d)
3042 d[(cmsg_level, cmsg_type)] = cmsg_data
3043 return d
3044
3045 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3046 # Receive hop limit into ancbufsize bytes of ancillary data
3047 # space. Check that data is MSG, ancillary data is not
3048 # truncated (but ignore any flags in ignoreflags), and hop
3049 # limit is between 0 and maxhop inclusive.
3050 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3051 socket.IPV6_RECVHOPLIMIT, 1)
3052 self.misc_event.set()
3053 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3054 len(MSG), ancbufsize)
3055
3056 self.assertEqual(msg, MSG)
3057 self.checkRecvmsgAddress(addr, self.cli_addr)
3058 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3059 ignore=ignoreflags)
3060
3061 self.assertEqual(len(ancdata), 1)
3062 self.assertIsInstance(ancdata[0], tuple)
3063 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3064 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3065 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3066 self.assertIsInstance(cmsg_data, bytes)
3067 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3068 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003069 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003070 self.assertGreaterEqual(a[0], 0)
3071 self.assertLessEqual(a[0], maxhop)
3072
3073 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3074 def testRecvHopLimit(self):
3075 # Test receiving the packet hop limit as ancillary data.
3076 self.checkHopLimit(ancbufsize=10240)
3077
3078 @testRecvHopLimit.client_skip
3079 def _testRecvHopLimit(self):
3080 # Need to wait until server has asked to receive ancillary
3081 # data, as implementations are not required to buffer it
3082 # otherwise.
3083 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3084 self.sendToServer(MSG)
3085
3086 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3087 def testRecvHopLimitCMSG_SPACE(self):
3088 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3089 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3090
3091 @testRecvHopLimitCMSG_SPACE.client_skip
3092 def _testRecvHopLimitCMSG_SPACE(self):
3093 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3094 self.sendToServer(MSG)
3095
3096 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3097 # 3542 says portable applications must provide space for trailing
3098 # padding. Implementations may set MSG_CTRUNC if there isn't
3099 # enough space for the padding.
3100
3101 @requireAttrs(socket.socket, "sendmsg")
3102 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3103 def testSetHopLimit(self):
3104 # Test setting hop limit on outgoing packet and receiving it
3105 # at the other end.
3106 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3107
3108 @testSetHopLimit.client_skip
3109 def _testSetHopLimit(self):
3110 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3111 self.assertEqual(
3112 self.sendmsgToServer([MSG],
3113 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3114 array.array("i", [self.hop_limit]))]),
3115 len(MSG))
3116
3117 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3118 ignoreflags=0):
3119 # Receive traffic class and hop limit into ancbufsize bytes of
3120 # ancillary data space. Check that data is MSG, ancillary
3121 # data is not truncated (but ignore any flags in ignoreflags),
3122 # and traffic class and hop limit are in range (hop limit no
3123 # more than maxhop).
3124 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3125 socket.IPV6_RECVHOPLIMIT, 1)
3126 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3127 socket.IPV6_RECVTCLASS, 1)
3128 self.misc_event.set()
3129 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3130 len(MSG), ancbufsize)
3131
3132 self.assertEqual(msg, MSG)
3133 self.checkRecvmsgAddress(addr, self.cli_addr)
3134 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3135 ignore=ignoreflags)
3136 self.assertEqual(len(ancdata), 2)
3137 ancmap = self.ancillaryMapping(ancdata)
3138
3139 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3140 self.assertEqual(len(tcdata), SIZEOF_INT)
3141 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003142 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003143 self.assertGreaterEqual(a[0], 0)
3144 self.assertLessEqual(a[0], 255)
3145
3146 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3147 self.assertEqual(len(hldata), SIZEOF_INT)
3148 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003149 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003150 self.assertGreaterEqual(a[0], 0)
3151 self.assertLessEqual(a[0], maxhop)
3152
3153 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3154 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3155 def testRecvTrafficClassAndHopLimit(self):
3156 # Test receiving traffic class and hop limit as ancillary data.
3157 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3158
3159 @testRecvTrafficClassAndHopLimit.client_skip
3160 def _testRecvTrafficClassAndHopLimit(self):
3161 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3162 self.sendToServer(MSG)
3163
3164 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3165 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3166 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3167 # Test receiving traffic class and hop limit, using
3168 # CMSG_SPACE() to calculate buffer size.
3169 self.checkTrafficClassAndHopLimit(
3170 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3171
3172 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3173 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3174 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3175 self.sendToServer(MSG)
3176
3177 @requireAttrs(socket.socket, "sendmsg")
3178 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3179 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3180 def testSetTrafficClassAndHopLimit(self):
3181 # Test setting traffic class and hop limit on outgoing packet,
3182 # and receiving them at the other end.
3183 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3184 maxhop=self.hop_limit)
3185
3186 @testSetTrafficClassAndHopLimit.client_skip
3187 def _testSetTrafficClassAndHopLimit(self):
3188 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3189 self.assertEqual(
3190 self.sendmsgToServer([MSG],
3191 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3192 array.array("i", [self.traffic_class])),
3193 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3194 array.array("i", [self.hop_limit]))]),
3195 len(MSG))
3196
3197 @requireAttrs(socket.socket, "sendmsg")
3198 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3199 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3200 def testOddCmsgSize(self):
3201 # Try to send ancillary data with first item one byte too
3202 # long. Fall back to sending with correct size if this fails,
3203 # and check that second item was handled correctly.
3204 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3205 maxhop=self.hop_limit)
3206
3207 @testOddCmsgSize.client_skip
3208 def _testOddCmsgSize(self):
3209 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3210 try:
3211 nbytes = self.sendmsgToServer(
3212 [MSG],
3213 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003214 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003215 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3216 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003217 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003218 self.assertIsInstance(e.errno, int)
3219 nbytes = self.sendmsgToServer(
3220 [MSG],
3221 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3222 array.array("i", [self.traffic_class])),
3223 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3224 array.array("i", [self.hop_limit]))])
3225 self.assertEqual(nbytes, len(MSG))
3226
3227 # Tests for proper handling of truncated ancillary data
3228
3229 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3230 # Receive hop limit into ancbufsize bytes of ancillary data
3231 # space, which should be too small to contain the ancillary
3232 # data header (if ancbufsize is None, pass no second argument
3233 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3234 # (unless included in ignoreflags), and no ancillary data is
3235 # returned.
3236 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3237 socket.IPV6_RECVHOPLIMIT, 1)
3238 self.misc_event.set()
3239 args = () if ancbufsize is None else (ancbufsize,)
3240 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3241 len(MSG), *args)
3242
3243 self.assertEqual(msg, MSG)
3244 self.checkRecvmsgAddress(addr, self.cli_addr)
3245 self.assertEqual(ancdata, [])
3246 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3247 ignore=ignoreflags)
3248
3249 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3250 def testCmsgTruncNoBufSize(self):
3251 # Check that no ancillary data is received when no ancillary
3252 # buffer size is provided.
3253 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3254 # BSD seems to set
3255 # MSG_CTRUNC only if an item
3256 # has been partially
3257 # received.
3258 ignoreflags=socket.MSG_CTRUNC)
3259
3260 @testCmsgTruncNoBufSize.client_skip
3261 def _testCmsgTruncNoBufSize(self):
3262 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3263 self.sendToServer(MSG)
3264
3265 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3266 def testSingleCmsgTrunc0(self):
3267 # Check that no ancillary data is received when ancillary
3268 # buffer size is zero.
3269 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3270 ignoreflags=socket.MSG_CTRUNC)
3271
3272 @testSingleCmsgTrunc0.client_skip
3273 def _testSingleCmsgTrunc0(self):
3274 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3275 self.sendToServer(MSG)
3276
3277 # Check that no ancillary data is returned for various non-zero
3278 # (but still too small) buffer sizes.
3279
3280 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3281 def testSingleCmsgTrunc1(self):
3282 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3283
3284 @testSingleCmsgTrunc1.client_skip
3285 def _testSingleCmsgTrunc1(self):
3286 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3287 self.sendToServer(MSG)
3288
3289 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3290 def testSingleCmsgTrunc2Int(self):
3291 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3292
3293 @testSingleCmsgTrunc2Int.client_skip
3294 def _testSingleCmsgTrunc2Int(self):
3295 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3296 self.sendToServer(MSG)
3297
3298 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3299 def testSingleCmsgTruncLen0Minus1(self):
3300 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3301
3302 @testSingleCmsgTruncLen0Minus1.client_skip
3303 def _testSingleCmsgTruncLen0Minus1(self):
3304 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3305 self.sendToServer(MSG)
3306
3307 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3308 def testSingleCmsgTruncInData(self):
3309 # Test truncation of a control message inside its associated
3310 # data. The message may be returned with its data truncated,
3311 # or not returned at all.
3312 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3313 socket.IPV6_RECVHOPLIMIT, 1)
3314 self.misc_event.set()
3315 msg, ancdata, flags, addr = self.doRecvmsg(
3316 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3317
3318 self.assertEqual(msg, MSG)
3319 self.checkRecvmsgAddress(addr, self.cli_addr)
3320 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3321
3322 self.assertLessEqual(len(ancdata), 1)
3323 if ancdata:
3324 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3325 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3326 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3327 self.assertLess(len(cmsg_data), SIZEOF_INT)
3328
3329 @testSingleCmsgTruncInData.client_skip
3330 def _testSingleCmsgTruncInData(self):
3331 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3332 self.sendToServer(MSG)
3333
3334 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3335 # Receive traffic class and hop limit into ancbufsize bytes of
3336 # ancillary data space, which should be large enough to
3337 # contain the first item, but too small to contain the header
3338 # of the second. Check that data is MSG, MSG_CTRUNC is set
3339 # (unless included in ignoreflags), and only one ancillary
3340 # data item is returned.
3341 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3342 socket.IPV6_RECVHOPLIMIT, 1)
3343 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3344 socket.IPV6_RECVTCLASS, 1)
3345 self.misc_event.set()
3346 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3347 len(MSG), ancbufsize)
3348
3349 self.assertEqual(msg, MSG)
3350 self.checkRecvmsgAddress(addr, self.cli_addr)
3351 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3352 ignore=ignoreflags)
3353
3354 self.assertEqual(len(ancdata), 1)
3355 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3356 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3357 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3358 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3359 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003360 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003361 self.assertGreaterEqual(a[0], 0)
3362 self.assertLessEqual(a[0], 255)
3363
3364 # Try the above test with various buffer sizes.
3365
3366 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3367 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3368 def testSecondCmsgTrunc0(self):
3369 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3370 ignoreflags=socket.MSG_CTRUNC)
3371
3372 @testSecondCmsgTrunc0.client_skip
3373 def _testSecondCmsgTrunc0(self):
3374 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3375 self.sendToServer(MSG)
3376
3377 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3378 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3379 def testSecondCmsgTrunc1(self):
3380 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3381
3382 @testSecondCmsgTrunc1.client_skip
3383 def _testSecondCmsgTrunc1(self):
3384 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3385 self.sendToServer(MSG)
3386
3387 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3388 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3389 def testSecondCmsgTrunc2Int(self):
3390 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3391 2 * SIZEOF_INT)
3392
3393 @testSecondCmsgTrunc2Int.client_skip
3394 def _testSecondCmsgTrunc2Int(self):
3395 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3396 self.sendToServer(MSG)
3397
3398 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3399 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3400 def testSecondCmsgTruncLen0Minus1(self):
3401 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3402 socket.CMSG_LEN(0) - 1)
3403
3404 @testSecondCmsgTruncLen0Minus1.client_skip
3405 def _testSecondCmsgTruncLen0Minus1(self):
3406 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3407 self.sendToServer(MSG)
3408
3409 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3410 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3411 def testSecomdCmsgTruncInData(self):
3412 # Test truncation of the second of two control messages inside
3413 # its associated data.
3414 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3415 socket.IPV6_RECVHOPLIMIT, 1)
3416 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3417 socket.IPV6_RECVTCLASS, 1)
3418 self.misc_event.set()
3419 msg, ancdata, flags, addr = self.doRecvmsg(
3420 self.serv_sock, len(MSG),
3421 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3422
3423 self.assertEqual(msg, MSG)
3424 self.checkRecvmsgAddress(addr, self.cli_addr)
3425 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3426
3427 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3428
3429 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3430 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3431 cmsg_types.remove(cmsg_type)
3432 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3433 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003434 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003435 self.assertGreaterEqual(a[0], 0)
3436 self.assertLessEqual(a[0], 255)
3437
3438 if ancdata:
3439 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3440 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3441 cmsg_types.remove(cmsg_type)
3442 self.assertLess(len(cmsg_data), SIZEOF_INT)
3443
3444 self.assertEqual(ancdata, [])
3445
3446 @testSecomdCmsgTruncInData.client_skip
3447 def _testSecomdCmsgTruncInData(self):
3448 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3449 self.sendToServer(MSG)
3450
3451
3452# Derive concrete test classes for different socket types.
3453
3454class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3455 SendrecvmsgConnectionlessBase,
3456 ThreadedSocketTestMixin, UDPTestBase):
3457 pass
3458
3459@requireAttrs(socket.socket, "sendmsg")
3460@unittest.skipUnless(thread, 'Threading required for this test.')
3461class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3462 pass
3463
3464@requireAttrs(socket.socket, "recvmsg")
3465@unittest.skipUnless(thread, 'Threading required for this test.')
3466class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3467 pass
3468
3469@requireAttrs(socket.socket, "recvmsg_into")
3470@unittest.skipUnless(thread, 'Threading required for this test.')
3471class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3472 pass
3473
3474
3475class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3476 SendrecvmsgConnectionlessBase,
3477 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003478
3479 def checkRecvmsgAddress(self, addr1, addr2):
3480 # Called to compare the received address with the address of
3481 # the peer, ignoring scope ID
3482 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003483
3484@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003485@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003486@requireSocket("AF_INET6", "SOCK_DGRAM")
3487@unittest.skipUnless(thread, 'Threading required for this test.')
3488class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3489 pass
3490
3491@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003492@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003493@requireSocket("AF_INET6", "SOCK_DGRAM")
3494@unittest.skipUnless(thread, 'Threading required for this test.')
3495class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3496 pass
3497
3498@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003499@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003500@requireSocket("AF_INET6", "SOCK_DGRAM")
3501@unittest.skipUnless(thread, 'Threading required for this test.')
3502class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3503 pass
3504
3505@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003506@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003507@requireAttrs(socket, "IPPROTO_IPV6")
3508@requireSocket("AF_INET6", "SOCK_DGRAM")
3509@unittest.skipUnless(thread, 'Threading required for this test.')
3510class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3511 SendrecvmsgUDP6TestBase):
3512 pass
3513
3514@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003515@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003516@requireAttrs(socket, "IPPROTO_IPV6")
3517@requireSocket("AF_INET6", "SOCK_DGRAM")
3518@unittest.skipUnless(thread, 'Threading required for this test.')
3519class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3520 RFC3542AncillaryTest,
3521 SendrecvmsgUDP6TestBase):
3522 pass
3523
3524
3525class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3526 ConnectedStreamTestMixin, TCPTestBase):
3527 pass
3528
3529@requireAttrs(socket.socket, "sendmsg")
3530@unittest.skipUnless(thread, 'Threading required for this test.')
3531class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3532 pass
3533
3534@requireAttrs(socket.socket, "recvmsg")
3535@unittest.skipUnless(thread, 'Threading required for this test.')
3536class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3537 SendrecvmsgTCPTestBase):
3538 pass
3539
3540@requireAttrs(socket.socket, "recvmsg_into")
3541@unittest.skipUnless(thread, 'Threading required for this test.')
3542class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3543 SendrecvmsgTCPTestBase):
3544 pass
3545
3546
3547class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3548 SendrecvmsgConnectedBase,
3549 ConnectedStreamTestMixin, SCTPStreamBase):
3550 pass
3551
3552@requireAttrs(socket.socket, "sendmsg")
3553@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3554@unittest.skipUnless(thread, 'Threading required for this test.')
3555class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3556 pass
3557
3558@requireAttrs(socket.socket, "recvmsg")
3559@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3560@unittest.skipUnless(thread, 'Threading required for this test.')
3561class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3562 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003563
3564 def testRecvmsgEOF(self):
3565 try:
3566 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3567 except OSError as e:
3568 if e.errno != errno.ENOTCONN:
3569 raise
3570 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003571
3572@requireAttrs(socket.socket, "recvmsg_into")
3573@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3574@unittest.skipUnless(thread, 'Threading required for this test.')
3575class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3576 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003577
3578 def testRecvmsgEOF(self):
3579 try:
3580 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3581 except OSError as e:
3582 if e.errno != errno.ENOTCONN:
3583 raise
3584 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003585
3586
3587class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3588 ConnectedStreamTestMixin, UnixStreamBase):
3589 pass
3590
3591@requireAttrs(socket.socket, "sendmsg")
3592@requireAttrs(socket, "AF_UNIX")
3593@unittest.skipUnless(thread, 'Threading required for this test.')
3594class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3595 pass
3596
3597@requireAttrs(socket.socket, "recvmsg")
3598@requireAttrs(socket, "AF_UNIX")
3599@unittest.skipUnless(thread, 'Threading required for this test.')
3600class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3601 SendrecvmsgUnixStreamTestBase):
3602 pass
3603
3604@requireAttrs(socket.socket, "recvmsg_into")
3605@requireAttrs(socket, "AF_UNIX")
3606@unittest.skipUnless(thread, 'Threading required for this test.')
3607class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3608 SendrecvmsgUnixStreamTestBase):
3609 pass
3610
3611@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3612@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3613@unittest.skipUnless(thread, 'Threading required for this test.')
3614class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3615 pass
3616
3617@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3618@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3619@unittest.skipUnless(thread, 'Threading required for this test.')
3620class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3621 SendrecvmsgUnixStreamTestBase):
3622 pass
3623
3624
3625# Test interrupting the interruptible send/receive methods with a
3626# signal when a timeout is set. These tests avoid having multiple
3627# threads alive during the test so that the OS cannot deliver the
3628# signal to the wrong one.
3629
3630class InterruptedTimeoutBase(unittest.TestCase):
3631 # Base class for interrupted send/receive tests. Installs an
3632 # empty handler for SIGALRM and removes it on teardown, along with
3633 # any scheduled alarms.
3634
3635 def setUp(self):
3636 super().setUp()
3637 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003638 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003639 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3640 self.addCleanup(self.setAlarm, 0)
3641
3642 # Timeout for socket operations
3643 timeout = 4.0
3644
3645 # Provide setAlarm() method to schedule delivery of SIGALRM after
3646 # given number of seconds, or cancel it if zero, and an
3647 # appropriate time value to use. Use setitimer() if available.
3648 if hasattr(signal, "setitimer"):
3649 alarm_time = 0.05
3650
3651 def setAlarm(self, seconds):
3652 signal.setitimer(signal.ITIMER_REAL, seconds)
3653 else:
3654 # Old systems may deliver the alarm up to one second early
3655 alarm_time = 2
3656
3657 def setAlarm(self, seconds):
3658 signal.alarm(seconds)
3659
3660
3661# Require siginterrupt() in order to ensure that system calls are
3662# interrupted by default.
3663@requireAttrs(signal, "siginterrupt")
3664@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3665 "Don't have signal.alarm or signal.setitimer")
3666class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3667 # Test interrupting the recv*() methods with signals when a
3668 # timeout is set.
3669
3670 def setUp(self):
3671 super().setUp()
3672 self.serv.settimeout(self.timeout)
3673
3674 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003675 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003676 # errno of EINTR when interrupted by a signal.
3677 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003678 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003679 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003680
3681 def testInterruptedRecvTimeout(self):
3682 self.checkInterruptedRecv(self.serv.recv, 1024)
3683
3684 def testInterruptedRecvIntoTimeout(self):
3685 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3686
3687 def testInterruptedRecvfromTimeout(self):
3688 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3689
3690 def testInterruptedRecvfromIntoTimeout(self):
3691 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3692
3693 @requireAttrs(socket.socket, "recvmsg")
3694 def testInterruptedRecvmsgTimeout(self):
3695 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3696
3697 @requireAttrs(socket.socket, "recvmsg_into")
3698 def testInterruptedRecvmsgIntoTimeout(self):
3699 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3700
3701
3702# Require siginterrupt() in order to ensure that system calls are
3703# interrupted by default.
3704@requireAttrs(signal, "siginterrupt")
3705@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3706 "Don't have signal.alarm or signal.setitimer")
3707@unittest.skipUnless(thread, 'Threading required for this test.')
3708class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3709 ThreadSafeCleanupTestCase,
3710 SocketListeningTestMixin, TCPTestBase):
3711 # Test interrupting the interruptible send*() methods with signals
3712 # when a timeout is set.
3713
3714 def setUp(self):
3715 super().setUp()
3716 self.serv_conn = self.newSocket()
3717 self.addCleanup(self.serv_conn.close)
3718 # Use a thread to complete the connection, but wait for it to
3719 # terminate before running the test, so that there is only one
3720 # thread to accept the signal.
3721 cli_thread = threading.Thread(target=self.doConnect)
3722 cli_thread.start()
3723 self.cli_conn, addr = self.serv.accept()
3724 self.addCleanup(self.cli_conn.close)
3725 cli_thread.join()
3726 self.serv_conn.settimeout(self.timeout)
3727
3728 def doConnect(self):
3729 self.serv_conn.connect(self.serv_addr)
3730
3731 def checkInterruptedSend(self, func, *args, **kwargs):
3732 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003733 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003734 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003735 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003736 while True:
3737 self.setAlarm(self.alarm_time)
3738 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003739
Ned Deilyc5640382014-02-03 13:58:31 -08003740 # Issue #12958: The following tests have problems on OS X prior to 10.7
3741 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003742 def testInterruptedSendTimeout(self):
3743 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3744
Ned Deilyc5640382014-02-03 13:58:31 -08003745 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003746 def testInterruptedSendtoTimeout(self):
3747 # Passing an actual address here as Python's wrapper for
3748 # sendto() doesn't allow passing a zero-length one; POSIX
3749 # requires that the address is ignored since the socket is
3750 # connection-mode, however.
3751 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3752 self.serv_addr)
3753
Ned Deilyc5640382014-02-03 13:58:31 -08003754 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003755 @requireAttrs(socket.socket, "sendmsg")
3756 def testInterruptedSendmsgTimeout(self):
3757 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3758
3759
Victor Stinner45df8202010-04-28 22:31:17 +00003760@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003761class TCPCloserTest(ThreadedTCPSocketTest):
3762
3763 def testClose(self):
3764 conn, addr = self.serv.accept()
3765 conn.close()
3766
3767 sd = self.cli
3768 read, write, err = select.select([sd], [], [], 1.0)
3769 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003770 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003771
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003772 # Calling close() many times should be safe.
3773 conn.close()
3774 conn.close()
3775
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003776 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003777 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003778 time.sleep(1.0)
3779
Victor Stinner45df8202010-04-28 22:31:17 +00003780@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003781class BasicSocketPairTest(SocketPairTest):
3782
3783 def __init__(self, methodName='runTest'):
3784 SocketPairTest.__init__(self, methodName=methodName)
3785
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003786 def _check_defaults(self, sock):
3787 self.assertIsInstance(sock, socket.socket)
3788 if hasattr(socket, 'AF_UNIX'):
3789 self.assertEqual(sock.family, socket.AF_UNIX)
3790 else:
3791 self.assertEqual(sock.family, socket.AF_INET)
3792 self.assertEqual(sock.type, socket.SOCK_STREAM)
3793 self.assertEqual(sock.proto, 0)
3794
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003795 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003796 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003797
3798 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003799 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003800
Dave Cole331708b2004-08-09 04:51:41 +00003801 def testRecv(self):
3802 msg = self.serv.recv(1024)
3803 self.assertEqual(msg, MSG)
3804
3805 def _testRecv(self):
3806 self.cli.send(MSG)
3807
3808 def testSend(self):
3809 self.serv.send(MSG)
3810
3811 def _testSend(self):
3812 msg = self.cli.recv(1024)
3813 self.assertEqual(msg, MSG)
3814
Victor Stinner45df8202010-04-28 22:31:17 +00003815@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003816class NonBlockingTCPTests(ThreadedTCPSocketTest):
3817
3818 def __init__(self, methodName='runTest'):
3819 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3820
3821 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003822 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003823 self.serv.setblocking(True)
3824 self.assertIsNone(self.serv.gettimeout())
3825 self.serv.setblocking(False)
3826 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003827 start = time.time()
3828 try:
3829 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003830 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003831 pass
3832 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003833 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003834
3835 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003836 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003837
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003838 @support.cpython_only
3839 def testSetBlocking_overflow(self):
3840 # Issue 15989
3841 import _testcapi
3842 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3843 self.skipTest('needs UINT_MAX < ULONG_MAX')
3844 self.serv.setblocking(False)
3845 self.assertEqual(self.serv.gettimeout(), 0.0)
3846 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3847 self.assertIsNone(self.serv.gettimeout())
3848
3849 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3850
Serhiy Storchaka43767632013-11-03 21:31:38 +02003851 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3852 'test needs socket.SOCK_NONBLOCK')
3853 @support.requires_linux_version(2, 6, 28)
3854 def testInitNonBlocking(self):
3855 # reinit server socket
3856 self.serv.close()
3857 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3858 socket.SOCK_NONBLOCK)
3859 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003860 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003861 # actual testing
3862 start = time.time()
3863 try:
3864 self.serv.accept()
3865 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003866 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003867 end = time.time()
3868 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3869
3870 def _testInitNonBlocking(self):
3871 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003872
Antoine Pitrou600232b2011-01-05 21:03:42 +00003873 def testInheritFlags(self):
3874 # Issue #7995: when calling accept() on a listening socket with a
3875 # timeout, the resulting socket should not be non-blocking.
3876 self.serv.settimeout(10)
3877 try:
3878 conn, addr = self.serv.accept()
3879 message = conn.recv(len(MSG))
3880 finally:
3881 conn.close()
3882 self.serv.settimeout(None)
3883
3884 def _testInheritFlags(self):
3885 time.sleep(0.1)
3886 self.cli.connect((HOST, self.port))
3887 time.sleep(0.5)
3888 self.cli.send(MSG)
3889
Guido van Rossum24e4af82002-06-12 19:18:08 +00003890 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003891 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003892 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003893 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003894 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003895 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003896 pass
3897 else:
3898 self.fail("Error trying to do non-blocking accept.")
3899 read, write, err = select.select([self.serv], [], [])
3900 if self.serv in read:
3901 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003902 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003903 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003904 else:
3905 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003906
Guido van Rossum24e4af82002-06-12 19:18:08 +00003907 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003908 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003909 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003910
3911 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003912 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003913 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003914 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003915
3916 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003917 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003918 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003919
3920 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003921 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003922 conn, addr = self.serv.accept()
3923 conn.setblocking(0)
3924 try:
3925 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003926 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003927 pass
3928 else:
3929 self.fail("Error trying to do non-blocking recv.")
3930 read, write, err = select.select([conn], [], [])
3931 if conn in read:
3932 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003933 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003934 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003935 else:
3936 self.fail("Error during select call to non-blocking socket.")
3937
3938 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003939 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003940 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003941 self.cli.send(MSG)
3942
Victor Stinner45df8202010-04-28 22:31:17 +00003943@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003944class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003945 """Unit tests for the object returned by socket.makefile()
3946
Antoine Pitrou834bd812010-10-13 16:17:14 +00003947 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003948 the client connection. You can read from this file to
3949 get output from the server.
3950
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003952 server connection. You can write to this file to send output
3953 to the client.
3954 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003955
Guido van Rossume9f66142002-08-07 15:46:19 +00003956 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003957 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003958 errors = 'strict'
3959 newline = None
3960
3961 read_mode = 'rb'
3962 read_msg = MSG
3963 write_mode = 'wb'
3964 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003965
Guido van Rossum24e4af82002-06-12 19:18:08 +00003966 def __init__(self, methodName='runTest'):
3967 SocketConnectedTest.__init__(self, methodName=methodName)
3968
3969 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003970 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3971 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003972 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003973 self.read_file = self.cli_conn.makefile(
3974 self.read_mode, self.bufsize,
3975 encoding = self.encoding,
3976 errors = self.errors,
3977 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003978
3979 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003980 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.read_file.close()
3982 self.assertTrue(self.read_file.closed)
3983 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003984 SocketConnectedTest.tearDown(self)
3985
3986 def clientSetUp(self):
3987 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003988 self.write_file = self.serv_conn.makefile(
3989 self.write_mode, self.bufsize,
3990 encoding = self.encoding,
3991 errors = self.errors,
3992 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003993
3994 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003995 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 self.write_file.close()
3997 self.assertTrue(self.write_file.closed)
3998 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003999 SocketConnectedTest.clientTearDown(self)
4000
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004001 def testReadAfterTimeout(self):
4002 # Issue #7322: A file object must disallow further reads
4003 # after a timeout has occurred.
4004 self.cli_conn.settimeout(1)
4005 self.read_file.read(3)
4006 # First read raises a timeout
4007 self.assertRaises(socket.timeout, self.read_file.read, 1)
4008 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004009 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004010 self.read_file.read(1)
4011 self.assertIn("cannot read from timed out object", str(ctx.exception))
4012
4013 def _testReadAfterTimeout(self):
4014 self.write_file.write(self.write_msg[0:3])
4015 self.write_file.flush()
4016 self.serv_finished.wait()
4017
Guido van Rossum24e4af82002-06-12 19:18:08 +00004018 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004019 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004020 first_seg = self.read_file.read(len(self.read_msg)-3)
4021 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004022 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004024
4025 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004026 self.write_file.write(self.write_msg)
4027 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004028
Guido van Rossum8c943832002-08-08 01:00:28 +00004029 def testFullRead(self):
4030 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004031 msg = self.read_file.read()
4032 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004033
4034 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004035 self.write_file.write(self.write_msg)
4036 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004037
Guido van Rossum24e4af82002-06-12 19:18:08 +00004038 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004039 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004040 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004041 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004042 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004043 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004044 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004045 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004046 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004047
4048 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004049 self.write_file.write(self.write_msg)
4050 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004051
4052 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004053 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004054 line = self.read_file.readline()
4055 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004056
4057 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004058 self.write_file.write(self.write_msg)
4059 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004060
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004061 def testCloseAfterMakefile(self):
4062 # The file returned by makefile should keep the socket open.
4063 self.cli_conn.close()
4064 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004065 msg = self.read_file.read()
4066 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004067
4068 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004069 self.write_file.write(self.write_msg)
4070 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004071
4072 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004073 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004074 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004075 if isinstance(self.read_msg, str):
4076 msg = msg.decode()
4077 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004078
4079 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004080 self.write_file.write(self.write_msg)
4081 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004082
Tim Peters116d83c2004-03-28 02:20:45 +00004083 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004084 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004085
4086 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004087 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004088
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004089 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004090 self.assertEqual(self.read_file.mode, self.read_mode)
4091 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004092
4093 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004094 self.assertEqual(self.write_file.mode, self.write_mode)
4095 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004096
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004097 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004098 self.read_file.close()
4099 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004100 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004101 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004102
4103 def _testRealClose(self):
4104 pass
4105
4106
Guido van Rossume9f66142002-08-07 15:46:19 +00004107class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4108
4109 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004110
Guido van Rossume9f66142002-08-07 15:46:19 +00004111 In this case (and in this case only), it should be possible to
4112 create a file object, read a line from it, create another file
4113 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004114 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004115 when reading multiple requests from the same socket."""
4116
4117 bufsize = 0 # Use unbuffered mode
4118
4119 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004120 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004121 line = self.read_file.readline() # first line
4122 self.assertEqual(line, b"A. " + self.write_msg) # first line
4123 self.read_file = self.cli_conn.makefile('rb', 0)
4124 line = self.read_file.readline() # second line
4125 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004126
4127 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004128 self.write_file.write(b"A. " + self.write_msg)
4129 self.write_file.write(b"B. " + self.write_msg)
4130 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004131
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004132 def testMakefileClose(self):
4133 # The file returned by makefile should keep the socket open...
4134 self.cli_conn.close()
4135 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004136 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004137 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004138 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004139 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004140
4141 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004142 self.write_file.write(self.write_msg)
4143 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004144
4145 def testMakefileCloseSocketDestroy(self):
4146 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004147 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004148 refcount_after = sys.getrefcount(self.cli_conn)
4149 self.assertEqual(refcount_before - 1, refcount_after)
4150
4151 def _testMakefileCloseSocketDestroy(self):
4152 pass
4153
Antoine Pitrou98b46702010-09-18 22:59:00 +00004154 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004155 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004156 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4157
4158 def testSmallReadNonBlocking(self):
4159 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004160 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4161 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004162 self.evt1.set()
4163 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004164 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004165 if first_seg is None:
4166 # Data not arrived (can happen under Windows), wait a bit
4167 time.sleep(0.5)
4168 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004169 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004170 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004171 self.assertEqual(n, 3)
4172 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004173 self.assertEqual(msg, self.read_msg)
4174 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4175 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004176
4177 def _testSmallReadNonBlocking(self):
4178 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004179 self.write_file.write(self.write_msg)
4180 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004181 self.evt2.set()
4182 # Avoid cloding the socket before the server test has finished,
4183 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4184 self.serv_finished.wait(5.0)
4185
4186 def testWriteNonBlocking(self):
4187 self.cli_finished.wait(5.0)
4188 # The client thread can't skip directly - the SkipTest exception
4189 # would appear as a failure.
4190 if self.serv_skipped:
4191 self.skipTest(self.serv_skipped)
4192
4193 def _testWriteNonBlocking(self):
4194 self.serv_skipped = None
4195 self.serv_conn.setblocking(False)
4196 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004197 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004198 LIMIT = 10
4199 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004200 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004201 self.assertGreater(n, 0)
4202 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004203 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004204 if n is None:
4205 # Succeeded
4206 break
4207 self.assertGreater(n, 0)
4208 else:
4209 # Let us know that this test didn't manage to establish
4210 # the expected conditions. This is not a failure in itself but,
4211 # if it happens repeatedly, the test should be fixed.
4212 self.serv_skipped = "failed to saturate the socket buffer"
4213
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004214
Guido van Rossum8c943832002-08-08 01:00:28 +00004215class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4216
4217 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4218
4219
4220class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4221
4222 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004223
Thomas Woutersb2137042007-02-01 18:02:27 +00004224
Antoine Pitrou834bd812010-10-13 16:17:14 +00004225class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4226 """Tests for socket.makefile() in text mode (rather than binary)"""
4227
4228 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004229 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004230 write_mode = 'wb'
4231 write_msg = MSG
4232 newline = ''
4233
4234
4235class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4236 """Tests for socket.makefile() in text mode (rather than binary)"""
4237
4238 read_mode = 'rb'
4239 read_msg = MSG
4240 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004241 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 newline = ''
4243
4244
4245class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4246 """Tests for socket.makefile() in text mode (rather than binary)"""
4247
4248 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004249 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004250 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004251 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004252 newline = ''
4253
4254
Guido van Rossumd8faa362007-04-27 19:54:29 +00004255class NetworkConnectionTest(object):
4256 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004257
Guido van Rossumd8faa362007-04-27 19:54:29 +00004258 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004259 # We're inherited below by BasicTCPTest2, which also inherits
4260 # BasicTCPTest, which defines self.port referenced below.
4261 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004262 self.serv_conn = self.cli
4263
4264class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4265 """Tests that NetworkConnection does not break existing TCP functionality.
4266 """
4267
4268class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004269
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004270 class MockSocket(socket.socket):
4271 def connect(self, *args):
4272 raise socket.timeout('timed out')
4273
4274 @contextlib.contextmanager
4275 def mocked_socket_module(self):
4276 """Return a socket which times out on connect"""
4277 old_socket = socket.socket
4278 socket.socket = self.MockSocket
4279 try:
4280 yield
4281 finally:
4282 socket.socket = old_socket
4283
4284 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004285 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004286 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004287 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004288 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004289 cli.connect((HOST, port))
4290 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4291
4292 def test_create_connection(self):
4293 # Issue #9792: errors raised by create_connection() should have
4294 # a proper errno attribute.
4295 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004296 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004297 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004298
4299 # Issue #16257: create_connection() calls getaddrinfo() against
4300 # 'localhost'. This may result in an IPV6 addr being returned
4301 # as well as an IPV4 one:
4302 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4303 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4304 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4305 #
4306 # create_connection() enumerates through all the addresses returned
4307 # and if it doesn't successfully bind to any of them, it propagates
4308 # the last exception it encountered.
4309 #
4310 # On Solaris, ENETUNREACH is returned in this circumstance instead
4311 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4312 # expected errnos.
4313 expected_errnos = [ errno.ECONNREFUSED, ]
4314 if hasattr(errno, 'ENETUNREACH'):
4315 expected_errnos.append(errno.ENETUNREACH)
4316
4317 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004318
4319 def test_create_connection_timeout(self):
4320 # Issue #9792: create_connection() should not recast timeout errors
4321 # as generic socket errors.
4322 with self.mocked_socket_module():
4323 with self.assertRaises(socket.timeout):
4324 socket.create_connection((HOST, 1234))
4325
Guido van Rossumd8faa362007-04-27 19:54:29 +00004326
Victor Stinner45df8202010-04-28 22:31:17 +00004327@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004328class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4329
4330 def __init__(self, methodName='runTest'):
4331 SocketTCPTest.__init__(self, methodName=methodName)
4332 ThreadableTest.__init__(self)
4333
4334 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004335 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004336
4337 def clientTearDown(self):
4338 self.cli.close()
4339 self.cli = None
4340 ThreadableTest.clientTearDown(self)
4341
4342 def _justAccept(self):
4343 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004344 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004345
4346 testFamily = _justAccept
4347 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004348 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004349 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004350 self.assertEqual(self.cli.family, 2)
4351
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004352 testSourceAddress = _justAccept
4353 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004354 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4355 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004356 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004357 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004358 # The port number being used is sufficient to show that the bind()
4359 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004360
Guido van Rossumd8faa362007-04-27 19:54:29 +00004361 testTimeoutDefault = _justAccept
4362 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004363 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004364 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004365 socket.setdefaulttimeout(42)
4366 try:
4367 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004368 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004369 finally:
4370 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004371 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004372
4373 testTimeoutNone = _justAccept
4374 def _testTimeoutNone(self):
4375 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004376 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004377 socket.setdefaulttimeout(30)
4378 try:
4379 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004380 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004381 finally:
4382 socket.setdefaulttimeout(None)
4383 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004384
4385 testTimeoutValueNamed = _justAccept
4386 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004387 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004388 self.assertEqual(self.cli.gettimeout(), 30)
4389
4390 testTimeoutValueNonamed = _justAccept
4391 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004392 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004393 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004394 self.assertEqual(self.cli.gettimeout(), 30)
4395
Victor Stinner45df8202010-04-28 22:31:17 +00004396@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004397class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4398
4399 def __init__(self, methodName='runTest'):
4400 SocketTCPTest.__init__(self, methodName=methodName)
4401 ThreadableTest.__init__(self)
4402
4403 def clientSetUp(self):
4404 pass
4405
4406 def clientTearDown(self):
4407 self.cli.close()
4408 self.cli = None
4409 ThreadableTest.clientTearDown(self)
4410
4411 def testInsideTimeout(self):
4412 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004413 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004414 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004415 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004416 testOutsideTimeout = testInsideTimeout
4417
4418 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004419 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004420 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004421 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004422
4423 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004424 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004425 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004426
4427
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004428class TCPTimeoutTest(SocketTCPTest):
4429
4430 def testTCPTimeout(self):
4431 def raise_timeout(*args, **kwargs):
4432 self.serv.settimeout(1.0)
4433 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004434 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004435 "Error generating a timeout exception (TCP)")
4436
4437 def testTimeoutZero(self):
4438 ok = False
4439 try:
4440 self.serv.settimeout(0.0)
4441 foo = self.serv.accept()
4442 except socket.timeout:
4443 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004444 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004445 ok = True
4446 except:
4447 self.fail("caught unexpected exception (TCP)")
4448 if not ok:
4449 self.fail("accept() returned success when we did not expect it")
4450
Serhiy Storchaka43767632013-11-03 21:31:38 +02004451 @unittest.skipUnless(hasattr(signal, 'alarm'),
4452 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004453 def testInterruptedTimeout(self):
4454 # XXX I don't know how to do this test on MSWindows or any other
4455 # plaform that doesn't support signal.alarm() or os.kill(), though
4456 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004457 self.serv.settimeout(5.0) # must be longer than alarm
4458 class Alarm(Exception):
4459 pass
4460 def alarm_handler(signal, frame):
4461 raise Alarm
4462 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4463 try:
4464 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4465 try:
4466 foo = self.serv.accept()
4467 except socket.timeout:
4468 self.fail("caught timeout instead of Alarm")
4469 except Alarm:
4470 pass
4471 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004472 self.fail("caught other exception instead of Alarm:"
4473 " %s(%s):\n%s" %
4474 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004475 else:
4476 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004477 finally:
4478 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004479 except Alarm:
4480 self.fail("got Alarm in wrong place")
4481 finally:
4482 # no alarm can be pending. Safe to restore old handler.
4483 signal.signal(signal.SIGALRM, old_alarm)
4484
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004485class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004486
4487 def testUDPTimeout(self):
4488 def raise_timeout(*args, **kwargs):
4489 self.serv.settimeout(1.0)
4490 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004491 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004492 "Error generating a timeout exception (UDP)")
4493
4494 def testTimeoutZero(self):
4495 ok = False
4496 try:
4497 self.serv.settimeout(0.0)
4498 foo = self.serv.recv(1024)
4499 except socket.timeout:
4500 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004501 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004502 ok = True
4503 except:
4504 self.fail("caught unexpected exception (UDP)")
4505 if not ok:
4506 self.fail("recv() returned success when we did not expect it")
4507
4508class TestExceptions(unittest.TestCase):
4509
4510 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004511 self.assertTrue(issubclass(OSError, Exception))
4512 self.assertTrue(issubclass(socket.herror, OSError))
4513 self.assertTrue(issubclass(socket.gaierror, OSError))
4514 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004515
Serhiy Storchaka43767632013-11-03 21:31:38 +02004516@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004517class TestLinuxAbstractNamespace(unittest.TestCase):
4518
4519 UNIX_PATH_MAX = 108
4520
4521 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004522 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004523 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4524 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004525 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004526 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4527 s2.connect(s1.getsockname())
4528 with s1.accept()[0] as s3:
4529 self.assertEqual(s1.getsockname(), address)
4530 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004531
4532 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004533 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004534 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4535 s.bind(address)
4536 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004537
4538 def testNameOverflow(self):
4539 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004540 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004541 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004542
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004543 def testStrName(self):
4544 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004545 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4546 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004547 s.bind("\x00python\x00test\x00")
4548 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004549 finally:
4550 s.close()
4551
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004552 def testBytearrayName(self):
4553 # Check that an abstract name can be passed as a bytearray.
4554 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4555 s.bind(bytearray(b"\x00python\x00test\x00"))
4556 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4557
Serhiy Storchaka43767632013-11-03 21:31:38 +02004558@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004559class TestUnixDomain(unittest.TestCase):
4560
4561 def setUp(self):
4562 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4563
4564 def tearDown(self):
4565 self.sock.close()
4566
4567 def encoded(self, path):
4568 # Return the given path encoded in the file system encoding,
4569 # or skip the test if this is not possible.
4570 try:
4571 return os.fsencode(path)
4572 except UnicodeEncodeError:
4573 self.skipTest(
4574 "Pathname {0!a} cannot be represented in file "
4575 "system encoding {1!r}".format(
4576 path, sys.getfilesystemencoding()))
4577
Antoine Pitrou16374872011-12-16 15:04:12 +01004578 def bind(self, sock, path):
4579 # Bind the socket
4580 try:
4581 sock.bind(path)
4582 except OSError as e:
4583 if str(e) == "AF_UNIX path too long":
4584 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004585 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004586 .format(path))
4587 else:
4588 raise
4589
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004590 def testStrAddr(self):
4591 # Test binding to and retrieving a normal string pathname.
4592 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004593 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004594 self.addCleanup(support.unlink, path)
4595 self.assertEqual(self.sock.getsockname(), path)
4596
4597 def testBytesAddr(self):
4598 # Test binding to a bytes pathname.
4599 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004600 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004601 self.addCleanup(support.unlink, path)
4602 self.assertEqual(self.sock.getsockname(), path)
4603
4604 def testSurrogateescapeBind(self):
4605 # Test binding to a valid non-ASCII pathname, with the
4606 # non-ASCII bytes supplied using surrogateescape encoding.
4607 path = os.path.abspath(support.TESTFN_UNICODE)
4608 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004609 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004610 self.addCleanup(support.unlink, path)
4611 self.assertEqual(self.sock.getsockname(), path)
4612
4613 def testUnencodableAddr(self):
4614 # Test binding to a pathname that cannot be encoded in the
4615 # file system encoding.
4616 if support.TESTFN_UNENCODABLE is None:
4617 self.skipTest("No unencodable filename available")
4618 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004619 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004620 self.addCleanup(support.unlink, path)
4621 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004622
Victor Stinner45df8202010-04-28 22:31:17 +00004623@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004624class BufferIOTest(SocketConnectedTest):
4625 """
4626 Test the buffer versions of socket.recv() and socket.send().
4627 """
4628 def __init__(self, methodName='runTest'):
4629 SocketConnectedTest.__init__(self, methodName=methodName)
4630
Antoine Pitrou25480782010-03-17 22:50:28 +00004631 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004632 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004633 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004634 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004635 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004636 self.assertEqual(msg, MSG)
4637
Antoine Pitrou25480782010-03-17 22:50:28 +00004638 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004639 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004640 self.serv_conn.send(buf)
4641
Antoine Pitrou25480782010-03-17 22:50:28 +00004642 def testRecvIntoBytearray(self):
4643 buf = bytearray(1024)
4644 nbytes = self.cli_conn.recv_into(buf)
4645 self.assertEqual(nbytes, len(MSG))
4646 msg = buf[:len(MSG)]
4647 self.assertEqual(msg, MSG)
4648
4649 _testRecvIntoBytearray = _testRecvIntoArray
4650
4651 def testRecvIntoMemoryview(self):
4652 buf = bytearray(1024)
4653 nbytes = self.cli_conn.recv_into(memoryview(buf))
4654 self.assertEqual(nbytes, len(MSG))
4655 msg = buf[:len(MSG)]
4656 self.assertEqual(msg, MSG)
4657
4658 _testRecvIntoMemoryview = _testRecvIntoArray
4659
4660 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004661 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004662 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004663 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004664 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004665 self.assertEqual(msg, MSG)
4666
Antoine Pitrou25480782010-03-17 22:50:28 +00004667 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004668 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004669 self.serv_conn.send(buf)
4670
Antoine Pitrou25480782010-03-17 22:50:28 +00004671 def testRecvFromIntoBytearray(self):
4672 buf = bytearray(1024)
4673 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4674 self.assertEqual(nbytes, len(MSG))
4675 msg = buf[:len(MSG)]
4676 self.assertEqual(msg, MSG)
4677
4678 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4679
4680 def testRecvFromIntoMemoryview(self):
4681 buf = bytearray(1024)
4682 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4683 self.assertEqual(nbytes, len(MSG))
4684 msg = buf[:len(MSG)]
4685 self.assertEqual(msg, MSG)
4686
4687 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4688
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004689 def testRecvFromIntoSmallBuffer(self):
4690 # See issue #20246.
4691 buf = bytearray(8)
4692 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4693
4694 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004695 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004696
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004697 def testRecvFromIntoEmptyBuffer(self):
4698 buf = bytearray()
4699 self.cli_conn.recvfrom_into(buf)
4700 self.cli_conn.recvfrom_into(buf, 0)
4701
4702 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4703
Christian Heimes043d6f62008-01-07 17:19:16 +00004704
4705TIPC_STYPE = 2000
4706TIPC_LOWER = 200
4707TIPC_UPPER = 210
4708
4709def isTipcAvailable():
4710 """Check if the TIPC module is loaded
4711
4712 The TIPC module is not loaded automatically on Ubuntu and probably
4713 other Linux distros.
4714 """
4715 if not hasattr(socket, "AF_TIPC"):
4716 return False
4717 if not os.path.isfile("/proc/modules"):
4718 return False
4719 with open("/proc/modules") as f:
4720 for line in f:
4721 if line.startswith("tipc "):
4722 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004723 return False
4724
Serhiy Storchaka43767632013-11-03 21:31:38 +02004725@unittest.skipUnless(isTipcAvailable(),
4726 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004727class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004728 def testRDM(self):
4729 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4730 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004731 self.addCleanup(srv.close)
4732 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004733
4734 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4735 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4736 TIPC_LOWER, TIPC_UPPER)
4737 srv.bind(srvaddr)
4738
4739 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4740 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4741 cli.sendto(MSG, sendaddr)
4742
4743 msg, recvaddr = srv.recvfrom(1024)
4744
4745 self.assertEqual(cli.getsockname(), recvaddr)
4746 self.assertEqual(msg, MSG)
4747
4748
Serhiy Storchaka43767632013-11-03 21:31:38 +02004749@unittest.skipUnless(isTipcAvailable(),
4750 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004751class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004752 def __init__(self, methodName = 'runTest'):
4753 unittest.TestCase.__init__(self, methodName = methodName)
4754 ThreadableTest.__init__(self)
4755
4756 def setUp(self):
4757 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004758 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004759 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4760 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4761 TIPC_LOWER, TIPC_UPPER)
4762 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004763 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004764 self.serverExplicitReady()
4765 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004766 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004767
4768 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00004769 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00004770 # accept() call; sleep a little while to avoid it, otherwise
4771 # we could get an exception
4772 time.sleep(0.1)
4773 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004774 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004775 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4776 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4777 self.cli.connect(addr)
4778 self.cliaddr = self.cli.getsockname()
4779
4780 def testStream(self):
4781 msg = self.conn.recv(1024)
4782 self.assertEqual(msg, MSG)
4783 self.assertEqual(self.cliaddr, self.connaddr)
4784
4785 def _testStream(self):
4786 self.cli.send(MSG)
4787 self.cli.close()
4788
4789
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004790@unittest.skipUnless(thread, 'Threading required for this test.')
4791class ContextManagersTest(ThreadedTCPSocketTest):
4792
4793 def _testSocketClass(self):
4794 # base test
4795 with socket.socket() as sock:
4796 self.assertFalse(sock._closed)
4797 self.assertTrue(sock._closed)
4798 # close inside with block
4799 with socket.socket() as sock:
4800 sock.close()
4801 self.assertTrue(sock._closed)
4802 # exception inside with block
4803 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004804 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004805 self.assertTrue(sock._closed)
4806
4807 def testCreateConnectionBase(self):
4808 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004809 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004810 data = conn.recv(1024)
4811 conn.sendall(data)
4812
4813 def _testCreateConnectionBase(self):
4814 address = self.serv.getsockname()
4815 with socket.create_connection(address) as sock:
4816 self.assertFalse(sock._closed)
4817 sock.sendall(b'foo')
4818 self.assertEqual(sock.recv(1024), b'foo')
4819 self.assertTrue(sock._closed)
4820
4821 def testCreateConnectionClose(self):
4822 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004823 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004824 data = conn.recv(1024)
4825 conn.sendall(data)
4826
4827 def _testCreateConnectionClose(self):
4828 address = self.serv.getsockname()
4829 with socket.create_connection(address) as sock:
4830 sock.close()
4831 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004832 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004833
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004834
Victor Stinnerdaf45552013-08-28 00:53:59 +02004835class InheritanceTest(unittest.TestCase):
4836 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4837 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004838 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004839 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004840 with socket.socket(socket.AF_INET,
4841 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4842 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004843 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004844
4845 def test_default_inheritable(self):
4846 sock = socket.socket()
4847 with sock:
4848 self.assertEqual(sock.get_inheritable(), False)
4849
4850 def test_dup(self):
4851 sock = socket.socket()
4852 with sock:
4853 newsock = sock.dup()
4854 sock.close()
4855 with newsock:
4856 self.assertEqual(newsock.get_inheritable(), False)
4857
4858 def test_set_inheritable(self):
4859 sock = socket.socket()
4860 with sock:
4861 sock.set_inheritable(True)
4862 self.assertEqual(sock.get_inheritable(), True)
4863
4864 sock.set_inheritable(False)
4865 self.assertEqual(sock.get_inheritable(), False)
4866
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004867 @unittest.skipIf(fcntl is None, "need fcntl")
4868 def test_get_inheritable_cloexec(self):
4869 sock = socket.socket()
4870 with sock:
4871 fd = sock.fileno()
4872 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004873
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004874 # clear FD_CLOEXEC flag
4875 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4876 flags &= ~fcntl.FD_CLOEXEC
4877 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004878
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004879 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004880
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004881 @unittest.skipIf(fcntl is None, "need fcntl")
4882 def test_set_inheritable_cloexec(self):
4883 sock = socket.socket()
4884 with sock:
4885 fd = sock.fileno()
4886 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4887 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004888
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004889 sock.set_inheritable(True)
4890 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4891 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004892
4893
Victor Stinnerdaf45552013-08-28 00:53:59 +02004894 @unittest.skipUnless(hasattr(socket, "socketpair"),
4895 "need socket.socketpair()")
4896 def test_socketpair(self):
4897 s1, s2 = socket.socketpair()
4898 self.addCleanup(s1.close)
4899 self.addCleanup(s2.close)
4900 self.assertEqual(s1.get_inheritable(), False)
4901 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004902
4903
4904@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4905 "SOCK_NONBLOCK not defined")
4906class NonblockConstantTest(unittest.TestCase):
4907 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4908 if nonblock:
4909 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4910 self.assertEqual(s.gettimeout(), timeout)
4911 else:
4912 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4913 self.assertEqual(s.gettimeout(), None)
4914
Charles-François Natali239bb962011-06-03 12:55:15 +02004915 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004916 def test_SOCK_NONBLOCK(self):
4917 # a lot of it seems silly and redundant, but I wanted to test that
4918 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004919 with socket.socket(socket.AF_INET,
4920 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4921 self.checkNonblock(s)
4922 s.setblocking(1)
4923 self.checkNonblock(s, False)
4924 s.setblocking(0)
4925 self.checkNonblock(s)
4926 s.settimeout(None)
4927 self.checkNonblock(s, False)
4928 s.settimeout(2.0)
4929 self.checkNonblock(s, timeout=2.0)
4930 s.setblocking(1)
4931 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004932 # defaulttimeout
4933 t = socket.getdefaulttimeout()
4934 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004935 with socket.socket() as s:
4936 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004937 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004938 with socket.socket() as s:
4939 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004940 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004941 with socket.socket() as s:
4942 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004943 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004944 with socket.socket() as s:
4945 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004946 socket.setdefaulttimeout(t)
4947
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004948
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004949@unittest.skipUnless(os.name == "nt", "Windows specific")
4950@unittest.skipUnless(multiprocessing, "need multiprocessing")
4951class TestSocketSharing(SocketTCPTest):
4952 # This must be classmethod and not staticmethod or multiprocessing
4953 # won't be able to bootstrap it.
4954 @classmethod
4955 def remoteProcessServer(cls, q):
4956 # Recreate socket from shared data
4957 sdata = q.get()
4958 message = q.get()
4959
4960 s = socket.fromshare(sdata)
4961 s2, c = s.accept()
4962
4963 # Send the message
4964 s2.sendall(message)
4965 s2.close()
4966 s.close()
4967
4968 def testShare(self):
4969 # Transfer the listening server socket to another process
4970 # and service it from there.
4971
4972 # Create process:
4973 q = multiprocessing.Queue()
4974 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4975 p.start()
4976
4977 # Get the shared socket data
4978 data = self.serv.share(p.pid)
4979
4980 # Pass the shared socket to the other process
4981 addr = self.serv.getsockname()
4982 self.serv.close()
4983 q.put(data)
4984
4985 # The data that the server will send us
4986 message = b"slapmahfro"
4987 q.put(message)
4988
4989 # Connect
4990 s = socket.create_connection(addr)
4991 # listen for the data
4992 m = []
4993 while True:
4994 data = s.recv(100)
4995 if not data:
4996 break
4997 m.append(data)
4998 s.close()
4999 received = b"".join(m)
5000 self.assertEqual(received, message)
5001 p.join()
5002
5003 def testShareLength(self):
5004 data = self.serv.share(os.getpid())
5005 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5006 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5007
5008 def compareSockets(self, org, other):
5009 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005010 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005011 self.assertEqual(org.gettimeout(), None)
5012 self.assertEqual(org.gettimeout(), other.gettimeout())
5013
5014 self.assertEqual(org.family, other.family)
5015 self.assertEqual(org.type, other.type)
5016 # If the user specified "0" for proto, then
5017 # internally windows will have picked the correct value.
5018 # Python introspection on the socket however will still return
5019 # 0. For the shared socket, the python value is recreated
5020 # from the actual value, so it may not compare correctly.
5021 if org.proto != 0:
5022 self.assertEqual(org.proto, other.proto)
5023
5024 def testShareLocal(self):
5025 data = self.serv.share(os.getpid())
5026 s = socket.fromshare(data)
5027 try:
5028 self.compareSockets(self.serv, s)
5029 finally:
5030 s.close()
5031
5032 def testTypes(self):
5033 families = [socket.AF_INET, socket.AF_INET6]
5034 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5035 for f in families:
5036 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005037 try:
5038 source = socket.socket(f, t)
5039 except OSError:
5040 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005041 try:
5042 data = source.share(os.getpid())
5043 shared = socket.fromshare(data)
5044 try:
5045 self.compareSockets(source, shared)
5046 finally:
5047 shared.close()
5048 finally:
5049 source.close()
5050
5051
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005052@unittest.skipUnless(thread, 'Threading required for this test.')
5053class SendfileUsingSendTest(ThreadedTCPSocketTest):
5054 """
5055 Test the send() implementation of socket.sendfile().
5056 """
5057
5058 FILESIZE = (10 * 1024 * 1024) # 10MB
5059 BUFSIZE = 8192
5060 FILEDATA = b""
5061 TIMEOUT = 2
5062
5063 @classmethod
5064 def setUpClass(cls):
5065 def chunks(total, step):
5066 assert total >= step
5067 while total > step:
5068 yield step
5069 total -= step
5070 if total:
5071 yield total
5072
5073 chunk = b"".join([random.choice(string.ascii_letters).encode()
5074 for i in range(cls.BUFSIZE)])
5075 with open(support.TESTFN, 'wb') as f:
5076 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5077 f.write(chunk)
5078 with open(support.TESTFN, 'rb') as f:
5079 cls.FILEDATA = f.read()
5080 assert len(cls.FILEDATA) == cls.FILESIZE
5081
5082 @classmethod
5083 def tearDownClass(cls):
5084 support.unlink(support.TESTFN)
5085
5086 def accept_conn(self):
5087 self.serv.settimeout(self.TIMEOUT)
5088 conn, addr = self.serv.accept()
5089 conn.settimeout(self.TIMEOUT)
5090 self.addCleanup(conn.close)
5091 return conn
5092
5093 def recv_data(self, conn):
5094 received = []
5095 while True:
5096 chunk = conn.recv(self.BUFSIZE)
5097 if not chunk:
5098 break
5099 received.append(chunk)
5100 return b''.join(received)
5101
5102 def meth_from_sock(self, sock):
5103 # Depending on the mixin class being run return either send()
5104 # or sendfile() method implementation.
5105 return getattr(sock, "_sendfile_use_send")
5106
5107 # regular file
5108
5109 def _testRegularFile(self):
5110 address = self.serv.getsockname()
5111 file = open(support.TESTFN, 'rb')
5112 with socket.create_connection(address) as sock, file as file:
5113 meth = self.meth_from_sock(sock)
5114 sent = meth(file)
5115 self.assertEqual(sent, self.FILESIZE)
5116 self.assertEqual(file.tell(), self.FILESIZE)
5117
5118 def testRegularFile(self):
5119 conn = self.accept_conn()
5120 data = self.recv_data(conn)
5121 self.assertEqual(len(data), self.FILESIZE)
5122 self.assertEqual(data, self.FILEDATA)
5123
5124 # non regular file
5125
5126 def _testNonRegularFile(self):
5127 address = self.serv.getsockname()
5128 file = io.BytesIO(self.FILEDATA)
5129 with socket.create_connection(address) as sock, file as file:
5130 sent = sock.sendfile(file)
5131 self.assertEqual(sent, self.FILESIZE)
5132 self.assertEqual(file.tell(), self.FILESIZE)
5133 self.assertRaises(socket._GiveupOnSendfile,
5134 sock._sendfile_use_sendfile, file)
5135
5136 def testNonRegularFile(self):
5137 conn = self.accept_conn()
5138 data = self.recv_data(conn)
5139 self.assertEqual(len(data), self.FILESIZE)
5140 self.assertEqual(data, self.FILEDATA)
5141
5142 # empty file
5143
5144 def _testEmptyFileSend(self):
5145 address = self.serv.getsockname()
5146 filename = support.TESTFN + "2"
5147 with open(filename, 'wb'):
5148 self.addCleanup(support.unlink, filename)
5149 file = open(filename, 'rb')
5150 with socket.create_connection(address) as sock, file as file:
5151 meth = self.meth_from_sock(sock)
5152 sent = meth(file)
5153 self.assertEqual(sent, 0)
5154 self.assertEqual(file.tell(), 0)
5155
5156 def testEmptyFileSend(self):
5157 conn = self.accept_conn()
5158 data = self.recv_data(conn)
5159 self.assertEqual(data, b"")
5160
5161 # offset
5162
5163 def _testOffset(self):
5164 address = self.serv.getsockname()
5165 file = open(support.TESTFN, 'rb')
5166 with socket.create_connection(address) as sock, file as file:
5167 meth = self.meth_from_sock(sock)
5168 sent = meth(file, offset=5000)
5169 self.assertEqual(sent, self.FILESIZE - 5000)
5170 self.assertEqual(file.tell(), self.FILESIZE)
5171
5172 def testOffset(self):
5173 conn = self.accept_conn()
5174 data = self.recv_data(conn)
5175 self.assertEqual(len(data), self.FILESIZE - 5000)
5176 self.assertEqual(data, self.FILEDATA[5000:])
5177
5178 # count
5179
5180 def _testCount(self):
5181 address = self.serv.getsockname()
5182 file = open(support.TESTFN, 'rb')
5183 with socket.create_connection(address, timeout=2) as sock, file as file:
5184 count = 5000007
5185 meth = self.meth_from_sock(sock)
5186 sent = meth(file, count=count)
5187 self.assertEqual(sent, count)
5188 self.assertEqual(file.tell(), count)
5189
5190 def testCount(self):
5191 count = 5000007
5192 conn = self.accept_conn()
5193 data = self.recv_data(conn)
5194 self.assertEqual(len(data), count)
5195 self.assertEqual(data, self.FILEDATA[:count])
5196
5197 # count small
5198
5199 def _testCountSmall(self):
5200 address = self.serv.getsockname()
5201 file = open(support.TESTFN, 'rb')
5202 with socket.create_connection(address, timeout=2) as sock, file as file:
5203 count = 1
5204 meth = self.meth_from_sock(sock)
5205 sent = meth(file, count=count)
5206 self.assertEqual(sent, count)
5207 self.assertEqual(file.tell(), count)
5208
5209 def testCountSmall(self):
5210 count = 1
5211 conn = self.accept_conn()
5212 data = self.recv_data(conn)
5213 self.assertEqual(len(data), count)
5214 self.assertEqual(data, self.FILEDATA[:count])
5215
5216 # count + offset
5217
5218 def _testCountWithOffset(self):
5219 address = self.serv.getsockname()
5220 file = open(support.TESTFN, 'rb')
5221 with socket.create_connection(address, timeout=2) as sock, file as file:
5222 count = 100007
5223 meth = self.meth_from_sock(sock)
5224 sent = meth(file, offset=2007, count=count)
5225 self.assertEqual(sent, count)
5226 self.assertEqual(file.tell(), count + 2007)
5227
5228 def testCountWithOffset(self):
5229 count = 100007
5230 conn = self.accept_conn()
5231 data = self.recv_data(conn)
5232 self.assertEqual(len(data), count)
5233 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5234
5235 # non blocking sockets are not supposed to work
5236
5237 def _testNonBlocking(self):
5238 address = self.serv.getsockname()
5239 file = open(support.TESTFN, 'rb')
5240 with socket.create_connection(address) as sock, file as file:
5241 sock.setblocking(False)
5242 meth = self.meth_from_sock(sock)
5243 self.assertRaises(ValueError, meth, file)
5244 self.assertRaises(ValueError, sock.sendfile, file)
5245
5246 def testNonBlocking(self):
5247 conn = self.accept_conn()
5248 if conn.recv(8192):
5249 self.fail('was not supposed to receive any data')
5250
5251 # timeout (non-triggered)
5252
5253 def _testWithTimeout(self):
5254 address = self.serv.getsockname()
5255 file = open(support.TESTFN, 'rb')
5256 with socket.create_connection(address, timeout=2) as sock, file as file:
5257 meth = self.meth_from_sock(sock)
5258 sent = meth(file)
5259 self.assertEqual(sent, self.FILESIZE)
5260
5261 def testWithTimeout(self):
5262 conn = self.accept_conn()
5263 data = self.recv_data(conn)
5264 self.assertEqual(len(data), self.FILESIZE)
5265 self.assertEqual(data, self.FILEDATA)
5266
5267 # timeout (triggered)
5268
5269 def _testWithTimeoutTriggeredSend(self):
5270 address = self.serv.getsockname()
5271 file = open(support.TESTFN, 'rb')
5272 with socket.create_connection(address, timeout=0.01) as sock, \
5273 file as file:
5274 meth = self.meth_from_sock(sock)
5275 self.assertRaises(socket.timeout, meth, file)
5276
5277 def testWithTimeoutTriggeredSend(self):
5278 conn = self.accept_conn()
5279 conn.recv(88192)
5280
5281 # errors
5282
5283 def _test_errors(self):
5284 pass
5285
5286 def test_errors(self):
5287 with open(support.TESTFN, 'rb') as file:
5288 with socket.socket(type=socket.SOCK_DGRAM) as s:
5289 meth = self.meth_from_sock(s)
5290 self.assertRaisesRegex(
5291 ValueError, "SOCK_STREAM", meth, file)
5292 with open(support.TESTFN, 'rt') as file:
5293 with socket.socket() as s:
5294 meth = self.meth_from_sock(s)
5295 self.assertRaisesRegex(
5296 ValueError, "binary mode", meth, file)
5297 with open(support.TESTFN, 'rb') as file:
5298 with socket.socket() as s:
5299 meth = self.meth_from_sock(s)
5300 self.assertRaisesRegex(TypeError, "positive integer",
5301 meth, file, count='2')
5302 self.assertRaisesRegex(TypeError, "positive integer",
5303 meth, file, count=0.1)
5304 self.assertRaisesRegex(ValueError, "positive integer",
5305 meth, file, count=0)
5306 self.assertRaisesRegex(ValueError, "positive integer",
5307 meth, file, count=-1)
5308
5309
5310@unittest.skipUnless(thread, 'Threading required for this test.')
5311@unittest.skipUnless(hasattr(os, "sendfile"),
5312 'os.sendfile() required for this test.')
5313class SendfileUsingSendfileTest(SendfileUsingSendTest):
5314 """
5315 Test the sendfile() implementation of socket.sendfile().
5316 """
5317 def meth_from_sock(self, sock):
5318 return getattr(sock, "_sendfile_use_sendfile")
5319
5320
Guido van Rossumb995eb72002-07-31 16:08:40 +00005321def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005322 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005323 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005324
5325 tests.extend([
5326 NonBlockingTCPTests,
5327 FileObjectClassTestCase,
5328 UnbufferedFileObjectClassTestCase,
5329 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005330 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005331 UnicodeReadFileObjectClassTestCase,
5332 UnicodeWriteFileObjectClassTestCase,
5333 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005334 NetworkConnectionNoServer,
5335 NetworkConnectionAttributesTest,
5336 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005337 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005338 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005339 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005340 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005341 tests.append(BasicSocketPairTest)
5342 tests.append(TestUnixDomain)
5343 tests.append(TestLinuxAbstractNamespace)
5344 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005345 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005346 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005347 tests.extend([
5348 CmsgMacroTests,
5349 SendmsgUDPTest,
5350 RecvmsgUDPTest,
5351 RecvmsgIntoUDPTest,
5352 SendmsgUDP6Test,
5353 RecvmsgUDP6Test,
5354 RecvmsgRFC3542AncillaryUDP6Test,
5355 RecvmsgIntoRFC3542AncillaryUDP6Test,
5356 RecvmsgIntoUDP6Test,
5357 SendmsgTCPTest,
5358 RecvmsgTCPTest,
5359 RecvmsgIntoTCPTest,
5360 SendmsgSCTPStreamTest,
5361 RecvmsgSCTPStreamTest,
5362 RecvmsgIntoSCTPStreamTest,
5363 SendmsgUnixStreamTest,
5364 RecvmsgUnixStreamTest,
5365 RecvmsgIntoUnixStreamTest,
5366 RecvmsgSCMRightsStreamTest,
5367 RecvmsgIntoSCMRightsStreamTest,
5368 # These are slow when setitimer() is not available
5369 InterruptedRecvTimeoutTest,
5370 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005371 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005372 SendfileUsingSendTest,
5373 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005374 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005375
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005376 thread_info = support.threading_setup()
5377 support.run_unittest(*tests)
5378 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005379
5380if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005381 test_main()