blob: 6e4e4fe4c353211c99158ffe4a1d5e94ad808594 [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
Michael Felt56614592018-12-26 04:34:37 +010015import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import array
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
Christian Heimesb6e43af2018-01-29 22:37:58 +010024import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020025import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020026import _thread as thread
27import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000028try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000029 import multiprocessing
30except ImportError:
31 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020032try:
33 import fcntl
34except ImportError:
35 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Benjamin Petersonee8712c2008-05-20 21:35:26 +000037HOST = support.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010038# test unicode string and carriage return
39MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Barry Warsawcf3d4b51997-01-03 20:03:32 +000040
caaveryeffc12f2017-09-06 18:18:10 -040041VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010042AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040043
Victor Stinner45df8202010-04-28 22:31:17 +000044try:
Victor Stinnere254e532014-07-26 14:36:55 +020045 import _socket
46except ImportError:
47 _socket = None
48
caaveryeffc12f2017-09-06 18:18:10 -040049def get_cid():
50 if fcntl is None:
51 return None
Pablo Galindo6eb96192020-04-01 01:48:37 +010052 if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
53 return None
caaveryeffc12f2017-09-06 18:18:10 -040054 try:
55 with open("/dev/vsock", "rb") as f:
56 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
57 except OSError:
58 return None
59 else:
60 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000061
Charles-François Natali47413c12011-10-06 19:47:44 +020062def _have_socket_can():
63 """Check whether CAN sockets are supported on this host."""
64 try:
65 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020066 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020067 return False
68 else:
69 s.close()
70 return True
71
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040072def _have_socket_can_isotp():
73 """Check whether CAN ISOTP sockets are supported on this host."""
74 try:
75 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
76 except (AttributeError, OSError):
77 return False
78 else:
79 s.close()
80 return True
81
Charles-François Natali10b8cf42011-11-10 19:21:37 +010082def _have_socket_rds():
83 """Check whether RDS sockets are supported on this host."""
84 try:
85 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
86 except (AttributeError, OSError):
87 return False
88 else:
89 s.close()
90 return True
91
Christian Heimes48371412016-09-06 00:37:46 +020092def _have_socket_alg():
93 """Check whether AF_ALG sockets are supported on this host."""
94 try:
95 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
96 except (AttributeError, OSError):
97 return False
98 else:
99 s.close()
100 return True
101
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700102def _have_socket_qipcrtr():
103 """Check whether AF_QIPCRTR sockets are supported on this host."""
104 try:
105 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
106 except (AttributeError, OSError):
107 return False
108 else:
109 s.close()
110 return True
111
caaveryeffc12f2017-09-06 18:18:10 -0400112def _have_socket_vsock():
113 """Check whether AF_VSOCK sockets are supported on this host."""
114 ret = get_cid() is not None
115 return ret
116
Yury Selivanovf11b4602018-01-28 17:27:38 -0500117
Greg Bowser8fbece12019-08-02 16:29:52 -0400118def _have_socket_bluetooth():
119 """Check whether AF_BLUETOOTH sockets are supported on this host."""
120 try:
121 # RFCOMM is supported by all platforms with bluetooth support. Windows
122 # does not support omitting the protocol.
123 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
124 except (AttributeError, OSError):
125 return False
126 else:
127 s.close()
128 return True
129
130
Victor Stinner304315d2018-11-30 13:22:44 +0100131@contextlib.contextmanager
132def socket_setdefaulttimeout(timeout):
133 old_timeout = socket.getdefaulttimeout()
134 try:
135 socket.setdefaulttimeout(timeout)
136 yield
137 finally:
138 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500139
140
Charles-François Natali47413c12011-10-06 19:47:44 +0200141HAVE_SOCKET_CAN = _have_socket_can()
142
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400143HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
144
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100145HAVE_SOCKET_RDS = _have_socket_rds()
146
Christian Heimes48371412016-09-06 00:37:46 +0200147HAVE_SOCKET_ALG = _have_socket_alg()
148
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700149HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
150
caaveryeffc12f2017-09-06 18:18:10 -0400151HAVE_SOCKET_VSOCK = _have_socket_vsock()
152
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700153HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
154
Greg Bowser8fbece12019-08-02 16:29:52 -0400155HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
156
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000157# Size in bytes of the int type
158SIZEOF_INT = array.array("i").itemsize
159
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000161
Guido van Rossum24e4af82002-06-12 19:18:08 +0000162 def setUp(self):
163 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000164 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100165 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000166
Guido van Rossum24e4af82002-06-12 19:18:08 +0000167 def tearDown(self):
168 self.serv.close()
169 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000170
Guido van Rossum24e4af82002-06-12 19:18:08 +0000171class SocketUDPTest(unittest.TestCase):
172
173 def setUp(self):
174 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000175 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000176
177 def tearDown(self):
178 self.serv.close()
179 self.serv = None
180
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700181class SocketUDPLITETest(SocketUDPTest):
182
183 def setUp(self):
184 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
185 self.port = support.bind_port(self.serv)
186
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000187class ThreadSafeCleanupTestCase(unittest.TestCase):
188 """Subclass of unittest.TestCase with thread-safe cleanup methods.
189
190 This subclass protects the addCleanup() and doCleanups() methods
191 with a recursive lock.
192 """
193
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200194 def __init__(self, *args, **kwargs):
195 super().__init__(*args, **kwargs)
196 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000197
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200198 def addCleanup(self, *args, **kwargs):
199 with self._cleanup_lock:
200 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000201
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200202 def doCleanups(self, *args, **kwargs):
203 with self._cleanup_lock:
204 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000205
Charles-François Natali47413c12011-10-06 19:47:44 +0200206class SocketCANTest(unittest.TestCase):
207
208 """To be able to run this test, a `vcan0` CAN interface can be created with
209 the following commands:
210 # modprobe vcan
211 # ip link add dev vcan0 type vcan
212 # ifconfig vcan0 up
213 """
214 interface = 'vcan0'
215 bufsize = 128
216
Charles-François Natali773e42d2013-02-05 19:42:01 +0100217 """The CAN frame structure is defined in <linux/can.h>:
218
219 struct can_frame {
220 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
221 __u8 can_dlc; /* data length code: 0 .. 8 */
222 __u8 data[8] __attribute__((aligned(8)));
223 };
224 """
225 can_frame_fmt = "=IB3x8s"
226 can_frame_size = struct.calcsize(can_frame_fmt)
227
228 """The Broadcast Management Command frame structure is defined
229 in <linux/can/bcm.h>:
230
231 struct bcm_msg_head {
232 __u32 opcode;
233 __u32 flags;
234 __u32 count;
235 struct timeval ival1, ival2;
236 canid_t can_id;
237 __u32 nframes;
238 struct can_frame frames[0];
239 }
240
241 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
242 `struct can_frame` definition). Must use native not standard types for packing.
243 """
244 bcm_cmd_msg_fmt = "@3I4l2I"
245 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
246
Charles-François Natali47413c12011-10-06 19:47:44 +0200247 def setUp(self):
248 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200249 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200250 try:
251 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200252 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200253 self.skipTest('network interface `%s` does not exist' %
254 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200255
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100256
257class SocketRDSTest(unittest.TestCase):
258
259 """To be able to run this test, the `rds` kernel module must be loaded:
260 # modprobe rds
261 """
262 bufsize = 8192
263
264 def setUp(self):
265 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
266 self.addCleanup(self.serv.close)
267 try:
268 self.port = support.bind_port(self.serv)
269 except OSError:
270 self.skipTest('unable to bind RDS socket')
271
272
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000274 """Threadable Test class
275
276 The ThreadableTest class makes it easy to create a threaded
277 client/server pair from an existing unit test. To create a
278 new threaded class from an existing unit test, use multiple
279 inheritance:
280
281 class NewClass (OldClass, ThreadableTest):
282 pass
283
284 This class defines two new fixture functions with obvious
285 purposes for overriding:
286
287 clientSetUp ()
288 clientTearDown ()
289
290 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000291 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000292 '_' to indicate the client portion of the test. Ex:
293
294 def testFoo(self):
295 # Server portion
296
297 def _testFoo(self):
298 # Client portion
299
300 Any exceptions raised by the clients during their tests
301 are caught and transferred to the main thread to alert
302 the testing framework.
303
304 Note, the server setup function cannot call any blocking
305 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000306 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000307 the blocking call (such as in setting up a client/server
308 connection and performing the accept() in setUp().
309 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000310
311 def __init__(self):
312 # Swap the true setup function
313 self.__setUp = self.setUp
314 self.__tearDown = self.tearDown
315 self.setUp = self._setUp
316 self.tearDown = self._tearDown
317
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000318 def serverExplicitReady(self):
319 """This method allows the server to explicitly indicate that
320 it wants the client thread to proceed. This is useful if the
321 server is about to execute a blocking routine that is
322 dependent upon the client thread during its setup routine."""
323 self.server_ready.set()
324
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700326 self.wait_threads = support.wait_threads_exit()
327 self.wait_threads.__enter__()
328
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000329 self.server_ready = threading.Event()
330 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000332 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200333 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000334
335 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000336 methodname = self.id()
337 i = methodname.rfind('.')
338 methodname = methodname[i+1:]
339 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000340 self.client_thread = thread.start_new_thread(
341 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000342
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200343 try:
344 self.__setUp()
345 except:
346 self.server_crashed = True
347 raise
348 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000349 self.server_ready.set()
350 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000351
352 def _tearDown(self):
353 self.__tearDown()
354 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700355 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000357 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000358 exc = self.queue.get()
359 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000360
361 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000362 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100363 try:
364 self.clientSetUp()
365 except BaseException as e:
366 self.queue.put(e)
367 self.clientTearDown()
368 return
369 finally:
370 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200371 if self.server_crashed:
372 self.clientTearDown()
373 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000374 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000375 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 try:
377 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000378 except BaseException as e:
379 self.queue.put(e)
380 finally:
381 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000382
383 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000384 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385
386 def clientTearDown(self):
387 self.done.set()
388 thread.exit()
389
390class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
391
392 def __init__(self, methodName='runTest'):
393 SocketTCPTest.__init__(self, methodName=methodName)
394 ThreadableTest.__init__(self)
395
396 def clientSetUp(self):
397 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
398
399 def clientTearDown(self):
400 self.cli.close()
401 self.cli = None
402 ThreadableTest.clientTearDown(self)
403
404class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
405
406 def __init__(self, methodName='runTest'):
407 SocketUDPTest.__init__(self, methodName=methodName)
408 ThreadableTest.__init__(self)
409
410 def clientSetUp(self):
411 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
412
Brian Curtin3beb38f2010-11-04 03:41:43 +0000413 def clientTearDown(self):
414 self.cli.close()
415 self.cli = None
416 ThreadableTest.clientTearDown(self)
417
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700418@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
419 'UDPLITE sockets required for this test.')
420class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
421
422 def __init__(self, methodName='runTest'):
423 SocketUDPLITETest.__init__(self, methodName=methodName)
424 ThreadableTest.__init__(self)
425
426 def clientSetUp(self):
427 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
428
429 def clientTearDown(self):
430 self.cli.close()
431 self.cli = None
432 ThreadableTest.clientTearDown(self)
433
Charles-François Natali47413c12011-10-06 19:47:44 +0200434class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
435
436 def __init__(self, methodName='runTest'):
437 SocketCANTest.__init__(self, methodName=methodName)
438 ThreadableTest.__init__(self)
439
440 def clientSetUp(self):
441 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
442 try:
443 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200444 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200445 # skipTest should not be called here, and will be called in the
446 # server instead
447 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200448
449 def clientTearDown(self):
450 self.cli.close()
451 self.cli = None
452 ThreadableTest.clientTearDown(self)
453
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100454class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
455
456 def __init__(self, methodName='runTest'):
457 SocketRDSTest.__init__(self, methodName=methodName)
458 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100459
460 def clientSetUp(self):
461 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
462 try:
463 # RDS sockets must be bound explicitly to send or receive data
464 self.cli.bind((HOST, 0))
465 self.cli_addr = self.cli.getsockname()
466 except OSError:
467 # skipTest should not be called here, and will be called in the
468 # server instead
469 pass
470
471 def clientTearDown(self):
472 self.cli.close()
473 self.cli = None
474 ThreadableTest.clientTearDown(self)
475
caaveryeffc12f2017-09-06 18:18:10 -0400476@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400477@unittest.skipUnless(HAVE_SOCKET_VSOCK,
478 'VSOCK sockets required for this test.')
479@unittest.skipUnless(get_cid() != 2,
480 "This test can only be run on a virtual guest.")
481class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
482
483 def __init__(self, methodName='runTest'):
484 unittest.TestCase.__init__(self, methodName=methodName)
485 ThreadableTest.__init__(self)
486
487 def setUp(self):
488 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
489 self.addCleanup(self.serv.close)
490 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
491 self.serv.listen()
492 self.serverExplicitReady()
493 self.conn, self.connaddr = self.serv.accept()
494 self.addCleanup(self.conn.close)
495
496 def clientSetUp(self):
497 time.sleep(0.1)
498 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
499 self.addCleanup(self.cli.close)
500 cid = get_cid()
501 self.cli.connect((cid, VSOCKPORT))
502
503 def testStream(self):
504 msg = self.conn.recv(1024)
505 self.assertEqual(msg, MSG)
506
507 def _testStream(self):
508 self.cli.send(MSG)
509 self.cli.close()
510
Guido van Rossum24e4af82002-06-12 19:18:08 +0000511class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000512 """Socket tests for client-server connection.
513
514 self.cli_conn is a client socket connected to the server. The
515 setUp() method guarantees that it is connected to the server.
516 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000517
518 def __init__(self, methodName='runTest'):
519 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
520
521 def setUp(self):
522 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000523 # Indicate explicitly we're ready for the client thread to
524 # proceed and then perform the blocking call to accept
525 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526 conn, addr = self.serv.accept()
527 self.cli_conn = conn
528
529 def tearDown(self):
530 self.cli_conn.close()
531 self.cli_conn = None
532 ThreadedTCPSocketTest.tearDown(self)
533
534 def clientSetUp(self):
535 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000536 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537 self.serv_conn = self.cli
538
539 def clientTearDown(self):
540 self.serv_conn.close()
541 self.serv_conn = None
542 ThreadedTCPSocketTest.clientTearDown(self)
543
Dave Cole331708b2004-08-09 04:51:41 +0000544class SocketPairTest(unittest.TestCase, ThreadableTest):
545
546 def __init__(self, methodName='runTest'):
547 unittest.TestCase.__init__(self, methodName=methodName)
548 ThreadableTest.__init__(self)
549
550 def setUp(self):
551 self.serv, self.cli = socket.socketpair()
552
553 def tearDown(self):
554 self.serv.close()
555 self.serv = None
556
557 def clientSetUp(self):
558 pass
559
560 def clientTearDown(self):
561 self.cli.close()
562 self.cli = None
563 ThreadableTest.clientTearDown(self)
564
Tim Peters494aaee2004-08-09 18:54:11 +0000565
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000566# The following classes are used by the sendmsg()/recvmsg() tests.
567# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
568# gives a drop-in replacement for SocketConnectedTest, but different
569# address families can be used, and the attributes serv_addr and
570# cli_addr will be set to the addresses of the endpoints.
571
572class SocketTestBase(unittest.TestCase):
573 """A base class for socket tests.
574
575 Subclasses must provide methods newSocket() to return a new socket
576 and bindSock(sock) to bind it to an unused address.
577
578 Creates a socket self.serv and sets self.serv_addr to its address.
579 """
580
581 def setUp(self):
582 self.serv = self.newSocket()
583 self.bindServer()
584
585 def bindServer(self):
586 """Bind server socket and set self.serv_addr to its address."""
587 self.bindSock(self.serv)
588 self.serv_addr = self.serv.getsockname()
589
590 def tearDown(self):
591 self.serv.close()
592 self.serv = None
593
594
595class SocketListeningTestMixin(SocketTestBase):
596 """Mixin to listen on the server socket."""
597
598 def setUp(self):
599 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100600 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000601
602
603class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
604 ThreadableTest):
605 """Mixin to add client socket and allow client/server tests.
606
607 Client socket is self.cli and its address is self.cli_addr. See
608 ThreadableTest for usage information.
609 """
610
611 def __init__(self, *args, **kwargs):
612 super().__init__(*args, **kwargs)
613 ThreadableTest.__init__(self)
614
615 def clientSetUp(self):
616 self.cli = self.newClientSocket()
617 self.bindClient()
618
619 def newClientSocket(self):
620 """Return a new socket for use as client."""
621 return self.newSocket()
622
623 def bindClient(self):
624 """Bind client socket and set self.cli_addr to its address."""
625 self.bindSock(self.cli)
626 self.cli_addr = self.cli.getsockname()
627
628 def clientTearDown(self):
629 self.cli.close()
630 self.cli = None
631 ThreadableTest.clientTearDown(self)
632
633
634class ConnectedStreamTestMixin(SocketListeningTestMixin,
635 ThreadedSocketTestMixin):
636 """Mixin to allow client/server stream tests with connected client.
637
638 Server's socket representing connection to client is self.cli_conn
639 and client's connection to server is self.serv_conn. (Based on
640 SocketConnectedTest.)
641 """
642
643 def setUp(self):
644 super().setUp()
645 # Indicate explicitly we're ready for the client thread to
646 # proceed and then perform the blocking call to accept
647 self.serverExplicitReady()
648 conn, addr = self.serv.accept()
649 self.cli_conn = conn
650
651 def tearDown(self):
652 self.cli_conn.close()
653 self.cli_conn = None
654 super().tearDown()
655
656 def clientSetUp(self):
657 super().clientSetUp()
658 self.cli.connect(self.serv_addr)
659 self.serv_conn = self.cli
660
661 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100662 try:
663 self.serv_conn.close()
664 self.serv_conn = None
665 except AttributeError:
666 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000667 super().clientTearDown()
668
669
670class UnixSocketTestBase(SocketTestBase):
671 """Base class for Unix-domain socket tests."""
672
673 # This class is used for file descriptor passing tests, so we
674 # create the sockets in a private directory so that other users
675 # can't send anything that might be problematic for a privileged
676 # user running the tests.
677
678 def setUp(self):
679 self.dir_path = tempfile.mkdtemp()
680 self.addCleanup(os.rmdir, self.dir_path)
681 super().setUp()
682
683 def bindSock(self, sock):
684 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100685 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000686 self.addCleanup(support.unlink, path)
687
688class UnixStreamBase(UnixSocketTestBase):
689 """Base class for Unix-domain SOCK_STREAM tests."""
690
691 def newSocket(self):
692 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
693
694
695class InetTestBase(SocketTestBase):
696 """Base class for IPv4 socket tests."""
697
698 host = HOST
699
700 def setUp(self):
701 super().setUp()
702 self.port = self.serv_addr[1]
703
704 def bindSock(self, sock):
705 support.bind_port(sock, host=self.host)
706
707class TCPTestBase(InetTestBase):
708 """Base class for TCP-over-IPv4 tests."""
709
710 def newSocket(self):
711 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
712
713class UDPTestBase(InetTestBase):
714 """Base class for UDP-over-IPv4 tests."""
715
716 def newSocket(self):
717 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
718
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700719class UDPLITETestBase(InetTestBase):
720 """Base class for UDPLITE-over-IPv4 tests."""
721
722 def newSocket(self):
723 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
724
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000725class SCTPStreamBase(InetTestBase):
726 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
727
728 def newSocket(self):
729 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
730 socket.IPPROTO_SCTP)
731
732
733class Inet6TestBase(InetTestBase):
734 """Base class for IPv6 socket tests."""
735
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200736 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000737
738class UDP6TestBase(Inet6TestBase):
739 """Base class for UDP-over-IPv6 tests."""
740
741 def newSocket(self):
742 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
743
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700744class UDPLITE6TestBase(Inet6TestBase):
745 """Base class for UDPLITE-over-IPv6 tests."""
746
747 def newSocket(self):
748 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
749
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000750
751# Test-skipping decorators for use with ThreadableTest.
752
753def skipWithClientIf(condition, reason):
754 """Skip decorated test if condition is true, add client_skip decorator.
755
756 If the decorated object is not a class, sets its attribute
757 "client_skip" to a decorator which will return an empty function
758 if the test is to be skipped, or the original function if it is
759 not. This can be used to avoid running the client part of a
760 skipped test when using ThreadableTest.
761 """
762 def client_pass(*args, **kwargs):
763 pass
764 def skipdec(obj):
765 retval = unittest.skip(reason)(obj)
766 if not isinstance(obj, type):
767 retval.client_skip = lambda f: client_pass
768 return retval
769 def noskipdec(obj):
770 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
771 obj.client_skip = lambda f: f
772 return obj
773 return skipdec if condition else noskipdec
774
775
776def requireAttrs(obj, *attributes):
777 """Skip decorated test if obj is missing any of the given attributes.
778
779 Sets client_skip attribute as skipWithClientIf() does.
780 """
781 missing = [name for name in attributes if not hasattr(obj, name)]
782 return skipWithClientIf(
783 missing, "don't have " + ", ".join(name for name in missing))
784
785
786def requireSocket(*args):
787 """Skip decorated test if a socket cannot be created with given arguments.
788
789 When an argument is given as a string, will use the value of that
790 attribute of the socket module, or skip the test if it doesn't
791 exist. Sets client_skip attribute as skipWithClientIf() does.
792 """
793 err = None
794 missing = [obj for obj in args if
795 isinstance(obj, str) and not hasattr(socket, obj)]
796 if missing:
797 err = "don't have " + ", ".join(name for name in missing)
798 else:
799 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
800 for obj in args]
801 try:
802 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200803 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000804 # XXX: check errno?
805 err = str(e)
806 else:
807 s.close()
808 return skipWithClientIf(
809 err is not None,
810 "can't create socket({0}): {1}".format(
811 ", ".join(str(o) for o in args), err))
812
813
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814#######################################################################
815## Begin Tests
816
817class GeneralModuleTests(unittest.TestCase):
818
Ethan Furman7184bac2014-10-14 18:56:53 -0700819 def test_SocketType_is_socketobject(self):
820 import _socket
821 self.assertTrue(socket.SocketType is _socket.socket)
822 s = socket.socket()
823 self.assertIsInstance(s, socket.SocketType)
824 s.close()
825
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000826 def test_repr(self):
827 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200828 with s:
829 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000830 self.assertIn('family=%s' % socket.AF_INET, repr(s))
831 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200832 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200833 self.assertNotIn('raddr', repr(s))
834 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200835 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200836 self.assertIn(str(s.getsockname()), repr(s))
837 self.assertIn('[closed]', repr(s))
838 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000839
Victor Stinnere254e532014-07-26 14:36:55 +0200840 @unittest.skipUnless(_socket is not None, 'need _socket module')
841 def test_csocket_repr(self):
842 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
843 try:
844 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
845 % (s.fileno(), s.family, s.type, s.proto))
846 self.assertEqual(repr(s), expected)
847 finally:
848 s.close()
849 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
850 % (s.family, s.type, s.proto))
851 self.assertEqual(repr(s), expected)
852
Raymond Hettinger027bb632004-05-31 03:09:25 +0000853 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200854 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
855 p = proxy(s)
856 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000857 s = None
858 try:
859 p.fileno()
860 except ReferenceError:
861 pass
862 else:
863 self.fail('Socket proxy still exists')
864
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000866 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300867 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200868 with self.assertRaises(OSError, msg=msg % 'OSError'):
869 raise OSError
870 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200872 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874
Ezio Melotti63e42302011-05-07 19:47:48 +0300875 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000876 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300877 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
878 self.addCleanup(s.close)
879 s.bind(('', 0))
880 sockname = s.getsockname()
881 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300882 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300883 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300884 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400885 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300886 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300887 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300888 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400889 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300890 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300891 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300892 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300893 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300894 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300895 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300896 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400897 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300898 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300899 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300900 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400901 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300902 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300903 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300904 self.assertIn('not NoneType', str(cm.exception))
905 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300906 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300907 self.assertIn('an integer is required', str(cm.exception))
908 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300909 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300910 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300911 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300912 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300913 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300914 self.assertIn('(1 given)', str(cm.exception))
915 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300916 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300917 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300918
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000920 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000921 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100922 if socket.has_ipv6:
923 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000924 socket.SOCK_STREAM
925 socket.SOCK_DGRAM
926 socket.SOCK_RAW
927 socket.SOCK_RDM
928 socket.SOCK_SEQPACKET
929 socket.SOL_SOCKET
930 socket.SO_REUSEADDR
931
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100932 def testCrucialIpProtoConstants(self):
933 socket.IPPROTO_TCP
934 socket.IPPROTO_UDP
935 if socket.has_ipv6:
936 socket.IPPROTO_IPV6
937
938 @unittest.skipUnless(os.name == "nt", "Windows specific")
939 def testWindowsSpecificConstants(self):
940 socket.IPPROTO_ICLFXBM
941 socket.IPPROTO_ST
942 socket.IPPROTO_CBT
943 socket.IPPROTO_IGP
944 socket.IPPROTO_RDP
945 socket.IPPROTO_PGM
946 socket.IPPROTO_L2TP
947 socket.IPPROTO_SCTP
948
Guido van Rossum654c11e2002-06-13 20:24:17 +0000949 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000950 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000951 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000952 try:
953 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200954 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000955 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600956 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000957 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000958 try:
959 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200960 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000961 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600962 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000963 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000964 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000965 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000966 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000967
Charles-François Natali0cc86852013-09-13 19:53:08 +0200968 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700969 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200970 self.assertEqual(socket.gethostbyname(addr), addr)
971
972 # we don't test support.HOSTv6 because there's a chance it doesn't have
973 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700974 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200975 self.assertIn(host, socket.gethostbyaddr(host)[2])
976
Xiang Zhangd36a7162017-03-07 11:06:09 +0800977 def test_host_resolution_bad_address(self):
978 # These are all malformed IP addresses and expected not to resolve to
979 # any result. But some ISPs, e.g. AWS, may successfully resolve these
980 # IPs.
981 explanation = (
982 "resolving an invalid IP address did not raise OSError; "
983 "can be caused by a broken DNS server"
984 )
985 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
986 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400987 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800988 socket.gethostbyname(addr)
989 with self.assertRaises(OSError, msg=explanation):
990 socket.gethostbyaddr(addr)
991
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000992 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
993 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
994 def test_sethostname(self):
995 oldhn = socket.gethostname()
996 try:
997 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200998 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000999 if e.errno == errno.EPERM:
1000 self.skipTest("test should be run as root")
1001 else:
1002 raise
1003 try:
1004 # running test as root!
1005 self.assertEqual(socket.gethostname(), 'new')
1006 # Should work with bytes objects too
1007 socket.sethostname(b'bar')
1008 self.assertEqual(socket.gethostname(), 'bar')
1009 finally:
1010 socket.sethostname(oldhn)
1011
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001012 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1013 'socket.if_nameindex() not available.')
1014 def testInterfaceNameIndex(self):
1015 interfaces = socket.if_nameindex()
1016 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001017 self.assertIsInstance(index, int)
1018 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001019 # interface indices are non-zero integers
1020 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001021 _index = socket.if_nametoindex(name)
1022 self.assertIsInstance(_index, int)
1023 self.assertEqual(index, _index)
1024 _name = socket.if_indextoname(index)
1025 self.assertIsInstance(_name, str)
1026 self.assertEqual(name, _name)
1027
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001028 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1029 'socket.if_indextoname() not available.')
1030 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001031 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001032 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001033
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001034 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1035 'socket.if_nametoindex() not available.')
1036 def testInvalidInterfaceNameToIndex(self):
1037 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1038 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1039
Serhiy Storchaka43767632013-11-03 21:31:38 +02001040 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1041 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001042 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001043 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001044 try:
1045 # On some versions, this loses a reference
1046 orig = sys.getrefcount(__name__)
1047 socket.getnameinfo(__name__,0)
1048 except TypeError:
1049 if sys.getrefcount(__name__) != orig:
1050 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001051
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001053 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001054 try:
1055 # On some versions, this crashes the interpreter.
1056 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001057 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001059
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001060 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001061 # This just checks that htons etc. are their own inverse,
1062 # when looking at the lower 16 or 32 bits.
1063 sizes = {socket.htonl: 32, socket.ntohl: 32,
1064 socket.htons: 16, socket.ntohs: 16}
1065 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001066 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001067 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1068 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001069
Guido van Rossuma2627af2002-09-14 00:58:46 +00001070 swapped = func(mask)
1071 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001072 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001073
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001074 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001075 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001076 import _testcapi
1077 s_good_values = [0, 1, 2, 0xffff]
1078 l_good_values = s_good_values + [0xffffffff]
1079 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1080 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1081 _testcapi.INT_MAX + 1]
1082 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1083 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001084 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001085 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001086 for k in l_good_values:
1087 socket.ntohl(k)
1088 socket.htonl(k)
1089 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001090 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001091 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001092 for k in l_bad_values:
1093 self.assertRaises(OverflowError, socket.ntohl, k)
1094 self.assertRaises(OverflowError, socket.htonl, k)
1095 for k in s_deprecated_values:
1096 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1097 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001098
Barry Warsaw11b91a02004-06-28 00:50:43 +00001099 def testGetServBy(self):
1100 eq = self.assertEqual
1101 # Find one service that exists, then check all the related interfaces.
1102 # I've ordered this by protocols that have both a tcp and udp
1103 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001104 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001105 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001106 # avoid the 'echo' service on this platform, as there is an
1107 # assumption breaking non-standard port/protocol entry
1108 services = ('daytime', 'qotd', 'domain')
1109 else:
1110 services = ('echo', 'daytime', 'domain')
1111 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001112 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001113 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001114 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001115 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001116 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001117 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001118 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001119 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001120 # Issue #26936: Android getservbyname() was broken before API 23.
1121 if (not hasattr(sys, 'getandroidapilevel') or
1122 sys.getandroidapilevel() >= 23):
1123 port2 = socket.getservbyname(service)
1124 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001125 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001126 try:
1127 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001128 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001129 udpport = None
1130 else:
1131 eq(udpport, port)
1132 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001133 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001134 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001135 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001136 eq(socket.getservbyport(port, 'tcp'), service)
1137 if udpport is not None:
1138 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001139 # Make sure getservbyport does not accept out of range ports.
1140 self.assertRaises(OverflowError, socket.getservbyport, -1)
1141 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001142
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001143 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001144 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001145 # The default timeout should initially be None
1146 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001147 with socket.socket() as s:
1148 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001149
1150 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001151 with socket_setdefaulttimeout(10):
1152 self.assertEqual(socket.getdefaulttimeout(), 10)
1153 with socket.socket() as sock:
1154 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001155
Victor Stinner304315d2018-11-30 13:22:44 +01001156 # Reset the default timeout to None, and see if it propagates
1157 socket.setdefaulttimeout(None)
1158 self.assertEqual(socket.getdefaulttimeout(), None)
1159 with socket.socket() as sock:
1160 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001161
1162 # Check that setting it to an invalid value raises ValueError
1163 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1164
1165 # Check that setting it to an invalid type raises TypeError
1166 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1167
Serhiy Storchaka43767632013-11-03 21:31:38 +02001168 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1169 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001170 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001171 # Test that issue1008086 and issue767150 are fixed.
1172 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001173 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1174 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001175
Serhiy Storchaka43767632013-11-03 21:31:38 +02001176 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1177 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001178 def testIPv4toString(self):
1179 from socket import inet_aton as f, inet_pton, AF_INET
1180 g = lambda a: inet_pton(AF_INET, a)
1181
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001182 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001183 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001184 )
1185
Ezio Melottib3aedd42010-11-20 19:04:17 +00001186 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1187 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1188 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1189 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1190 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001191 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001192 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001193 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001194 assertInvalid(f, '300.0.0.0')
1195 assertInvalid(f, 'a.0.0.0')
1196 assertInvalid(f, '1.2.3.4.5')
1197 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001198
Ezio Melottib3aedd42010-11-20 19:04:17 +00001199 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1200 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1201 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1202 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001203 assertInvalid(g, '0.0.0.')
1204 assertInvalid(g, '300.0.0.0')
1205 assertInvalid(g, 'a.0.0.0')
1206 assertInvalid(g, '1.2.3.4.5')
1207 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001208
Serhiy Storchaka43767632013-11-03 21:31:38 +02001209 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1210 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001211 def testIPv6toString(self):
1212 try:
1213 from socket import inet_pton, AF_INET6, has_ipv6
1214 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001215 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001216 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001217 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001218
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001219 if sys.platform == "win32":
1220 try:
1221 inet_pton(AF_INET6, '::')
1222 except OSError as e:
1223 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001224 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001225
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001226 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001227 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001228 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001229 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001230
Ezio Melottib3aedd42010-11-20 19:04:17 +00001231 self.assertEqual(b'\x00' * 16, f('::'))
1232 self.assertEqual(b'\x00' * 16, f('0::0'))
1233 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1234 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001235 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 +00001236 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1237 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001238 self.assertEqual(
1239 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1240 f('ad42:abc::127:0:254:2')
1241 )
1242 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1243 assertInvalid('0x20::')
1244 assertInvalid(':::')
1245 assertInvalid('::0::')
1246 assertInvalid('1::abc::')
1247 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001248 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001249 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001250 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001251 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001252 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001253 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001254
1255 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1256 f('::254.42.23.64')
1257 )
1258 self.assertEqual(
1259 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1260 f('42::a29b:254.42.23.64')
1261 )
1262 self.assertEqual(
1263 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1264 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1265 )
1266 assertInvalid('255.254.253.252')
1267 assertInvalid('1::260.2.3.0')
1268 assertInvalid('1::0.be.e.0')
1269 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1270 assertInvalid('::1.2.3.4:0')
1271 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001272
Serhiy Storchaka43767632013-11-03 21:31:38 +02001273 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1274 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001275 def testStringToIPv4(self):
1276 from socket import inet_ntoa as f, inet_ntop, AF_INET
1277 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001278 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001279 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001280 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001281
Ezio Melottib3aedd42010-11-20 19:04:17 +00001282 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1283 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1284 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1285 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001286 assertInvalid(f, b'\x00' * 3)
1287 assertInvalid(f, b'\x00' * 5)
1288 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001289 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001290
Ezio Melottib3aedd42010-11-20 19:04:17 +00001291 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1292 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1293 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001294 assertInvalid(g, b'\x00' * 3)
1295 assertInvalid(g, b'\x00' * 5)
1296 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001297 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001298
Serhiy Storchaka43767632013-11-03 21:31:38 +02001299 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1300 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001301 def testStringToIPv6(self):
1302 try:
1303 from socket import inet_ntop, AF_INET6, has_ipv6
1304 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001305 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001306 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001307 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001308
1309 if sys.platform == "win32":
1310 try:
1311 inet_ntop(AF_INET6, b'\x00' * 16)
1312 except OSError as e:
1313 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001314 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001315
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001316 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001317 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001318 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001319 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001320
Ezio Melottib3aedd42010-11-20 19:04:17 +00001321 self.assertEqual('::', f(b'\x00' * 16))
1322 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1323 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001324 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001325 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 +00001326 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001327 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001328
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001329 assertInvalid(b'\x12' * 15)
1330 assertInvalid(b'\x12' * 17)
1331 assertInvalid(b'\x12' * 4)
1332
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001333 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001334
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001335 def testSockName(self):
1336 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001337 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001338 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001339 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001340 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001341 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001342 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1343 # it reasonable to get the host's addr in addition to 0.0.0.0.
1344 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001345 try:
1346 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001347 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001348 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001349 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001350 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001351 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001352
1353 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001354 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001355 # We know a socket should start without reuse==0
1356 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001357 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001358 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001359 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001360
1361 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001362 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001363 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001364 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001365 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1366 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001367 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001368
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001369 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001370 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001371 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1372 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001373 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001374
Martin Panter50ab1a32016-04-11 00:38:12 +00001375 def testCloseException(self):
1376 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001377 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001378 socket.socket(fileno=sock.fileno()).close()
1379 try:
1380 sock.close()
1381 except OSError as err:
1382 # Winsock apparently raises ENOTSOCK
1383 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1384 else:
1385 self.fail("close() should raise EBADF/ENOTSOCK")
1386
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001387 def testNewAttributes(self):
1388 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001389
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001390 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1391 self.assertEqual(sock.family, socket.AF_INET)
1392 if hasattr(socket, 'SOCK_CLOEXEC'):
1393 self.assertIn(sock.type,
1394 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1395 socket.SOCK_STREAM))
1396 else:
1397 self.assertEqual(sock.type, socket.SOCK_STREAM)
1398 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001399
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001400 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001401 sock = socket.socket()
1402 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001403 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001404 big_port = port + 65536
1405 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001406 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1407 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1408 # Since find_unused_port() is inherently subject to race conditions, we
1409 # call it a couple times if necessary.
1410 for i in itertools.count():
1411 port = support.find_unused_port()
1412 try:
1413 sock.bind((HOST, port))
1414 except OSError as e:
1415 if e.errno != errno.EADDRINUSE or i == 5:
1416 raise
1417 else:
1418 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001419
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001420 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001421 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001422 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1423 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1424 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1425 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001426 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1427 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001428 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001429 self.assertRaises(ValueError, s.ioctl, -1, None)
1430 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001431
Steve Dowerea93ac02016-06-17 12:52:18 -07001432 @unittest.skipUnless(os.name == "nt", "Windows specific")
1433 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1434 'Loopback fast path support required for this test')
1435 def test_sio_loopback_fast_path(self):
1436 s = socket.socket()
1437 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001438 try:
1439 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1440 except OSError as exc:
1441 WSAEOPNOTSUPP = 10045
1442 if exc.winerror == WSAEOPNOTSUPP:
1443 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1444 "doesn't implemented in this Windows version")
1445 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001446 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1447
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001448 def testGetaddrinfo(self):
1449 try:
1450 socket.getaddrinfo('localhost', 80)
1451 except socket.gaierror as err:
1452 if err.errno == socket.EAI_SERVICE:
1453 # see http://bugs.python.org/issue1282647
1454 self.skipTest("buggy libc version")
1455 raise
1456 # len of every sequence is supposed to be == 5
1457 for info in socket.getaddrinfo(HOST, None):
1458 self.assertEqual(len(info), 5)
1459 # host can be a domain name, a string representation of an
1460 # IPv4/v6 address or None
1461 socket.getaddrinfo('localhost', 80)
1462 socket.getaddrinfo('127.0.0.1', 80)
1463 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001464 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001465 socket.getaddrinfo('::1', 80)
1466 # port can be a string service name such as "http", a numeric
1467 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001468 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1469 if (not hasattr(sys, 'getandroidapilevel') or
1470 sys.getandroidapilevel() >= 23):
1471 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001472 socket.getaddrinfo(HOST, 80)
1473 socket.getaddrinfo(HOST, None)
1474 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001475 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1476 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001477 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001478 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1479 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001480 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001481 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1482 for _, socktype, _, _, _ in infos:
1483 self.assertEqual(socktype, socket.SOCK_STREAM)
1484 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001485 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001486 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1487 # a server willing to support both IPv4 and IPv6 will
1488 # usually do this
1489 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1490 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001491 # test keyword arguments
1492 a = socket.getaddrinfo(HOST, None)
1493 b = socket.getaddrinfo(host=HOST, port=None)
1494 self.assertEqual(a, b)
1495 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1496 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1497 self.assertEqual(a, b)
1498 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1499 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1500 self.assertEqual(a, b)
1501 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1502 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1503 self.assertEqual(a, b)
1504 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1505 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1506 self.assertEqual(a, b)
1507 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1508 socket.AI_PASSIVE)
1509 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1510 type=socket.SOCK_STREAM, proto=0,
1511 flags=socket.AI_PASSIVE)
1512 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001513 # Issue #6697.
1514 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001515
Ned Deilyb24f4812014-02-13 22:50:42 -08001516 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001517 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001518 try:
1519 # The arguments here are undefined and the call may succeed
1520 # or fail. All we care here is that it doesn't segfault.
1521 socket.getaddrinfo("localhost", None, 0, 0, 0,
1522 socket.AI_NUMERICSERV)
1523 except socket.gaierror:
1524 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001525
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001526 def test_getnameinfo(self):
1527 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001528 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001529
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001530 @unittest.skipUnless(support.is_resource_enabled('network'),
1531 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001532 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001533 # Check for internet access before running test
1534 # (issue #12804, issue #25138).
1535 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001536 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001537
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001538 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001539 domain = 'испытание.pythontest.net'
1540 socket.gethostbyname(domain)
1541 socket.gethostbyname_ex(domain)
1542 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001543 # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001544 # have a reverse entry yet
1545 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001546
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001547 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001548 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001549 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1550 self.skipTest("signal.alarm and socket.socketpair required for this test")
1551 # Our signal handlers clobber the C errno by calling a math function
1552 # with an invalid domain value.
1553 def ok_handler(*args):
1554 self.assertRaises(ValueError, math.acosh, 0)
1555 def raising_handler(*args):
1556 self.assertRaises(ValueError, math.acosh, 0)
1557 1 // 0
1558 c, s = socket.socketpair()
1559 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1560 try:
1561 if with_timeout:
1562 # Just above the one second minimum for signal.alarm
1563 c.settimeout(1.5)
1564 with self.assertRaises(ZeroDivisionError):
1565 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001566 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001567 if with_timeout:
1568 signal.signal(signal.SIGALRM, ok_handler)
1569 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001570 self.assertRaises(socket.timeout, c.sendall,
1571 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001572 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001573 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001574 signal.signal(signal.SIGALRM, old_alarm)
1575 c.close()
1576 s.close()
1577
1578 def test_sendall_interrupted(self):
1579 self.check_sendall_interrupted(False)
1580
1581 def test_sendall_interrupted_with_timeout(self):
1582 self.check_sendall_interrupted(True)
1583
Antoine Pitroue033e062010-10-29 10:38:18 +00001584 def test_dealloc_warn(self):
1585 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1586 r = repr(sock)
1587 with self.assertWarns(ResourceWarning) as cm:
1588 sock = None
1589 support.gc_collect()
1590 self.assertIn(r, str(cm.warning.args[0]))
1591 # An open socket file object gets dereferenced after the socket
1592 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1593 f = sock.makefile('rb')
1594 r = repr(sock)
1595 sock = None
1596 support.gc_collect()
1597 with self.assertWarns(ResourceWarning):
1598 f = None
1599 support.gc_collect()
1600
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001601 def test_name_closed_socketio(self):
1602 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1603 fp = sock.makefile("rb")
1604 fp.close()
1605 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1606
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001607 def test_unusable_closed_socketio(self):
1608 with socket.socket() as sock:
1609 fp = sock.makefile("rb", buffering=0)
1610 self.assertTrue(fp.readable())
1611 self.assertFalse(fp.writable())
1612 self.assertFalse(fp.seekable())
1613 fp.close()
1614 self.assertRaises(ValueError, fp.readable)
1615 self.assertRaises(ValueError, fp.writable)
1616 self.assertRaises(ValueError, fp.seekable)
1617
Christian Heimesd0e31b92018-01-27 09:54:13 +01001618 def test_socket_close(self):
1619 sock = socket.socket()
1620 try:
1621 sock.bind((HOST, 0))
1622 socket.close(sock.fileno())
1623 with self.assertRaises(OSError):
1624 sock.listen(1)
1625 finally:
1626 with self.assertRaises(OSError):
1627 # sock.close() fails with EBADF
1628 sock.close()
1629 with self.assertRaises(TypeError):
1630 socket.close(None)
1631 with self.assertRaises(OSError):
1632 socket.close(-1)
1633
Berker Peksag3fe64d02016-02-18 17:34:00 +02001634 def test_makefile_mode(self):
1635 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1636 with self.subTest(mode=mode):
1637 with socket.socket() as sock:
1638 with sock.makefile(mode) as fp:
1639 self.assertEqual(fp.mode, mode)
1640
1641 def test_makefile_invalid_mode(self):
1642 for mode in 'rt', 'x', '+', 'a':
1643 with self.subTest(mode=mode):
1644 with socket.socket() as sock:
1645 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1646 sock.makefile(mode)
1647
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001648 def test_pickle(self):
1649 sock = socket.socket()
1650 with sock:
1651 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1652 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001653 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1654 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1655 self.assertEqual(family, socket.AF_INET)
1656 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1657 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001658
Serhiy Storchaka78980432013-01-15 01:12:17 +02001659 def test_listen_backlog(self):
1660 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001661 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1662 srv.bind((HOST, 0))
1663 srv.listen(backlog)
1664
1665 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001666 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001667 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001668
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001669 @support.cpython_only
1670 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001671 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001672 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001673 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1674 srv.bind((HOST, 0))
1675 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001676
Charles-François Natali42663332012-01-02 15:57:30 +01001677 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001678 def test_flowinfo(self):
1679 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001680 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001681 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001682 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001683
Коренберг Марк7766b962018-02-13 00:47:42 +05001684 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1685 def test_getaddrinfo_ipv6_basic(self):
1686 ((*_, sockaddr),) = socket.getaddrinfo(
1687 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1688 1234, socket.AF_INET6,
1689 socket.SOCK_DGRAM,
1690 socket.IPPROTO_UDP
1691 )
1692 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1693
1694 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001695 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001696 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001697 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1698 # Just pick up any network interface (Linux, Mac OS X)
1699 (ifindex, test_interface) = socket.if_nameindex()[0]
1700 ((*_, sockaddr),) = socket.getaddrinfo(
1701 'ff02::1de:c0:face:8D%' + test_interface,
1702 1234, socket.AF_INET6,
1703 socket.SOCK_DGRAM,
1704 socket.IPPROTO_UDP
1705 )
1706 # Note missing interface name part in IPv6 address
1707 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1708
1709 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1710 @unittest.skipUnless(
1711 sys.platform == 'win32',
1712 'Numeric scope id does not work or undocumented')
1713 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1714 # Also works on Linux and Mac OS X, but is not documented (?)
1715 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1716 ifindex = 42
1717 ((*_, sockaddr),) = socket.getaddrinfo(
1718 'ff02::1de:c0:face:8D%' + str(ifindex),
1719 1234, socket.AF_INET6,
1720 socket.SOCK_DGRAM,
1721 socket.IPPROTO_UDP
1722 )
1723 # Note missing interface name part in IPv6 address
1724 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1725
1726 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001727 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001728 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001729 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1730 # Just pick up any network interface.
1731 (ifindex, test_interface) = socket.if_nameindex()[0]
1732 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1733 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1734 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1735
1736 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001737 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001738 'Numeric scope id does not work or undocumented')
1739 def test_getnameinfo_ipv6_scopeid_numeric(self):
1740 # Also works on Linux (undocumented), but does not work on Mac OS X
1741 # Windows and Linux allow nonexistent interface numbers here.
1742 ifindex = 42
1743 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1744 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1745 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1746
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001747 def test_str_for_enums(self):
1748 # Make sure that the AF_* and SOCK_* constants have enum-like string
1749 # reprs.
1750 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1751 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001752 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001753
Yury Selivanov98181422017-12-18 20:02:54 -05001754 def test_socket_consistent_sock_type(self):
1755 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1756 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1757 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1758
1759 with socket.socket(socket.AF_INET, sock_type) as s:
1760 self.assertEqual(s.type, socket.SOCK_STREAM)
1761 s.settimeout(1)
1762 self.assertEqual(s.type, socket.SOCK_STREAM)
1763 s.settimeout(0)
1764 self.assertEqual(s.type, socket.SOCK_STREAM)
1765 s.setblocking(True)
1766 self.assertEqual(s.type, socket.SOCK_STREAM)
1767 s.setblocking(False)
1768 self.assertEqual(s.type, socket.SOCK_STREAM)
1769
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001770 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001771 # Test that when created with a family that's not one of the known
1772 # AF_*/SOCK_* constants, socket.family just returns the number.
1773 #
1774 # To do this we fool socket.socket into believing it already has an
1775 # open fd because on this path it doesn't actually verify the family and
1776 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001777 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1778 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001779 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1780
1781 unknown_type = max(
1782 kind
1783 for name, kind in socket.SocketKind.__members__.items()
1784 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1785 ) + 1
1786
1787 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001788 family=unknown_family, type=unknown_type, proto=23,
1789 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001790 self.assertEqual(s.family, unknown_family)
1791 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001792 # some OS like macOS ignore proto
1793 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001794
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001795 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1796 def test__sendfile_use_sendfile(self):
1797 class File:
1798 def __init__(self, fd):
1799 self.fd = fd
1800
1801 def fileno(self):
1802 return self.fd
1803 with socket.socket() as sock:
1804 fd = os.open(os.curdir, os.O_RDONLY)
1805 os.close(fd)
1806 with self.assertRaises(socket._GiveupOnSendfile):
1807 sock._sendfile_use_sendfile(File(fd))
1808 with self.assertRaises(OverflowError):
1809 sock._sendfile_use_sendfile(File(2**1000))
1810 with self.assertRaises(TypeError):
1811 sock._sendfile_use_sendfile(File(None))
1812
Christian Heimesb6e43af2018-01-29 22:37:58 +01001813 def _test_socket_fileno(self, s, family, stype):
1814 self.assertEqual(s.family, family)
1815 self.assertEqual(s.type, stype)
1816
1817 fd = s.fileno()
1818 s2 = socket.socket(fileno=fd)
1819 self.addCleanup(s2.close)
1820 # detach old fd to avoid double close
1821 s.detach()
1822 self.assertEqual(s2.family, family)
1823 self.assertEqual(s2.type, stype)
1824 self.assertEqual(s2.fileno(), fd)
1825
1826 def test_socket_fileno(self):
1827 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1828 self.addCleanup(s.close)
1829 s.bind((support.HOST, 0))
1830 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1831
1832 if hasattr(socket, "SOCK_DGRAM"):
1833 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1834 self.addCleanup(s.close)
1835 s.bind((support.HOST, 0))
1836 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1837
1838 if support.IPV6_ENABLED:
1839 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1840 self.addCleanup(s.close)
1841 s.bind((support.HOSTv6, 0, 0, 0))
1842 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1843
1844 if hasattr(socket, "AF_UNIX"):
1845 tmpdir = tempfile.mkdtemp()
1846 self.addCleanup(shutil.rmtree, tmpdir)
1847 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1848 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001849 try:
1850 s.bind(os.path.join(tmpdir, 'socket'))
1851 except PermissionError:
1852 pass
1853 else:
1854 self._test_socket_fileno(s, socket.AF_UNIX,
1855 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001856
Dima Tisneke9912702018-12-17 22:07:55 +09001857 def test_socket_fileno_rejects_float(self):
1858 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1859 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1860
1861 def test_socket_fileno_rejects_other_types(self):
1862 with self.assertRaisesRegex(TypeError, "integer is required"):
1863 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1864
1865 def test_socket_fileno_rejects_invalid_socket(self):
1866 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1867 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1868
1869 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1870 def test_socket_fileno_rejects_negative(self):
1871 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1872 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1873
1874 def test_socket_fileno_requires_valid_fd(self):
1875 WSAENOTSOCK = 10038
1876 with self.assertRaises(OSError) as cm:
1877 socket.socket(fileno=support.make_bad_fd())
1878 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1879
1880 with self.assertRaises(OSError) as cm:
1881 socket.socket(
1882 socket.AF_INET,
1883 socket.SOCK_STREAM,
1884 fileno=support.make_bad_fd())
1885 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1886
1887 def test_socket_fileno_requires_socket_fd(self):
1888 with tempfile.NamedTemporaryFile() as afile:
1889 with self.assertRaises(OSError):
1890 socket.socket(fileno=afile.fileno())
1891
1892 with self.assertRaises(OSError) as cm:
1893 socket.socket(
1894 socket.AF_INET,
1895 socket.SOCK_STREAM,
1896 fileno=afile.fileno())
1897 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1898
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001899
Charles-François Natali47413c12011-10-06 19:47:44 +02001900@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1901class BasicCANTest(unittest.TestCase):
1902
1903 def testCrucialConstants(self):
1904 socket.AF_CAN
1905 socket.PF_CAN
1906 socket.CAN_RAW
1907
Charles-François Natali773e42d2013-02-05 19:42:01 +01001908 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1909 'socket.CAN_BCM required for this test.')
1910 def testBCMConstants(self):
1911 socket.CAN_BCM
1912
1913 # opcodes
1914 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1915 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1916 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1917 socket.CAN_BCM_TX_SEND # send one CAN frame
1918 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1919 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1920 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1921 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1922 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1923 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1924 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1925 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1926
karl ding31c4fd22019-07-31 01:47:16 -07001927 # flags
1928 socket.CAN_BCM_SETTIMER
1929 socket.CAN_BCM_STARTTIMER
1930 socket.CAN_BCM_TX_COUNTEVT
1931 socket.CAN_BCM_TX_ANNOUNCE
1932 socket.CAN_BCM_TX_CP_CAN_ID
1933 socket.CAN_BCM_RX_FILTER_ID
1934 socket.CAN_BCM_RX_CHECK_DLC
1935 socket.CAN_BCM_RX_NO_AUTOTIMER
1936 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1937 socket.CAN_BCM_TX_RESET_MULTI_IDX
1938 socket.CAN_BCM_RX_RTR_FRAME
1939
Charles-François Natali47413c12011-10-06 19:47:44 +02001940 def testCreateSocket(self):
1941 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1942 pass
1943
Charles-François Natali773e42d2013-02-05 19:42:01 +01001944 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1945 'socket.CAN_BCM required for this test.')
1946 def testCreateBCMSocket(self):
1947 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1948 pass
1949
Charles-François Natali47413c12011-10-06 19:47:44 +02001950 def testBindAny(self):
1951 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001952 address = ('', )
1953 s.bind(address)
1954 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001955
1956 def testTooLongInterfaceName(self):
1957 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1958 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001959 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001960 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001961
1962 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1963 'socket.CAN_RAW_LOOPBACK required for this test.')
1964 def testLoopback(self):
1965 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1966 for loopback in (0, 1):
1967 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1968 loopback)
1969 self.assertEqual(loopback,
1970 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1971
1972 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1973 'socket.CAN_RAW_FILTER required for this test.')
1974 def testFilter(self):
1975 can_id, can_mask = 0x200, 0x700
1976 can_filter = struct.pack("=II", can_id, can_mask)
1977 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1978 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1979 self.assertEqual(can_filter,
1980 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001981 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001982
1983
1984@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001985class CANTest(ThreadedCANSocketTest):
1986
Charles-François Natali47413c12011-10-06 19:47:44 +02001987 def __init__(self, methodName='runTest'):
1988 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1989
1990 @classmethod
1991 def build_can_frame(cls, can_id, data):
1992 """Build a CAN frame."""
1993 can_dlc = len(data)
1994 data = data.ljust(8, b'\x00')
1995 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1996
1997 @classmethod
1998 def dissect_can_frame(cls, frame):
1999 """Dissect a CAN frame."""
2000 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2001 return (can_id, can_dlc, data[:can_dlc])
2002
2003 def testSendFrame(self):
2004 cf, addr = self.s.recvfrom(self.bufsize)
2005 self.assertEqual(self.cf, cf)
2006 self.assertEqual(addr[0], self.interface)
2007 self.assertEqual(addr[1], socket.AF_CAN)
2008
2009 def _testSendFrame(self):
2010 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2011 self.cli.send(self.cf)
2012
2013 def testSendMaxFrame(self):
2014 cf, addr = self.s.recvfrom(self.bufsize)
2015 self.assertEqual(self.cf, cf)
2016
2017 def _testSendMaxFrame(self):
2018 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2019 self.cli.send(self.cf)
2020
2021 def testSendMultiFrames(self):
2022 cf, addr = self.s.recvfrom(self.bufsize)
2023 self.assertEqual(self.cf1, cf)
2024
2025 cf, addr = self.s.recvfrom(self.bufsize)
2026 self.assertEqual(self.cf2, cf)
2027
2028 def _testSendMultiFrames(self):
2029 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2030 self.cli.send(self.cf1)
2031
2032 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2033 self.cli.send(self.cf2)
2034
Charles-François Natali773e42d2013-02-05 19:42:01 +01002035 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2036 'socket.CAN_BCM required for this test.')
2037 def _testBCM(self):
2038 cf, addr = self.cli.recvfrom(self.bufsize)
2039 self.assertEqual(self.cf, cf)
2040 can_id, can_dlc, data = self.dissect_can_frame(cf)
2041 self.assertEqual(self.can_id, can_id)
2042 self.assertEqual(self.data, data)
2043
2044 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2045 'socket.CAN_BCM required for this test.')
2046 def testBCM(self):
2047 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2048 self.addCleanup(bcm.close)
2049 bcm.connect((self.interface,))
2050 self.can_id = 0x123
2051 self.data = bytes([0xc0, 0xff, 0xee])
2052 self.cf = self.build_can_frame(self.can_id, self.data)
2053 opcode = socket.CAN_BCM_TX_SEND
2054 flags = 0
2055 count = 0
2056 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2057 bcm_can_id = 0x0222
2058 nframes = 1
2059 assert len(self.cf) == 16
2060 header = struct.pack(self.bcm_cmd_msg_fmt,
2061 opcode,
2062 flags,
2063 count,
2064 ival1_seconds,
2065 ival1_usec,
2066 ival2_seconds,
2067 ival2_usec,
2068 bcm_can_id,
2069 nframes,
2070 )
2071 header_plus_frame = header + self.cf
2072 bytes_sent = bcm.send(header_plus_frame)
2073 self.assertEqual(bytes_sent, len(header_plus_frame))
2074
Charles-François Natali47413c12011-10-06 19:47:44 +02002075
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002076@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2077class ISOTPTest(unittest.TestCase):
2078
2079 def __init__(self, *args, **kwargs):
2080 super().__init__(*args, **kwargs)
2081 self.interface = "vcan0"
2082
2083 def testCrucialConstants(self):
2084 socket.AF_CAN
2085 socket.PF_CAN
2086 socket.CAN_ISOTP
2087 socket.SOCK_DGRAM
2088
2089 def testCreateSocket(self):
2090 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2091 pass
2092
2093 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2094 'socket.CAN_ISOTP required for this test.')
2095 def testCreateISOTPSocket(self):
2096 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2097 pass
2098
2099 def testTooLongInterfaceName(self):
2100 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2101 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2102 with self.assertRaisesRegex(OSError, 'interface name too long'):
2103 s.bind(('x' * 1024, 1, 2))
2104
2105 def testBind(self):
2106 try:
2107 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2108 addr = self.interface, 0x123, 0x456
2109 s.bind(addr)
2110 self.assertEqual(s.getsockname(), addr)
2111 except OSError as e:
2112 if e.errno == errno.ENODEV:
2113 self.skipTest('network interface `%s` does not exist' %
2114 self.interface)
2115 else:
2116 raise
2117
2118
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002119@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2120class BasicRDSTest(unittest.TestCase):
2121
2122 def testCrucialConstants(self):
2123 socket.AF_RDS
2124 socket.PF_RDS
2125
2126 def testCreateSocket(self):
2127 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2128 pass
2129
2130 def testSocketBufferSize(self):
2131 bufsize = 16384
2132 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2133 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2134 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2135
2136
2137@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002138class RDSTest(ThreadedRDSSocketTest):
2139
2140 def __init__(self, methodName='runTest'):
2141 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2142
Charles-François Natali240c55f2011-11-10 20:33:36 +01002143 def setUp(self):
2144 super().setUp()
2145 self.evt = threading.Event()
2146
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002147 def testSendAndRecv(self):
2148 data, addr = self.serv.recvfrom(self.bufsize)
2149 self.assertEqual(self.data, data)
2150 self.assertEqual(self.cli_addr, addr)
2151
2152 def _testSendAndRecv(self):
2153 self.data = b'spam'
2154 self.cli.sendto(self.data, 0, (HOST, self.port))
2155
2156 def testPeek(self):
2157 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2158 self.assertEqual(self.data, data)
2159 data, addr = self.serv.recvfrom(self.bufsize)
2160 self.assertEqual(self.data, data)
2161
2162 def _testPeek(self):
2163 self.data = b'spam'
2164 self.cli.sendto(self.data, 0, (HOST, self.port))
2165
2166 @requireAttrs(socket.socket, 'recvmsg')
2167 def testSendAndRecvMsg(self):
2168 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2169 self.assertEqual(self.data, data)
2170
2171 @requireAttrs(socket.socket, 'sendmsg')
2172 def _testSendAndRecvMsg(self):
2173 self.data = b'hello ' * 10
2174 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2175
2176 def testSendAndRecvMulti(self):
2177 data, addr = self.serv.recvfrom(self.bufsize)
2178 self.assertEqual(self.data1, data)
2179
2180 data, addr = self.serv.recvfrom(self.bufsize)
2181 self.assertEqual(self.data2, data)
2182
2183 def _testSendAndRecvMulti(self):
2184 self.data1 = b'bacon'
2185 self.cli.sendto(self.data1, 0, (HOST, self.port))
2186
2187 self.data2 = b'egg'
2188 self.cli.sendto(self.data2, 0, (HOST, self.port))
2189
2190 def testSelect(self):
2191 r, w, x = select.select([self.serv], [], [], 3.0)
2192 self.assertIn(self.serv, r)
2193 data, addr = self.serv.recvfrom(self.bufsize)
2194 self.assertEqual(self.data, data)
2195
2196 def _testSelect(self):
2197 self.data = b'select'
2198 self.cli.sendto(self.data, 0, (HOST, self.port))
2199
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002200@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2201 'QIPCRTR sockets required for this test.')
2202class BasicQIPCRTRTest(unittest.TestCase):
2203
2204 def testCrucialConstants(self):
2205 socket.AF_QIPCRTR
2206
2207 def testCreateSocket(self):
2208 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2209 pass
2210
2211 def testUnbound(self):
2212 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2213 self.assertEqual(s.getsockname()[1], 0)
2214
2215 def testBindSock(self):
2216 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2217 support.bind_port(s, host=s.getsockname()[0])
2218 self.assertNotEqual(s.getsockname()[1], 0)
2219
2220 def testInvalidBindSock(self):
2221 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2222 self.assertRaises(OSError, support.bind_port, s, host=-2)
2223
2224 def testAutoBindSock(self):
2225 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2226 s.connect((123, 123))
2227 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002228
caaveryeffc12f2017-09-06 18:18:10 -04002229@unittest.skipIf(fcntl is None, "need fcntl")
2230@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2231 'VSOCK sockets required for this test.')
2232class BasicVSOCKTest(unittest.TestCase):
2233
2234 def testCrucialConstants(self):
2235 socket.AF_VSOCK
2236
2237 def testVSOCKConstants(self):
2238 socket.SO_VM_SOCKETS_BUFFER_SIZE
2239 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2240 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2241 socket.VMADDR_CID_ANY
2242 socket.VMADDR_PORT_ANY
2243 socket.VMADDR_CID_HOST
2244 socket.VM_SOCKETS_INVALID_VERSION
2245 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2246
2247 def testCreateSocket(self):
2248 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2249 pass
2250
2251 def testSocketBufferSize(self):
2252 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2253 orig_max = s.getsockopt(socket.AF_VSOCK,
2254 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2255 orig = s.getsockopt(socket.AF_VSOCK,
2256 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2257 orig_min = s.getsockopt(socket.AF_VSOCK,
2258 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2259
2260 s.setsockopt(socket.AF_VSOCK,
2261 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2262 s.setsockopt(socket.AF_VSOCK,
2263 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2264 s.setsockopt(socket.AF_VSOCK,
2265 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2266
2267 self.assertEqual(orig_max * 2,
2268 s.getsockopt(socket.AF_VSOCK,
2269 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2270 self.assertEqual(orig * 2,
2271 s.getsockopt(socket.AF_VSOCK,
2272 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2273 self.assertEqual(orig_min * 2,
2274 s.getsockopt(socket.AF_VSOCK,
2275 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2276
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002277
Greg Bowser8fbece12019-08-02 16:29:52 -04002278@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2279 'Bluetooth sockets required for this test.')
2280class BasicBluetoothTest(unittest.TestCase):
2281
2282 def testBluetoothConstants(self):
2283 socket.BDADDR_ANY
2284 socket.BDADDR_LOCAL
2285 socket.AF_BLUETOOTH
2286 socket.BTPROTO_RFCOMM
2287
2288 if sys.platform != "win32":
2289 socket.BTPROTO_HCI
2290 socket.SOL_HCI
2291 socket.BTPROTO_L2CAP
2292
2293 if not sys.platform.startswith("freebsd"):
2294 socket.BTPROTO_SCO
2295
2296 def testCreateRfcommSocket(self):
2297 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2298 pass
2299
2300 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2301 def testCreateL2capSocket(self):
2302 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2303 pass
2304
2305 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2306 def testCreateHciSocket(self):
2307 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2308 pass
2309
2310 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2311 "windows and freebsd do not support SCO sockets")
2312 def testCreateScoSocket(self):
2313 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2314 pass
2315
2316
Guido van Rossum24e4af82002-06-12 19:18:08 +00002317class BasicTCPTest(SocketConnectedTest):
2318
2319 def __init__(self, methodName='runTest'):
2320 SocketConnectedTest.__init__(self, methodName=methodName)
2321
2322 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002323 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002324 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002325 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002326
2327 def _testRecv(self):
2328 self.serv_conn.send(MSG)
2329
2330 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002331 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002332 seg1 = self.cli_conn.recv(len(MSG) - 3)
2333 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002334 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002335 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002336
2337 def _testOverFlowRecv(self):
2338 self.serv_conn.send(MSG)
2339
2340 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002341 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002342 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002343 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002344
2345 def _testRecvFrom(self):
2346 self.serv_conn.send(MSG)
2347
2348 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002349 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002350 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2351 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002352 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002353 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002354
2355 def _testOverFlowRecvFrom(self):
2356 self.serv_conn.send(MSG)
2357
2358 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002359 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002360 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002361 while 1:
2362 read = self.cli_conn.recv(1024)
2363 if not read:
2364 break
Guido van Rossume531e292002-08-08 20:28:34 +00002365 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002366 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002367
2368 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002369 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002370 self.serv_conn.sendall(big_chunk)
2371
2372 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002373 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002374 fd = self.cli_conn.fileno()
2375 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002376 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002377 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002378 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002379 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002380
2381 def _testFromFd(self):
2382 self.serv_conn.send(MSG)
2383
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002384 def testDup(self):
2385 # Testing dup()
2386 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002387 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002388 msg = sock.recv(1024)
2389 self.assertEqual(msg, MSG)
2390
2391 def _testDup(self):
2392 self.serv_conn.send(MSG)
2393
Guido van Rossum24e4af82002-06-12 19:18:08 +00002394 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002395 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002396 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002397 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002398 # wait for _testShutdown to finish: on OS X, when the server
2399 # closes the connection the client also becomes disconnected,
2400 # and the client's shutdown call will fail. (Issue #4397.)
2401 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002402
2403 def _testShutdown(self):
2404 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002405 self.serv_conn.shutdown(2)
2406
2407 testShutdown_overflow = support.cpython_only(testShutdown)
2408
2409 @support.cpython_only
2410 def _testShutdown_overflow(self):
2411 import _testcapi
2412 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002413 # Issue 15989
2414 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2415 _testcapi.INT_MAX + 1)
2416 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2417 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002418 self.serv_conn.shutdown(2)
2419
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002420 def testDetach(self):
2421 # Testing detach()
2422 fileno = self.cli_conn.fileno()
2423 f = self.cli_conn.detach()
2424 self.assertEqual(f, fileno)
2425 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002426 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002427 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002428 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002429 # ...but we can create another socket using the (still open)
2430 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002431 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002432 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002433 msg = sock.recv(1024)
2434 self.assertEqual(msg, MSG)
2435
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002436 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002437 self.serv_conn.send(MSG)
2438
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002439
Guido van Rossum24e4af82002-06-12 19:18:08 +00002440class BasicUDPTest(ThreadedUDPSocketTest):
2441
2442 def __init__(self, methodName='runTest'):
2443 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2444
2445 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002446 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002447 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002448 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002449
2450 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002451 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002452
Guido van Rossum1c938012002-06-12 21:17:20 +00002453 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002454 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002455 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002456 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002457
Guido van Rossum1c938012002-06-12 21:17:20 +00002458 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002459 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002460
Guido van Rossumd8faa362007-04-27 19:54:29 +00002461 def testRecvFromNegative(self):
2462 # Negative lengths passed to recvfrom should give ValueError.
2463 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2464
2465 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002466 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002467
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002468
2469@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2470 'UDPLITE sockets required for this test.')
2471class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2472
2473 def __init__(self, methodName='runTest'):
2474 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2475
2476 def testSendtoAndRecv(self):
2477 # Testing sendto() and Recv() over UDPLITE
2478 msg = self.serv.recv(len(MSG))
2479 self.assertEqual(msg, MSG)
2480
2481 def _testSendtoAndRecv(self):
2482 self.cli.sendto(MSG, 0, (HOST, self.port))
2483
2484 def testRecvFrom(self):
2485 # Testing recvfrom() over UDPLITE
2486 msg, addr = self.serv.recvfrom(len(MSG))
2487 self.assertEqual(msg, MSG)
2488
2489 def _testRecvFrom(self):
2490 self.cli.sendto(MSG, 0, (HOST, self.port))
2491
2492 def testRecvFromNegative(self):
2493 # Negative lengths passed to recvfrom should give ValueError.
2494 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2495
2496 def _testRecvFromNegative(self):
2497 self.cli.sendto(MSG, 0, (HOST, self.port))
2498
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002499# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2500# same test code is used with different families and types of socket
2501# (e.g. stream, datagram), and tests using recvmsg() are repeated
2502# using recvmsg_into().
2503#
2504# The generic test classes such as SendmsgTests and
2505# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2506# supplied with sockets cli_sock and serv_sock representing the
2507# client's and the server's end of the connection respectively, and
2508# attributes cli_addr and serv_addr holding their (numeric where
2509# appropriate) addresses.
2510#
2511# The final concrete test classes combine these with subclasses of
2512# SocketTestBase which set up client and server sockets of a specific
2513# type, and with subclasses of SendrecvmsgBase such as
2514# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2515# sockets to cli_sock and serv_sock and override the methods and
2516# attributes of SendrecvmsgBase to fill in destination addresses if
2517# needed when sending, check for specific flags in msg_flags, etc.
2518#
2519# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2520# recvmsg_into().
2521
2522# XXX: like the other datagram (UDP) tests in this module, the code
2523# here assumes that datagram delivery on the local machine will be
2524# reliable.
2525
2526class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2527 # Base class for sendmsg()/recvmsg() tests.
2528
2529 # Time in seconds to wait before considering a test failed, or
2530 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002531 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002532
2533 def setUp(self):
2534 self.misc_event = threading.Event()
2535 super().setUp()
2536
2537 def sendToServer(self, msg):
2538 # Send msg to the server.
2539 return self.cli_sock.send(msg)
2540
2541 # Tuple of alternative default arguments for sendmsg() when called
2542 # via sendmsgToServer() (e.g. to include a destination address).
2543 sendmsg_to_server_defaults = ()
2544
2545 def sendmsgToServer(self, *args):
2546 # Call sendmsg() on self.cli_sock with the given arguments,
2547 # filling in any arguments which are not supplied with the
2548 # corresponding items of self.sendmsg_to_server_defaults, if
2549 # any.
2550 return self.cli_sock.sendmsg(
2551 *(args + self.sendmsg_to_server_defaults[len(args):]))
2552
2553 def doRecvmsg(self, sock, bufsize, *args):
2554 # Call recvmsg() on sock with given arguments and return its
2555 # result. Should be used for tests which can use either
2556 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2557 # this method with one which emulates it using recvmsg_into(),
2558 # thus allowing the same test to be used for both methods.
2559 result = sock.recvmsg(bufsize, *args)
2560 self.registerRecvmsgResult(result)
2561 return result
2562
2563 def registerRecvmsgResult(self, result):
2564 # Called by doRecvmsg() with the return value of recvmsg() or
2565 # recvmsg_into(). Can be overridden to arrange cleanup based
2566 # on the returned ancillary data, for instance.
2567 pass
2568
2569 def checkRecvmsgAddress(self, addr1, addr2):
2570 # Called to compare the received address with the address of
2571 # the peer.
2572 self.assertEqual(addr1, addr2)
2573
2574 # Flags that are normally unset in msg_flags
2575 msg_flags_common_unset = 0
2576 for name in ("MSG_CTRUNC", "MSG_OOB"):
2577 msg_flags_common_unset |= getattr(socket, name, 0)
2578
2579 # Flags that are normally set
2580 msg_flags_common_set = 0
2581
2582 # Flags set when a complete record has been received (e.g. MSG_EOR
2583 # for SCTP)
2584 msg_flags_eor_indicator = 0
2585
2586 # Flags set when a complete record has not been received
2587 # (e.g. MSG_TRUNC for datagram sockets)
2588 msg_flags_non_eor_indicator = 0
2589
2590 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2591 # Method to check the value of msg_flags returned by recvmsg[_into]().
2592 #
2593 # Checks that all bits in msg_flags_common_set attribute are
2594 # set in "flags" and all bits in msg_flags_common_unset are
2595 # unset.
2596 #
2597 # The "eor" argument specifies whether the flags should
2598 # indicate that a full record (or datagram) has been received.
2599 # If "eor" is None, no checks are done; otherwise, checks
2600 # that:
2601 #
2602 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2603 # set and all bits in msg_flags_non_eor_indicator are unset
2604 #
2605 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2606 # are set and all bits in msg_flags_eor_indicator are unset
2607 #
2608 # If "checkset" and/or "checkunset" are supplied, they require
2609 # the given bits to be set or unset respectively, overriding
2610 # what the attributes require for those bits.
2611 #
2612 # If any bits are set in "ignore", they will not be checked,
2613 # regardless of the other inputs.
2614 #
2615 # Will raise Exception if the inputs require a bit to be both
2616 # set and unset, and it is not ignored.
2617
2618 defaultset = self.msg_flags_common_set
2619 defaultunset = self.msg_flags_common_unset
2620
2621 if eor:
2622 defaultset |= self.msg_flags_eor_indicator
2623 defaultunset |= self.msg_flags_non_eor_indicator
2624 elif eor is not None:
2625 defaultset |= self.msg_flags_non_eor_indicator
2626 defaultunset |= self.msg_flags_eor_indicator
2627
2628 # Function arguments override defaults
2629 defaultset &= ~checkunset
2630 defaultunset &= ~checkset
2631
2632 # Merge arguments with remaining defaults, and check for conflicts
2633 checkset |= defaultset
2634 checkunset |= defaultunset
2635 inboth = checkset & checkunset & ~ignore
2636 if inboth:
2637 raise Exception("contradictory set, unset requirements for flags "
2638 "{0:#x}".format(inboth))
2639
2640 # Compare with given msg_flags value
2641 mask = (checkset | checkunset) & ~ignore
2642 self.assertEqual(flags & mask, checkset & mask)
2643
2644
2645class RecvmsgIntoMixin(SendrecvmsgBase):
2646 # Mixin to implement doRecvmsg() using recvmsg_into().
2647
2648 def doRecvmsg(self, sock, bufsize, *args):
2649 buf = bytearray(bufsize)
2650 result = sock.recvmsg_into([buf], *args)
2651 self.registerRecvmsgResult(result)
2652 self.assertGreaterEqual(result[0], 0)
2653 self.assertLessEqual(result[0], bufsize)
2654 return (bytes(buf[:result[0]]),) + result[1:]
2655
2656
2657class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2658 # Defines flags to be checked in msg_flags for datagram sockets.
2659
2660 @property
2661 def msg_flags_non_eor_indicator(self):
2662 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2663
2664
2665class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2666 # Defines flags to be checked in msg_flags for SCTP sockets.
2667
2668 @property
2669 def msg_flags_eor_indicator(self):
2670 return super().msg_flags_eor_indicator | socket.MSG_EOR
2671
2672
2673class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2674 # Base class for tests on connectionless-mode sockets. Users must
2675 # supply sockets on attributes cli and serv to be mapped to
2676 # cli_sock and serv_sock respectively.
2677
2678 @property
2679 def serv_sock(self):
2680 return self.serv
2681
2682 @property
2683 def cli_sock(self):
2684 return self.cli
2685
2686 @property
2687 def sendmsg_to_server_defaults(self):
2688 return ([], [], 0, self.serv_addr)
2689
2690 def sendToServer(self, msg):
2691 return self.cli_sock.sendto(msg, self.serv_addr)
2692
2693
2694class SendrecvmsgConnectedBase(SendrecvmsgBase):
2695 # Base class for tests on connected sockets. Users must supply
2696 # sockets on attributes serv_conn and cli_conn (representing the
2697 # connections *to* the server and the client), to be mapped to
2698 # cli_sock and serv_sock respectively.
2699
2700 @property
2701 def serv_sock(self):
2702 return self.cli_conn
2703
2704 @property
2705 def cli_sock(self):
2706 return self.serv_conn
2707
2708 def checkRecvmsgAddress(self, addr1, addr2):
2709 # Address is currently "unspecified" for a connected socket,
2710 # so we don't examine it
2711 pass
2712
2713
2714class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2715 # Base class to set a timeout on server's socket.
2716
2717 def setUp(self):
2718 super().setUp()
2719 self.serv_sock.settimeout(self.fail_timeout)
2720
2721
2722class SendmsgTests(SendrecvmsgServerTimeoutBase):
2723 # Tests for sendmsg() which can use any socket type and do not
2724 # involve recvmsg() or recvmsg_into().
2725
2726 def testSendmsg(self):
2727 # Send a simple message with sendmsg().
2728 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2729
2730 def _testSendmsg(self):
2731 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2732
2733 def testSendmsgDataGenerator(self):
2734 # Send from buffer obtained from a generator (not a sequence).
2735 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2736
2737 def _testSendmsgDataGenerator(self):
2738 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2739 len(MSG))
2740
2741 def testSendmsgAncillaryGenerator(self):
2742 # Gather (empty) ancillary data from a generator.
2743 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2744
2745 def _testSendmsgAncillaryGenerator(self):
2746 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2747 len(MSG))
2748
2749 def testSendmsgArray(self):
2750 # Send data from an array instead of the usual bytes object.
2751 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2752
2753 def _testSendmsgArray(self):
2754 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2755 len(MSG))
2756
2757 def testSendmsgGather(self):
2758 # Send message data from more than one buffer (gather write).
2759 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2760
2761 def _testSendmsgGather(self):
2762 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2763
2764 def testSendmsgBadArgs(self):
2765 # Check that sendmsg() rejects invalid arguments.
2766 self.assertEqual(self.serv_sock.recv(1000), b"done")
2767
2768 def _testSendmsgBadArgs(self):
2769 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2770 self.assertRaises(TypeError, self.sendmsgToServer,
2771 b"not in an iterable")
2772 self.assertRaises(TypeError, self.sendmsgToServer,
2773 object())
2774 self.assertRaises(TypeError, self.sendmsgToServer,
2775 [object()])
2776 self.assertRaises(TypeError, self.sendmsgToServer,
2777 [MSG, object()])
2778 self.assertRaises(TypeError, self.sendmsgToServer,
2779 [MSG], object())
2780 self.assertRaises(TypeError, self.sendmsgToServer,
2781 [MSG], [], object())
2782 self.assertRaises(TypeError, self.sendmsgToServer,
2783 [MSG], [], 0, object())
2784 self.sendToServer(b"done")
2785
2786 def testSendmsgBadCmsg(self):
2787 # Check that invalid ancillary data items are rejected.
2788 self.assertEqual(self.serv_sock.recv(1000), b"done")
2789
2790 def _testSendmsgBadCmsg(self):
2791 self.assertRaises(TypeError, self.sendmsgToServer,
2792 [MSG], [object()])
2793 self.assertRaises(TypeError, self.sendmsgToServer,
2794 [MSG], [(object(), 0, b"data")])
2795 self.assertRaises(TypeError, self.sendmsgToServer,
2796 [MSG], [(0, object(), b"data")])
2797 self.assertRaises(TypeError, self.sendmsgToServer,
2798 [MSG], [(0, 0, object())])
2799 self.assertRaises(TypeError, self.sendmsgToServer,
2800 [MSG], [(0, 0)])
2801 self.assertRaises(TypeError, self.sendmsgToServer,
2802 [MSG], [(0, 0, b"data", 42)])
2803 self.sendToServer(b"done")
2804
2805 @requireAttrs(socket, "CMSG_SPACE")
2806 def testSendmsgBadMultiCmsg(self):
2807 # Check that invalid ancillary data items are rejected when
2808 # more than one item is present.
2809 self.assertEqual(self.serv_sock.recv(1000), b"done")
2810
2811 @testSendmsgBadMultiCmsg.client_skip
2812 def _testSendmsgBadMultiCmsg(self):
2813 self.assertRaises(TypeError, self.sendmsgToServer,
2814 [MSG], [0, 0, b""])
2815 self.assertRaises(TypeError, self.sendmsgToServer,
2816 [MSG], [(0, 0, b""), object()])
2817 self.sendToServer(b"done")
2818
2819 def testSendmsgExcessCmsgReject(self):
2820 # Check that sendmsg() rejects excess ancillary data items
2821 # when the number that can be sent is limited.
2822 self.assertEqual(self.serv_sock.recv(1000), b"done")
2823
2824 def _testSendmsgExcessCmsgReject(self):
2825 if not hasattr(socket, "CMSG_SPACE"):
2826 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002827 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002828 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2829 self.assertIsNone(cm.exception.errno)
2830 self.sendToServer(b"done")
2831
2832 def testSendmsgAfterClose(self):
2833 # Check that sendmsg() fails on a closed socket.
2834 pass
2835
2836 def _testSendmsgAfterClose(self):
2837 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002838 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002839
2840
2841class SendmsgStreamTests(SendmsgTests):
2842 # Tests for sendmsg() which require a stream socket and do not
2843 # involve recvmsg() or recvmsg_into().
2844
2845 def testSendmsgExplicitNoneAddr(self):
2846 # Check that peer address can be specified as None.
2847 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2848
2849 def _testSendmsgExplicitNoneAddr(self):
2850 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2851
2852 def testSendmsgTimeout(self):
2853 # Check that timeout works with sendmsg().
2854 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2855 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2856
2857 def _testSendmsgTimeout(self):
2858 try:
2859 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002860 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002861 while True:
2862 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002863 except socket.timeout:
2864 pass
2865 except OSError as exc:
2866 if exc.errno != errno.ENOMEM:
2867 raise
2868 # bpo-33937 the test randomly fails on Travis CI with
2869 # "OSError: [Errno 12] Cannot allocate memory"
2870 else:
2871 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002872 finally:
2873 self.misc_event.set()
2874
2875 # XXX: would be nice to have more tests for sendmsg flags argument.
2876
2877 # Linux supports MSG_DONTWAIT when sending, but in general, it
2878 # only works when receiving. Could add other platforms if they
2879 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002880 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002881 "MSG_DONTWAIT not known to work on this platform when "
2882 "sending")
2883 def testSendmsgDontWait(self):
2884 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2885 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2886 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2887
2888 @testSendmsgDontWait.client_skip
2889 def _testSendmsgDontWait(self):
2890 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002891 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002892 while True:
2893 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002894 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2895 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002897 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002898 finally:
2899 self.misc_event.set()
2900
2901
2902class SendmsgConnectionlessTests(SendmsgTests):
2903 # Tests for sendmsg() which require a connectionless-mode
2904 # (e.g. datagram) socket, and do not involve recvmsg() or
2905 # recvmsg_into().
2906
2907 def testSendmsgNoDestAddr(self):
2908 # Check that sendmsg() fails when no destination address is
2909 # given for unconnected socket.
2910 pass
2911
2912 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002913 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002914 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002915 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002916 [MSG], [], 0, None)
2917
2918
2919class RecvmsgGenericTests(SendrecvmsgBase):
2920 # Tests for recvmsg() which can also be emulated using
2921 # recvmsg_into(), and can use any socket type.
2922
2923 def testRecvmsg(self):
2924 # Receive a simple message with recvmsg[_into]().
2925 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2926 self.assertEqual(msg, MSG)
2927 self.checkRecvmsgAddress(addr, self.cli_addr)
2928 self.assertEqual(ancdata, [])
2929 self.checkFlags(flags, eor=True)
2930
2931 def _testRecvmsg(self):
2932 self.sendToServer(MSG)
2933
2934 def testRecvmsgExplicitDefaults(self):
2935 # Test recvmsg[_into]() with default arguments provided explicitly.
2936 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2937 len(MSG), 0, 0)
2938 self.assertEqual(msg, MSG)
2939 self.checkRecvmsgAddress(addr, self.cli_addr)
2940 self.assertEqual(ancdata, [])
2941 self.checkFlags(flags, eor=True)
2942
2943 def _testRecvmsgExplicitDefaults(self):
2944 self.sendToServer(MSG)
2945
2946 def testRecvmsgShorter(self):
2947 # Receive a message smaller than buffer.
2948 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2949 len(MSG) + 42)
2950 self.assertEqual(msg, MSG)
2951 self.checkRecvmsgAddress(addr, self.cli_addr)
2952 self.assertEqual(ancdata, [])
2953 self.checkFlags(flags, eor=True)
2954
2955 def _testRecvmsgShorter(self):
2956 self.sendToServer(MSG)
2957
2958 def testRecvmsgTrunc(self):
2959 # Receive part of message, check for truncation indicators.
2960 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2961 len(MSG) - 3)
2962 self.assertEqual(msg, MSG[:-3])
2963 self.checkRecvmsgAddress(addr, self.cli_addr)
2964 self.assertEqual(ancdata, [])
2965 self.checkFlags(flags, eor=False)
2966
2967 def _testRecvmsgTrunc(self):
2968 self.sendToServer(MSG)
2969
2970 def testRecvmsgShortAncillaryBuf(self):
2971 # Test ancillary data buffer too small to hold any ancillary data.
2972 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2973 len(MSG), 1)
2974 self.assertEqual(msg, MSG)
2975 self.checkRecvmsgAddress(addr, self.cli_addr)
2976 self.assertEqual(ancdata, [])
2977 self.checkFlags(flags, eor=True)
2978
2979 def _testRecvmsgShortAncillaryBuf(self):
2980 self.sendToServer(MSG)
2981
2982 def testRecvmsgLongAncillaryBuf(self):
2983 # Test large ancillary data buffer.
2984 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2985 len(MSG), 10240)
2986 self.assertEqual(msg, MSG)
2987 self.checkRecvmsgAddress(addr, self.cli_addr)
2988 self.assertEqual(ancdata, [])
2989 self.checkFlags(flags, eor=True)
2990
2991 def _testRecvmsgLongAncillaryBuf(self):
2992 self.sendToServer(MSG)
2993
2994 def testRecvmsgAfterClose(self):
2995 # Check that recvmsg[_into]() fails on a closed socket.
2996 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002997 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002998
2999 def _testRecvmsgAfterClose(self):
3000 pass
3001
3002 def testRecvmsgTimeout(self):
3003 # Check that timeout works.
3004 try:
3005 self.serv_sock.settimeout(0.03)
3006 self.assertRaises(socket.timeout,
3007 self.doRecvmsg, self.serv_sock, len(MSG))
3008 finally:
3009 self.misc_event.set()
3010
3011 def _testRecvmsgTimeout(self):
3012 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3013
3014 @requireAttrs(socket, "MSG_PEEK")
3015 def testRecvmsgPeek(self):
3016 # Check that MSG_PEEK in flags enables examination of pending
3017 # data without consuming it.
3018
3019 # Receive part of data with MSG_PEEK.
3020 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3021 len(MSG) - 3, 0,
3022 socket.MSG_PEEK)
3023 self.assertEqual(msg, MSG[:-3])
3024 self.checkRecvmsgAddress(addr, self.cli_addr)
3025 self.assertEqual(ancdata, [])
3026 # Ignoring MSG_TRUNC here (so this test is the same for stream
3027 # and datagram sockets). Some wording in POSIX seems to
3028 # suggest that it needn't be set when peeking, but that may
3029 # just be a slip.
3030 self.checkFlags(flags, eor=False,
3031 ignore=getattr(socket, "MSG_TRUNC", 0))
3032
3033 # Receive all data with MSG_PEEK.
3034 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3035 len(MSG), 0,
3036 socket.MSG_PEEK)
3037 self.assertEqual(msg, MSG)
3038 self.checkRecvmsgAddress(addr, self.cli_addr)
3039 self.assertEqual(ancdata, [])
3040 self.checkFlags(flags, eor=True)
3041
3042 # Check that the same data can still be received normally.
3043 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3044 self.assertEqual(msg, MSG)
3045 self.checkRecvmsgAddress(addr, self.cli_addr)
3046 self.assertEqual(ancdata, [])
3047 self.checkFlags(flags, eor=True)
3048
3049 @testRecvmsgPeek.client_skip
3050 def _testRecvmsgPeek(self):
3051 self.sendToServer(MSG)
3052
3053 @requireAttrs(socket.socket, "sendmsg")
3054 def testRecvmsgFromSendmsg(self):
3055 # Test receiving with recvmsg[_into]() when message is sent
3056 # using sendmsg().
3057 self.serv_sock.settimeout(self.fail_timeout)
3058 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3059 self.assertEqual(msg, MSG)
3060 self.checkRecvmsgAddress(addr, self.cli_addr)
3061 self.assertEqual(ancdata, [])
3062 self.checkFlags(flags, eor=True)
3063
3064 @testRecvmsgFromSendmsg.client_skip
3065 def _testRecvmsgFromSendmsg(self):
3066 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3067
3068
3069class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3070 # Tests which require a stream socket and can use either recvmsg()
3071 # or recvmsg_into().
3072
3073 def testRecvmsgEOF(self):
3074 # Receive end-of-stream indicator (b"", peer socket closed).
3075 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3076 self.assertEqual(msg, b"")
3077 self.checkRecvmsgAddress(addr, self.cli_addr)
3078 self.assertEqual(ancdata, [])
3079 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3080
3081 def _testRecvmsgEOF(self):
3082 self.cli_sock.close()
3083
3084 def testRecvmsgOverflow(self):
3085 # Receive a message in more than one chunk.
3086 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3087 len(MSG) - 3)
3088 self.checkRecvmsgAddress(addr, self.cli_addr)
3089 self.assertEqual(ancdata, [])
3090 self.checkFlags(flags, eor=False)
3091
3092 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3093 self.checkRecvmsgAddress(addr, self.cli_addr)
3094 self.assertEqual(ancdata, [])
3095 self.checkFlags(flags, eor=True)
3096
3097 msg = seg1 + seg2
3098 self.assertEqual(msg, MSG)
3099
3100 def _testRecvmsgOverflow(self):
3101 self.sendToServer(MSG)
3102
3103
3104class RecvmsgTests(RecvmsgGenericTests):
3105 # Tests for recvmsg() which can use any socket type.
3106
3107 def testRecvmsgBadArgs(self):
3108 # Check that recvmsg() rejects invalid arguments.
3109 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3110 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3111 -1, 0, 0)
3112 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3113 len(MSG), -1, 0)
3114 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3115 [bytearray(10)], 0, 0)
3116 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3117 object(), 0, 0)
3118 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3119 len(MSG), object(), 0)
3120 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3121 len(MSG), 0, object())
3122
3123 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3124 self.assertEqual(msg, MSG)
3125 self.checkRecvmsgAddress(addr, self.cli_addr)
3126 self.assertEqual(ancdata, [])
3127 self.checkFlags(flags, eor=True)
3128
3129 def _testRecvmsgBadArgs(self):
3130 self.sendToServer(MSG)
3131
3132
3133class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3134 # Tests for recvmsg_into() which can use any socket type.
3135
3136 def testRecvmsgIntoBadArgs(self):
3137 # Check that recvmsg_into() rejects invalid arguments.
3138 buf = bytearray(len(MSG))
3139 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3140 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3141 len(MSG), 0, 0)
3142 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3143 buf, 0, 0)
3144 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3145 [object()], 0, 0)
3146 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3147 [b"I'm not writable"], 0, 0)
3148 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3149 [buf, object()], 0, 0)
3150 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3151 [buf], -1, 0)
3152 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3153 [buf], object(), 0)
3154 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3155 [buf], 0, object())
3156
3157 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3158 self.assertEqual(nbytes, len(MSG))
3159 self.assertEqual(buf, bytearray(MSG))
3160 self.checkRecvmsgAddress(addr, self.cli_addr)
3161 self.assertEqual(ancdata, [])
3162 self.checkFlags(flags, eor=True)
3163
3164 def _testRecvmsgIntoBadArgs(self):
3165 self.sendToServer(MSG)
3166
3167 def testRecvmsgIntoGenerator(self):
3168 # Receive into buffer obtained from a generator (not a sequence).
3169 buf = bytearray(len(MSG))
3170 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3171 (o for o in [buf]))
3172 self.assertEqual(nbytes, len(MSG))
3173 self.assertEqual(buf, bytearray(MSG))
3174 self.checkRecvmsgAddress(addr, self.cli_addr)
3175 self.assertEqual(ancdata, [])
3176 self.checkFlags(flags, eor=True)
3177
3178 def _testRecvmsgIntoGenerator(self):
3179 self.sendToServer(MSG)
3180
3181 def testRecvmsgIntoArray(self):
3182 # Receive into an array rather than the usual bytearray.
3183 buf = array.array("B", [0] * len(MSG))
3184 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3185 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003186 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003187 self.checkRecvmsgAddress(addr, self.cli_addr)
3188 self.assertEqual(ancdata, [])
3189 self.checkFlags(flags, eor=True)
3190
3191 def _testRecvmsgIntoArray(self):
3192 self.sendToServer(MSG)
3193
3194 def testRecvmsgIntoScatter(self):
3195 # Receive into multiple buffers (scatter write).
3196 b1 = bytearray(b"----")
3197 b2 = bytearray(b"0123456789")
3198 b3 = bytearray(b"--------------")
3199 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3200 [b1, memoryview(b2)[2:9], b3])
3201 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3202 self.assertEqual(b1, bytearray(b"Mary"))
3203 self.assertEqual(b2, bytearray(b"01 had a 9"))
3204 self.assertEqual(b3, bytearray(b"little lamb---"))
3205 self.checkRecvmsgAddress(addr, self.cli_addr)
3206 self.assertEqual(ancdata, [])
3207 self.checkFlags(flags, eor=True)
3208
3209 def _testRecvmsgIntoScatter(self):
3210 self.sendToServer(b"Mary had a little lamb")
3211
3212
3213class CmsgMacroTests(unittest.TestCase):
3214 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3215 # assumptions used by sendmsg() and recvmsg[_into](), which share
3216 # code with these functions.
3217
3218 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003219 try:
3220 import _testcapi
3221 except ImportError:
3222 socklen_t_limit = 0x7fffffff
3223 else:
3224 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003225
3226 @requireAttrs(socket, "CMSG_LEN")
3227 def testCMSG_LEN(self):
3228 # Test CMSG_LEN() with various valid and invalid values,
3229 # checking the assumptions used by recvmsg() and sendmsg().
3230 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3231 values = list(range(257)) + list(range(toobig - 257, toobig))
3232
3233 # struct cmsghdr has at least three members, two of which are ints
3234 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3235 for n in values:
3236 ret = socket.CMSG_LEN(n)
3237 # This is how recvmsg() calculates the data size
3238 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3239 self.assertLessEqual(ret, self.socklen_t_limit)
3240
3241 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3242 # sendmsg() shares code with these functions, and requires
3243 # that it reject values over the limit.
3244 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3245 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3246
3247 @requireAttrs(socket, "CMSG_SPACE")
3248 def testCMSG_SPACE(self):
3249 # Test CMSG_SPACE() with various valid and invalid values,
3250 # checking the assumptions used by sendmsg().
3251 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3252 values = list(range(257)) + list(range(toobig - 257, toobig))
3253
3254 last = socket.CMSG_SPACE(0)
3255 # struct cmsghdr has at least three members, two of which are ints
3256 self.assertGreater(last, array.array("i").itemsize * 2)
3257 for n in values:
3258 ret = socket.CMSG_SPACE(n)
3259 self.assertGreaterEqual(ret, last)
3260 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3261 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3262 self.assertLessEqual(ret, self.socklen_t_limit)
3263 last = ret
3264
3265 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3266 # sendmsg() shares code with these functions, and requires
3267 # that it reject values over the limit.
3268 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3269 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3270
3271
3272class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3273 # Tests for file descriptor passing on Unix-domain sockets.
3274
3275 # Invalid file descriptor value that's unlikely to evaluate to a
3276 # real FD even if one of its bytes is replaced with a different
3277 # value (which shouldn't actually happen).
3278 badfd = -0x5555
3279
3280 def newFDs(self, n):
3281 # Return a list of n file descriptors for newly-created files
3282 # containing their list indices as ASCII numbers.
3283 fds = []
3284 for i in range(n):
3285 fd, path = tempfile.mkstemp()
3286 self.addCleanup(os.unlink, path)
3287 self.addCleanup(os.close, fd)
3288 os.write(fd, str(i).encode())
3289 fds.append(fd)
3290 return fds
3291
3292 def checkFDs(self, fds):
3293 # Check that the file descriptors in the given list contain
3294 # their correct list indices as ASCII numbers.
3295 for n, fd in enumerate(fds):
3296 os.lseek(fd, 0, os.SEEK_SET)
3297 self.assertEqual(os.read(fd, 1024), str(n).encode())
3298
3299 def registerRecvmsgResult(self, result):
3300 self.addCleanup(self.closeRecvmsgFDs, result)
3301
3302 def closeRecvmsgFDs(self, recvmsg_result):
3303 # Close all file descriptors specified in the ancillary data
3304 # of the given return value from recvmsg() or recvmsg_into().
3305 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3306 if (cmsg_level == socket.SOL_SOCKET and
3307 cmsg_type == socket.SCM_RIGHTS):
3308 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003309 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003310 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3311 for fd in fds:
3312 os.close(fd)
3313
3314 def createAndSendFDs(self, n):
3315 # Send n new file descriptors created by newFDs() to the
3316 # server, with the constant MSG as the non-ancillary data.
3317 self.assertEqual(
3318 self.sendmsgToServer([MSG],
3319 [(socket.SOL_SOCKET,
3320 socket.SCM_RIGHTS,
3321 array.array("i", self.newFDs(n)))]),
3322 len(MSG))
3323
3324 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3325 # Check that constant MSG was received with numfds file
3326 # descriptors in a maximum of maxcmsgs control messages (which
3327 # must contain only complete integers). By default, check
3328 # that MSG_CTRUNC is unset, but ignore any flags in
3329 # ignoreflags.
3330 msg, ancdata, flags, addr = result
3331 self.assertEqual(msg, MSG)
3332 self.checkRecvmsgAddress(addr, self.cli_addr)
3333 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3334 ignore=ignoreflags)
3335
3336 self.assertIsInstance(ancdata, list)
3337 self.assertLessEqual(len(ancdata), maxcmsgs)
3338 fds = array.array("i")
3339 for item in ancdata:
3340 self.assertIsInstance(item, tuple)
3341 cmsg_level, cmsg_type, cmsg_data = item
3342 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3343 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3344 self.assertIsInstance(cmsg_data, bytes)
3345 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003346 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003347
3348 self.assertEqual(len(fds), numfds)
3349 self.checkFDs(fds)
3350
3351 def testFDPassSimple(self):
3352 # Pass a single FD (array read from bytes object).
3353 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3354 len(MSG), 10240))
3355
3356 def _testFDPassSimple(self):
3357 self.assertEqual(
3358 self.sendmsgToServer(
3359 [MSG],
3360 [(socket.SOL_SOCKET,
3361 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003362 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003363 len(MSG))
3364
3365 def testMultipleFDPass(self):
3366 # Pass multiple FDs in a single array.
3367 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3368 len(MSG), 10240))
3369
3370 def _testMultipleFDPass(self):
3371 self.createAndSendFDs(4)
3372
3373 @requireAttrs(socket, "CMSG_SPACE")
3374 def testFDPassCMSG_SPACE(self):
3375 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3376 self.checkRecvmsgFDs(
3377 4, self.doRecvmsg(self.serv_sock, len(MSG),
3378 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3379
3380 @testFDPassCMSG_SPACE.client_skip
3381 def _testFDPassCMSG_SPACE(self):
3382 self.createAndSendFDs(4)
3383
3384 def testFDPassCMSG_LEN(self):
3385 # Test using CMSG_LEN() to calculate ancillary buffer size.
3386 self.checkRecvmsgFDs(1,
3387 self.doRecvmsg(self.serv_sock, len(MSG),
3388 socket.CMSG_LEN(4 * SIZEOF_INT)),
3389 # RFC 3542 says implementations may set
3390 # MSG_CTRUNC if there isn't enough space
3391 # for trailing padding.
3392 ignoreflags=socket.MSG_CTRUNC)
3393
3394 def _testFDPassCMSG_LEN(self):
3395 self.createAndSendFDs(1)
3396
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003397 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003398 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003399 @requireAttrs(socket, "CMSG_SPACE")
3400 def testFDPassSeparate(self):
3401 # Pass two FDs in two separate arrays. Arrays may be combined
3402 # into a single control message by the OS.
3403 self.checkRecvmsgFDs(2,
3404 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3405 maxcmsgs=2)
3406
3407 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003408 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003409 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003410 def _testFDPassSeparate(self):
3411 fd0, fd1 = self.newFDs(2)
3412 self.assertEqual(
3413 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3414 socket.SCM_RIGHTS,
3415 array.array("i", [fd0])),
3416 (socket.SOL_SOCKET,
3417 socket.SCM_RIGHTS,
3418 array.array("i", [fd1]))]),
3419 len(MSG))
3420
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003421 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003422 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003423 @requireAttrs(socket, "CMSG_SPACE")
3424 def testFDPassSeparateMinSpace(self):
3425 # Pass two FDs in two separate arrays, receiving them into the
3426 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003427 num_fds = 2
3428 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003429 self.doRecvmsg(self.serv_sock, len(MSG),
3430 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003431 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003432 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3433
3434 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003435 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003436 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003437 def _testFDPassSeparateMinSpace(self):
3438 fd0, fd1 = self.newFDs(2)
3439 self.assertEqual(
3440 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3441 socket.SCM_RIGHTS,
3442 array.array("i", [fd0])),
3443 (socket.SOL_SOCKET,
3444 socket.SCM_RIGHTS,
3445 array.array("i", [fd1]))]),
3446 len(MSG))
3447
3448 def sendAncillaryIfPossible(self, msg, ancdata):
3449 # Try to send msg and ancdata to server, but if the system
3450 # call fails, just send msg with no ancillary data.
3451 try:
3452 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003453 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003454 # Check that it was the system call that failed
3455 self.assertIsInstance(e.errno, int)
3456 nbytes = self.sendmsgToServer([msg])
3457 self.assertEqual(nbytes, len(msg))
3458
Brett Cannon3bbad122015-12-28 17:21:44 -08003459 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003460 def testFDPassEmpty(self):
3461 # Try to pass an empty FD array. Can receive either no array
3462 # or an empty array.
3463 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3464 len(MSG), 10240),
3465 ignoreflags=socket.MSG_CTRUNC)
3466
3467 def _testFDPassEmpty(self):
3468 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3469 socket.SCM_RIGHTS,
3470 b"")])
3471
3472 def testFDPassPartialInt(self):
3473 # Try to pass a truncated FD array.
3474 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3475 len(MSG), 10240)
3476 self.assertEqual(msg, MSG)
3477 self.checkRecvmsgAddress(addr, self.cli_addr)
3478 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3479 self.assertLessEqual(len(ancdata), 1)
3480 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3481 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3482 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3483 self.assertLess(len(cmsg_data), SIZEOF_INT)
3484
3485 def _testFDPassPartialInt(self):
3486 self.sendAncillaryIfPossible(
3487 MSG,
3488 [(socket.SOL_SOCKET,
3489 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003490 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003491
3492 @requireAttrs(socket, "CMSG_SPACE")
3493 def testFDPassPartialIntInMiddle(self):
3494 # Try to pass two FD arrays, the first of which is truncated.
3495 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3496 len(MSG), 10240)
3497 self.assertEqual(msg, MSG)
3498 self.checkRecvmsgAddress(addr, self.cli_addr)
3499 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3500 self.assertLessEqual(len(ancdata), 2)
3501 fds = array.array("i")
3502 # Arrays may have been combined in a single control message
3503 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3504 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3505 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003506 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003507 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3508 self.assertLessEqual(len(fds), 2)
3509 self.checkFDs(fds)
3510
3511 @testFDPassPartialIntInMiddle.client_skip
3512 def _testFDPassPartialIntInMiddle(self):
3513 fd0, fd1 = self.newFDs(2)
3514 self.sendAncillaryIfPossible(
3515 MSG,
3516 [(socket.SOL_SOCKET,
3517 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003518 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003519 (socket.SOL_SOCKET,
3520 socket.SCM_RIGHTS,
3521 array.array("i", [fd1]))])
3522
3523 def checkTruncatedHeader(self, result, ignoreflags=0):
3524 # Check that no ancillary data items are returned when data is
3525 # truncated inside the cmsghdr structure.
3526 msg, ancdata, flags, addr = result
3527 self.assertEqual(msg, MSG)
3528 self.checkRecvmsgAddress(addr, self.cli_addr)
3529 self.assertEqual(ancdata, [])
3530 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3531 ignore=ignoreflags)
3532
3533 def testCmsgTruncNoBufSize(self):
3534 # Check that no ancillary data is received when no buffer size
3535 # is specified.
3536 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3537 # BSD seems to set MSG_CTRUNC only
3538 # if an item has been partially
3539 # received.
3540 ignoreflags=socket.MSG_CTRUNC)
3541
3542 def _testCmsgTruncNoBufSize(self):
3543 self.createAndSendFDs(1)
3544
3545 def testCmsgTrunc0(self):
3546 # Check that no ancillary data is received when buffer size is 0.
3547 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3548 ignoreflags=socket.MSG_CTRUNC)
3549
3550 def _testCmsgTrunc0(self):
3551 self.createAndSendFDs(1)
3552
3553 # Check that no ancillary data is returned for various non-zero
3554 # (but still too small) buffer sizes.
3555
3556 def testCmsgTrunc1(self):
3557 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3558
3559 def _testCmsgTrunc1(self):
3560 self.createAndSendFDs(1)
3561
3562 def testCmsgTrunc2Int(self):
3563 # The cmsghdr structure has at least three members, two of
3564 # which are ints, so we still shouldn't see any ancillary
3565 # data.
3566 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3567 SIZEOF_INT * 2))
3568
3569 def _testCmsgTrunc2Int(self):
3570 self.createAndSendFDs(1)
3571
3572 def testCmsgTruncLen0Minus1(self):
3573 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3574 socket.CMSG_LEN(0) - 1))
3575
3576 def _testCmsgTruncLen0Minus1(self):
3577 self.createAndSendFDs(1)
3578
3579 # The following tests try to truncate the control message in the
3580 # middle of the FD array.
3581
3582 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3583 # Check that file descriptor data is truncated to between
3584 # mindata and maxdata bytes when received with buffer size
3585 # ancbuf, and that any complete file descriptor numbers are
3586 # valid.
3587 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3588 len(MSG), ancbuf)
3589 self.assertEqual(msg, MSG)
3590 self.checkRecvmsgAddress(addr, self.cli_addr)
3591 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3592
3593 if mindata == 0 and ancdata == []:
3594 return
3595 self.assertEqual(len(ancdata), 1)
3596 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3597 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3598 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3599 self.assertGreaterEqual(len(cmsg_data), mindata)
3600 self.assertLessEqual(len(cmsg_data), maxdata)
3601 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003602 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003603 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3604 self.checkFDs(fds)
3605
3606 def testCmsgTruncLen0(self):
3607 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3608
3609 def _testCmsgTruncLen0(self):
3610 self.createAndSendFDs(1)
3611
3612 def testCmsgTruncLen0Plus1(self):
3613 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3614
3615 def _testCmsgTruncLen0Plus1(self):
3616 self.createAndSendFDs(2)
3617
3618 def testCmsgTruncLen1(self):
3619 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3620 maxdata=SIZEOF_INT)
3621
3622 def _testCmsgTruncLen1(self):
3623 self.createAndSendFDs(2)
3624
3625 def testCmsgTruncLen2Minus1(self):
3626 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3627 maxdata=(2 * SIZEOF_INT) - 1)
3628
3629 def _testCmsgTruncLen2Minus1(self):
3630 self.createAndSendFDs(2)
3631
3632
3633class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3634 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3635 # features of the RFC 3542 Advanced Sockets API for IPv6.
3636 # Currently we can only handle certain data items (e.g. traffic
3637 # class, hop limit, MTU discovery and fragmentation settings)
3638 # without resorting to unportable means such as the struct module,
3639 # but the tests here are aimed at testing the ancillary data
3640 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3641 # itself.
3642
3643 # Test value to use when setting hop limit of packet
3644 hop_limit = 2
3645
3646 # Test value to use when setting traffic class of packet.
3647 # -1 means "use kernel default".
3648 traffic_class = -1
3649
3650 def ancillaryMapping(self, ancdata):
3651 # Given ancillary data list ancdata, return a mapping from
3652 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3653 # Check that no (level, type) pair appears more than once.
3654 d = {}
3655 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3656 self.assertNotIn((cmsg_level, cmsg_type), d)
3657 d[(cmsg_level, cmsg_type)] = cmsg_data
3658 return d
3659
3660 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3661 # Receive hop limit into ancbufsize bytes of ancillary data
3662 # space. Check that data is MSG, ancillary data is not
3663 # truncated (but ignore any flags in ignoreflags), and hop
3664 # limit is between 0 and maxhop inclusive.
3665 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3666 socket.IPV6_RECVHOPLIMIT, 1)
3667 self.misc_event.set()
3668 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3669 len(MSG), ancbufsize)
3670
3671 self.assertEqual(msg, MSG)
3672 self.checkRecvmsgAddress(addr, self.cli_addr)
3673 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3674 ignore=ignoreflags)
3675
3676 self.assertEqual(len(ancdata), 1)
3677 self.assertIsInstance(ancdata[0], tuple)
3678 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3679 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3680 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3681 self.assertIsInstance(cmsg_data, bytes)
3682 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3683 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003684 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003685 self.assertGreaterEqual(a[0], 0)
3686 self.assertLessEqual(a[0], maxhop)
3687
3688 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3689 def testRecvHopLimit(self):
3690 # Test receiving the packet hop limit as ancillary data.
3691 self.checkHopLimit(ancbufsize=10240)
3692
3693 @testRecvHopLimit.client_skip
3694 def _testRecvHopLimit(self):
3695 # Need to wait until server has asked to receive ancillary
3696 # data, as implementations are not required to buffer it
3697 # otherwise.
3698 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3699 self.sendToServer(MSG)
3700
3701 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3702 def testRecvHopLimitCMSG_SPACE(self):
3703 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3704 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3705
3706 @testRecvHopLimitCMSG_SPACE.client_skip
3707 def _testRecvHopLimitCMSG_SPACE(self):
3708 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3709 self.sendToServer(MSG)
3710
3711 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3712 # 3542 says portable applications must provide space for trailing
3713 # padding. Implementations may set MSG_CTRUNC if there isn't
3714 # enough space for the padding.
3715
3716 @requireAttrs(socket.socket, "sendmsg")
3717 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3718 def testSetHopLimit(self):
3719 # Test setting hop limit on outgoing packet and receiving it
3720 # at the other end.
3721 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3722
3723 @testSetHopLimit.client_skip
3724 def _testSetHopLimit(self):
3725 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3726 self.assertEqual(
3727 self.sendmsgToServer([MSG],
3728 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3729 array.array("i", [self.hop_limit]))]),
3730 len(MSG))
3731
3732 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3733 ignoreflags=0):
3734 # Receive traffic class and hop limit into ancbufsize bytes of
3735 # ancillary data space. Check that data is MSG, ancillary
3736 # data is not truncated (but ignore any flags in ignoreflags),
3737 # and traffic class and hop limit are in range (hop limit no
3738 # more than maxhop).
3739 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3740 socket.IPV6_RECVHOPLIMIT, 1)
3741 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3742 socket.IPV6_RECVTCLASS, 1)
3743 self.misc_event.set()
3744 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3745 len(MSG), ancbufsize)
3746
3747 self.assertEqual(msg, MSG)
3748 self.checkRecvmsgAddress(addr, self.cli_addr)
3749 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3750 ignore=ignoreflags)
3751 self.assertEqual(len(ancdata), 2)
3752 ancmap = self.ancillaryMapping(ancdata)
3753
3754 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3755 self.assertEqual(len(tcdata), SIZEOF_INT)
3756 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003757 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003758 self.assertGreaterEqual(a[0], 0)
3759 self.assertLessEqual(a[0], 255)
3760
3761 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3762 self.assertEqual(len(hldata), SIZEOF_INT)
3763 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003764 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003765 self.assertGreaterEqual(a[0], 0)
3766 self.assertLessEqual(a[0], maxhop)
3767
3768 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3769 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3770 def testRecvTrafficClassAndHopLimit(self):
3771 # Test receiving traffic class and hop limit as ancillary data.
3772 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3773
3774 @testRecvTrafficClassAndHopLimit.client_skip
3775 def _testRecvTrafficClassAndHopLimit(self):
3776 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3777 self.sendToServer(MSG)
3778
3779 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3780 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3781 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3782 # Test receiving traffic class and hop limit, using
3783 # CMSG_SPACE() to calculate buffer size.
3784 self.checkTrafficClassAndHopLimit(
3785 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3786
3787 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3788 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3789 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3790 self.sendToServer(MSG)
3791
3792 @requireAttrs(socket.socket, "sendmsg")
3793 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3794 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3795 def testSetTrafficClassAndHopLimit(self):
3796 # Test setting traffic class and hop limit on outgoing packet,
3797 # and receiving them at the other end.
3798 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3799 maxhop=self.hop_limit)
3800
3801 @testSetTrafficClassAndHopLimit.client_skip
3802 def _testSetTrafficClassAndHopLimit(self):
3803 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3804 self.assertEqual(
3805 self.sendmsgToServer([MSG],
3806 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3807 array.array("i", [self.traffic_class])),
3808 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3809 array.array("i", [self.hop_limit]))]),
3810 len(MSG))
3811
3812 @requireAttrs(socket.socket, "sendmsg")
3813 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3814 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3815 def testOddCmsgSize(self):
3816 # Try to send ancillary data with first item one byte too
3817 # long. Fall back to sending with correct size if this fails,
3818 # and check that second item was handled correctly.
3819 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3820 maxhop=self.hop_limit)
3821
3822 @testOddCmsgSize.client_skip
3823 def _testOddCmsgSize(self):
3824 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3825 try:
3826 nbytes = self.sendmsgToServer(
3827 [MSG],
3828 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003829 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003830 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3831 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003832 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833 self.assertIsInstance(e.errno, int)
3834 nbytes = self.sendmsgToServer(
3835 [MSG],
3836 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3837 array.array("i", [self.traffic_class])),
3838 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3839 array.array("i", [self.hop_limit]))])
3840 self.assertEqual(nbytes, len(MSG))
3841
3842 # Tests for proper handling of truncated ancillary data
3843
3844 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3845 # Receive hop limit into ancbufsize bytes of ancillary data
3846 # space, which should be too small to contain the ancillary
3847 # data header (if ancbufsize is None, pass no second argument
3848 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3849 # (unless included in ignoreflags), and no ancillary data is
3850 # returned.
3851 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3852 socket.IPV6_RECVHOPLIMIT, 1)
3853 self.misc_event.set()
3854 args = () if ancbufsize is None else (ancbufsize,)
3855 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3856 len(MSG), *args)
3857
3858 self.assertEqual(msg, MSG)
3859 self.checkRecvmsgAddress(addr, self.cli_addr)
3860 self.assertEqual(ancdata, [])
3861 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3862 ignore=ignoreflags)
3863
3864 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3865 def testCmsgTruncNoBufSize(self):
3866 # Check that no ancillary data is received when no ancillary
3867 # buffer size is provided.
3868 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3869 # BSD seems to set
3870 # MSG_CTRUNC only if an item
3871 # has been partially
3872 # received.
3873 ignoreflags=socket.MSG_CTRUNC)
3874
3875 @testCmsgTruncNoBufSize.client_skip
3876 def _testCmsgTruncNoBufSize(self):
3877 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3878 self.sendToServer(MSG)
3879
3880 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3881 def testSingleCmsgTrunc0(self):
3882 # Check that no ancillary data is received when ancillary
3883 # buffer size is zero.
3884 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3885 ignoreflags=socket.MSG_CTRUNC)
3886
3887 @testSingleCmsgTrunc0.client_skip
3888 def _testSingleCmsgTrunc0(self):
3889 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3890 self.sendToServer(MSG)
3891
3892 # Check that no ancillary data is returned for various non-zero
3893 # (but still too small) buffer sizes.
3894
3895 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3896 def testSingleCmsgTrunc1(self):
3897 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3898
3899 @testSingleCmsgTrunc1.client_skip
3900 def _testSingleCmsgTrunc1(self):
3901 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3902 self.sendToServer(MSG)
3903
3904 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3905 def testSingleCmsgTrunc2Int(self):
3906 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3907
3908 @testSingleCmsgTrunc2Int.client_skip
3909 def _testSingleCmsgTrunc2Int(self):
3910 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3911 self.sendToServer(MSG)
3912
3913 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3914 def testSingleCmsgTruncLen0Minus1(self):
3915 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3916
3917 @testSingleCmsgTruncLen0Minus1.client_skip
3918 def _testSingleCmsgTruncLen0Minus1(self):
3919 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3920 self.sendToServer(MSG)
3921
3922 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3923 def testSingleCmsgTruncInData(self):
3924 # Test truncation of a control message inside its associated
3925 # data. The message may be returned with its data truncated,
3926 # or not returned at all.
3927 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3928 socket.IPV6_RECVHOPLIMIT, 1)
3929 self.misc_event.set()
3930 msg, ancdata, flags, addr = self.doRecvmsg(
3931 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3932
3933 self.assertEqual(msg, MSG)
3934 self.checkRecvmsgAddress(addr, self.cli_addr)
3935 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3936
3937 self.assertLessEqual(len(ancdata), 1)
3938 if ancdata:
3939 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3940 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3941 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3942 self.assertLess(len(cmsg_data), SIZEOF_INT)
3943
3944 @testSingleCmsgTruncInData.client_skip
3945 def _testSingleCmsgTruncInData(self):
3946 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3947 self.sendToServer(MSG)
3948
3949 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3950 # Receive traffic class and hop limit into ancbufsize bytes of
3951 # ancillary data space, which should be large enough to
3952 # contain the first item, but too small to contain the header
3953 # of the second. Check that data is MSG, MSG_CTRUNC is set
3954 # (unless included in ignoreflags), and only one ancillary
3955 # data item is returned.
3956 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3957 socket.IPV6_RECVHOPLIMIT, 1)
3958 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3959 socket.IPV6_RECVTCLASS, 1)
3960 self.misc_event.set()
3961 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3962 len(MSG), ancbufsize)
3963
3964 self.assertEqual(msg, MSG)
3965 self.checkRecvmsgAddress(addr, self.cli_addr)
3966 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3967 ignore=ignoreflags)
3968
3969 self.assertEqual(len(ancdata), 1)
3970 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3971 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3972 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3973 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3974 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003975 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976 self.assertGreaterEqual(a[0], 0)
3977 self.assertLessEqual(a[0], 255)
3978
3979 # Try the above test with various buffer sizes.
3980
3981 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3982 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3983 def testSecondCmsgTrunc0(self):
3984 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3985 ignoreflags=socket.MSG_CTRUNC)
3986
3987 @testSecondCmsgTrunc0.client_skip
3988 def _testSecondCmsgTrunc0(self):
3989 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3990 self.sendToServer(MSG)
3991
3992 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3993 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3994 def testSecondCmsgTrunc1(self):
3995 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3996
3997 @testSecondCmsgTrunc1.client_skip
3998 def _testSecondCmsgTrunc1(self):
3999 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4000 self.sendToServer(MSG)
4001
4002 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4003 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4004 def testSecondCmsgTrunc2Int(self):
4005 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4006 2 * SIZEOF_INT)
4007
4008 @testSecondCmsgTrunc2Int.client_skip
4009 def _testSecondCmsgTrunc2Int(self):
4010 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4011 self.sendToServer(MSG)
4012
4013 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4014 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4015 def testSecondCmsgTruncLen0Minus1(self):
4016 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4017 socket.CMSG_LEN(0) - 1)
4018
4019 @testSecondCmsgTruncLen0Minus1.client_skip
4020 def _testSecondCmsgTruncLen0Minus1(self):
4021 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4022 self.sendToServer(MSG)
4023
4024 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4025 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4026 def testSecomdCmsgTruncInData(self):
4027 # Test truncation of the second of two control messages inside
4028 # its associated data.
4029 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4030 socket.IPV6_RECVHOPLIMIT, 1)
4031 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4032 socket.IPV6_RECVTCLASS, 1)
4033 self.misc_event.set()
4034 msg, ancdata, flags, addr = self.doRecvmsg(
4035 self.serv_sock, len(MSG),
4036 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4037
4038 self.assertEqual(msg, MSG)
4039 self.checkRecvmsgAddress(addr, self.cli_addr)
4040 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4041
4042 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4043
4044 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4045 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4046 cmsg_types.remove(cmsg_type)
4047 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4048 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004049 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004050 self.assertGreaterEqual(a[0], 0)
4051 self.assertLessEqual(a[0], 255)
4052
4053 if ancdata:
4054 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4055 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4056 cmsg_types.remove(cmsg_type)
4057 self.assertLess(len(cmsg_data), SIZEOF_INT)
4058
4059 self.assertEqual(ancdata, [])
4060
4061 @testSecomdCmsgTruncInData.client_skip
4062 def _testSecomdCmsgTruncInData(self):
4063 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4064 self.sendToServer(MSG)
4065
4066
4067# Derive concrete test classes for different socket types.
4068
4069class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4070 SendrecvmsgConnectionlessBase,
4071 ThreadedSocketTestMixin, UDPTestBase):
4072 pass
4073
4074@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004075class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4076 pass
4077
4078@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004079class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4080 pass
4081
4082@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004083class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4084 pass
4085
4086
4087class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4088 SendrecvmsgConnectionlessBase,
4089 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004090
4091 def checkRecvmsgAddress(self, addr1, addr2):
4092 # Called to compare the received address with the address of
4093 # the peer, ignoring scope ID
4094 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004095
4096@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004097@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004098@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004099class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4100 pass
4101
4102@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004103@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004105class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4106 pass
4107
4108@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004109@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004110@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004111class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4112 pass
4113
4114@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004115@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116@requireAttrs(socket, "IPPROTO_IPV6")
4117@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004118class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4119 SendrecvmsgUDP6TestBase):
4120 pass
4121
4122@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004123@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004124@requireAttrs(socket, "IPPROTO_IPV6")
4125@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004126class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4127 RFC3542AncillaryTest,
4128 SendrecvmsgUDP6TestBase):
4129 pass
4130
4131
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004132@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4133 'UDPLITE sockets required for this test.')
4134class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4135 SendrecvmsgConnectionlessBase,
4136 ThreadedSocketTestMixin, UDPLITETestBase):
4137 pass
4138
4139@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4140 'UDPLITE sockets required for this test.')
4141@requireAttrs(socket.socket, "sendmsg")
4142class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4143 pass
4144
4145@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4146 'UDPLITE sockets required for this test.')
4147@requireAttrs(socket.socket, "recvmsg")
4148class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4149 pass
4150
4151@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4152 'UDPLITE sockets required for this test.')
4153@requireAttrs(socket.socket, "recvmsg_into")
4154class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4155 pass
4156
4157
4158@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4159 'UDPLITE sockets required for this test.')
4160class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4161 SendrecvmsgConnectionlessBase,
4162 ThreadedSocketTestMixin, UDPLITE6TestBase):
4163
4164 def checkRecvmsgAddress(self, addr1, addr2):
4165 # Called to compare the received address with the address of
4166 # the peer, ignoring scope ID
4167 self.assertEqual(addr1[:-1], addr2[:-1])
4168
4169@requireAttrs(socket.socket, "sendmsg")
4170@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4171@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4172 'UDPLITE sockets required for this test.')
4173@requireSocket("AF_INET6", "SOCK_DGRAM")
4174class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4175 pass
4176
4177@requireAttrs(socket.socket, "recvmsg")
4178@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4179@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4180 'UDPLITE sockets required for this test.')
4181@requireSocket("AF_INET6", "SOCK_DGRAM")
4182class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4183 pass
4184
4185@requireAttrs(socket.socket, "recvmsg_into")
4186@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4187@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4188 'UDPLITE sockets required for this test.')
4189@requireSocket("AF_INET6", "SOCK_DGRAM")
4190class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4191 pass
4192
4193@requireAttrs(socket.socket, "recvmsg")
4194@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4195@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4196 'UDPLITE sockets required for this test.')
4197@requireAttrs(socket, "IPPROTO_IPV6")
4198@requireSocket("AF_INET6", "SOCK_DGRAM")
4199class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4200 SendrecvmsgUDPLITE6TestBase):
4201 pass
4202
4203@requireAttrs(socket.socket, "recvmsg_into")
4204@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4205@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4206 'UDPLITE sockets required for this test.')
4207@requireAttrs(socket, "IPPROTO_IPV6")
4208@requireSocket("AF_INET6", "SOCK_DGRAM")
4209class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4210 RFC3542AncillaryTest,
4211 SendrecvmsgUDPLITE6TestBase):
4212 pass
4213
4214
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004215class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4216 ConnectedStreamTestMixin, TCPTestBase):
4217 pass
4218
4219@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004220class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4221 pass
4222
4223@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004224class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4225 SendrecvmsgTCPTestBase):
4226 pass
4227
4228@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004229class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4230 SendrecvmsgTCPTestBase):
4231 pass
4232
4233
4234class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4235 SendrecvmsgConnectedBase,
4236 ConnectedStreamTestMixin, SCTPStreamBase):
4237 pass
4238
4239@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004240@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004241@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004242class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4243 pass
4244
4245@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004246@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004247@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004248class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4249 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004250
4251 def testRecvmsgEOF(self):
4252 try:
4253 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4254 except OSError as e:
4255 if e.errno != errno.ENOTCONN:
4256 raise
4257 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004258
4259@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004260@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004261@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004262class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4263 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004264
4265 def testRecvmsgEOF(self):
4266 try:
4267 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4268 except OSError as e:
4269 if e.errno != errno.ENOTCONN:
4270 raise
4271 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004272
4273
4274class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4275 ConnectedStreamTestMixin, UnixStreamBase):
4276 pass
4277
4278@requireAttrs(socket.socket, "sendmsg")
4279@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004280class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4281 pass
4282
4283@requireAttrs(socket.socket, "recvmsg")
4284@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004285class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4286 SendrecvmsgUnixStreamTestBase):
4287 pass
4288
4289@requireAttrs(socket.socket, "recvmsg_into")
4290@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004291class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4292 SendrecvmsgUnixStreamTestBase):
4293 pass
4294
4295@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4296@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004297class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4298 pass
4299
4300@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4301@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004302class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4303 SendrecvmsgUnixStreamTestBase):
4304 pass
4305
4306
4307# Test interrupting the interruptible send/receive methods with a
4308# signal when a timeout is set. These tests avoid having multiple
4309# threads alive during the test so that the OS cannot deliver the
4310# signal to the wrong one.
4311
4312class InterruptedTimeoutBase(unittest.TestCase):
4313 # Base class for interrupted send/receive tests. Installs an
4314 # empty handler for SIGALRM and removes it on teardown, along with
4315 # any scheduled alarms.
4316
4317 def setUp(self):
4318 super().setUp()
4319 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004320 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004322
4323 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004324 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004325
4326 # Provide setAlarm() method to schedule delivery of SIGALRM after
4327 # given number of seconds, or cancel it if zero, and an
4328 # appropriate time value to use. Use setitimer() if available.
4329 if hasattr(signal, "setitimer"):
4330 alarm_time = 0.05
4331
4332 def setAlarm(self, seconds):
4333 signal.setitimer(signal.ITIMER_REAL, seconds)
4334 else:
4335 # Old systems may deliver the alarm up to one second early
4336 alarm_time = 2
4337
4338 def setAlarm(self, seconds):
4339 signal.alarm(seconds)
4340
4341
4342# Require siginterrupt() in order to ensure that system calls are
4343# interrupted by default.
4344@requireAttrs(signal, "siginterrupt")
4345@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4346 "Don't have signal.alarm or signal.setitimer")
4347class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4348 # Test interrupting the recv*() methods with signals when a
4349 # timeout is set.
4350
4351 def setUp(self):
4352 super().setUp()
4353 self.serv.settimeout(self.timeout)
4354
4355 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004356 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004357 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004358 try:
4359 self.setAlarm(self.alarm_time)
4360 with self.assertRaises(ZeroDivisionError) as cm:
4361 func(*args, **kwargs)
4362 finally:
4363 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004364
4365 def testInterruptedRecvTimeout(self):
4366 self.checkInterruptedRecv(self.serv.recv, 1024)
4367
4368 def testInterruptedRecvIntoTimeout(self):
4369 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4370
4371 def testInterruptedRecvfromTimeout(self):
4372 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4373
4374 def testInterruptedRecvfromIntoTimeout(self):
4375 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4376
4377 @requireAttrs(socket.socket, "recvmsg")
4378 def testInterruptedRecvmsgTimeout(self):
4379 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4380
4381 @requireAttrs(socket.socket, "recvmsg_into")
4382 def testInterruptedRecvmsgIntoTimeout(self):
4383 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4384
4385
4386# Require siginterrupt() in order to ensure that system calls are
4387# interrupted by default.
4388@requireAttrs(signal, "siginterrupt")
4389@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4390 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004391class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4392 ThreadSafeCleanupTestCase,
4393 SocketListeningTestMixin, TCPTestBase):
4394 # Test interrupting the interruptible send*() methods with signals
4395 # when a timeout is set.
4396
4397 def setUp(self):
4398 super().setUp()
4399 self.serv_conn = self.newSocket()
4400 self.addCleanup(self.serv_conn.close)
4401 # Use a thread to complete the connection, but wait for it to
4402 # terminate before running the test, so that there is only one
4403 # thread to accept the signal.
4404 cli_thread = threading.Thread(target=self.doConnect)
4405 cli_thread.start()
4406 self.cli_conn, addr = self.serv.accept()
4407 self.addCleanup(self.cli_conn.close)
4408 cli_thread.join()
4409 self.serv_conn.settimeout(self.timeout)
4410
4411 def doConnect(self):
4412 self.serv_conn.connect(self.serv_addr)
4413
4414 def checkInterruptedSend(self, func, *args, **kwargs):
4415 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004416 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004417 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004418 try:
4419 with self.assertRaises(ZeroDivisionError) as cm:
4420 while True:
4421 self.setAlarm(self.alarm_time)
4422 func(*args, **kwargs)
4423 finally:
4424 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425
Ned Deilyc5640382014-02-03 13:58:31 -08004426 # Issue #12958: The following tests have problems on OS X prior to 10.7
4427 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004428 def testInterruptedSendTimeout(self):
4429 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4430
Ned Deilyc5640382014-02-03 13:58:31 -08004431 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004432 def testInterruptedSendtoTimeout(self):
4433 # Passing an actual address here as Python's wrapper for
4434 # sendto() doesn't allow passing a zero-length one; POSIX
4435 # requires that the address is ignored since the socket is
4436 # connection-mode, however.
4437 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4438 self.serv_addr)
4439
Ned Deilyc5640382014-02-03 13:58:31 -08004440 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004441 @requireAttrs(socket.socket, "sendmsg")
4442 def testInterruptedSendmsgTimeout(self):
4443 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4444
4445
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004446class TCPCloserTest(ThreadedTCPSocketTest):
4447
4448 def testClose(self):
4449 conn, addr = self.serv.accept()
4450 conn.close()
4451
4452 sd = self.cli
4453 read, write, err = select.select([sd], [], [], 1.0)
4454 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004455 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004456
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004457 # Calling close() many times should be safe.
4458 conn.close()
4459 conn.close()
4460
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004461 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004462 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004463 time.sleep(1.0)
4464
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004465
Dave Cole331708b2004-08-09 04:51:41 +00004466class BasicSocketPairTest(SocketPairTest):
4467
4468 def __init__(self, methodName='runTest'):
4469 SocketPairTest.__init__(self, methodName=methodName)
4470
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004471 def _check_defaults(self, sock):
4472 self.assertIsInstance(sock, socket.socket)
4473 if hasattr(socket, 'AF_UNIX'):
4474 self.assertEqual(sock.family, socket.AF_UNIX)
4475 else:
4476 self.assertEqual(sock.family, socket.AF_INET)
4477 self.assertEqual(sock.type, socket.SOCK_STREAM)
4478 self.assertEqual(sock.proto, 0)
4479
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004480 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004481 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004482
4483 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004484 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004485
Dave Cole331708b2004-08-09 04:51:41 +00004486 def testRecv(self):
4487 msg = self.serv.recv(1024)
4488 self.assertEqual(msg, MSG)
4489
4490 def _testRecv(self):
4491 self.cli.send(MSG)
4492
4493 def testSend(self):
4494 self.serv.send(MSG)
4495
4496 def _testSend(self):
4497 msg = self.cli.recv(1024)
4498 self.assertEqual(msg, MSG)
4499
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004500
Guido van Rossum24e4af82002-06-12 19:18:08 +00004501class NonBlockingTCPTests(ThreadedTCPSocketTest):
4502
4503 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004504 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004505 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4506
Victor Stinner304315d2018-11-30 13:22:44 +01004507 def assert_sock_timeout(self, sock, timeout):
4508 self.assertEqual(self.serv.gettimeout(), timeout)
4509
4510 blocking = (timeout != 0.0)
4511 self.assertEqual(sock.getblocking(), blocking)
4512
4513 if fcntl is not None:
4514 # When a Python socket has a non-zero timeout, it's switched
4515 # internally to a non-blocking mode. Later, sock.sendall(),
4516 # sock.recv(), and other socket operations use a select() call and
4517 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4518 # timeouts are enforced.
4519 fd_blocking = (timeout is None)
4520
4521 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4522 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4523
Guido van Rossum24e4af82002-06-12 19:18:08 +00004524 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004525 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004526 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004527 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004528
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004529 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004530 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004531
4532 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004533 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004534
4535 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004536 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004537
4538 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004539 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004540
4541 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004542 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004543
4544 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004545 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004546
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004547 @support.cpython_only
4548 def testSetBlocking_overflow(self):
4549 # Issue 15989
4550 import _testcapi
4551 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4552 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004553
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004554 self.serv.setblocking(False)
4555 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004556
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004557 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4558 self.assertIsNone(self.serv.gettimeout())
4559
4560 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4561
Serhiy Storchaka43767632013-11-03 21:31:38 +02004562 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4563 'test needs socket.SOCK_NONBLOCK')
4564 @support.requires_linux_version(2, 6, 28)
4565 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004566 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004567 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004568 self.serv = socket.socket(socket.AF_INET,
4569 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4570 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004571
4572 def _testInitNonBlocking(self):
4573 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004574
Victor Stinner304315d2018-11-30 13:22:44 +01004575 def testInheritFlagsBlocking(self):
4576 # bpo-7995: accept() on a listening socket with a timeout and the
4577 # default timeout is None, the resulting socket must be blocking.
4578 with socket_setdefaulttimeout(None):
4579 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004580 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004581 self.addCleanup(conn.close)
4582 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004583
Victor Stinner304315d2018-11-30 13:22:44 +01004584 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004585 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004586
4587 def testInheritFlagsTimeout(self):
4588 # bpo-7995: accept() on a listening socket with a timeout and the
4589 # default timeout is None, the resulting socket must inherit
4590 # the default timeout.
4591 default_timeout = 20.0
4592 with socket_setdefaulttimeout(default_timeout):
4593 self.serv.settimeout(10)
4594 conn, addr = self.serv.accept()
4595 self.addCleanup(conn.close)
4596 self.assertEqual(conn.gettimeout(), default_timeout)
4597
4598 def _testInheritFlagsTimeout(self):
4599 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004600
Guido van Rossum24e4af82002-06-12 19:18:08 +00004601 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004602 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004603 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004604
4605 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004606 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004607 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004608 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004609 dt = time.monotonic() - start_time
4610 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004611
4612 self.event.set()
4613
Victor Stinner24c62582019-10-30 12:41:43 +01004614 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004615 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004616 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004617
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004618 # connect() completed: non-blocking accept() doesn't block
4619 conn, addr = self.serv.accept()
4620 self.addCleanup(conn.close)
4621 self.assertIsNone(conn.gettimeout())
4622
Guido van Rossum24e4af82002-06-12 19:18:08 +00004623 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004624 # don't connect before event is set to check
4625 # that non-blocking accept() raises BlockingIOError
4626 self.event.wait()
4627
Christian Heimes5e696852008-04-09 08:37:03 +00004628 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004629
Guido van Rossum24e4af82002-06-12 19:18:08 +00004630 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004631 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004632 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004633 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004634 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004635
4636 # the server didn't send data yet: non-blocking recv() fails
4637 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004638 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004639
4640 self.event.set()
4641
Victor Stinner24c62582019-10-30 12:41:43 +01004642 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004643 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004644 self.fail("Error during select call to non-blocking socket.")
4645
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004646 # the server sent data yet: non-blocking recv() doesn't block
4647 msg = conn.recv(len(MSG))
4648 self.assertEqual(msg, MSG)
4649
Guido van Rossum24e4af82002-06-12 19:18:08 +00004650 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004651 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004652
4653 # don't send anything before event is set to check
4654 # that non-blocking recv() raises BlockingIOError
4655 self.event.wait()
4656
4657 # send data: recv() will no longer block
4658 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004659
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004660
Guido van Rossum24e4af82002-06-12 19:18:08 +00004661class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004662 """Unit tests for the object returned by socket.makefile()
4663
Antoine Pitrou834bd812010-10-13 16:17:14 +00004664 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004665 the client connection. You can read from this file to
4666 get output from the server.
4667
Antoine Pitrou834bd812010-10-13 16:17:14 +00004668 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004669 server connection. You can write to this file to send output
4670 to the client.
4671 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004672
Guido van Rossume9f66142002-08-07 15:46:19 +00004673 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004674 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004675 errors = 'strict'
4676 newline = None
4677
4678 read_mode = 'rb'
4679 read_msg = MSG
4680 write_mode = 'wb'
4681 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004682
Guido van Rossum24e4af82002-06-12 19:18:08 +00004683 def __init__(self, methodName='runTest'):
4684 SocketConnectedTest.__init__(self, methodName=methodName)
4685
4686 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004687 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4688 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004689 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004690 self.read_file = self.cli_conn.makefile(
4691 self.read_mode, self.bufsize,
4692 encoding = self.encoding,
4693 errors = self.errors,
4694 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004695
4696 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004697 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004698 self.read_file.close()
4699 self.assertTrue(self.read_file.closed)
4700 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004701 SocketConnectedTest.tearDown(self)
4702
4703 def clientSetUp(self):
4704 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004705 self.write_file = self.serv_conn.makefile(
4706 self.write_mode, self.bufsize,
4707 encoding = self.encoding,
4708 errors = self.errors,
4709 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004710
4711 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004712 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004713 self.write_file.close()
4714 self.assertTrue(self.write_file.closed)
4715 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004716 SocketConnectedTest.clientTearDown(self)
4717
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004718 def testReadAfterTimeout(self):
4719 # Issue #7322: A file object must disallow further reads
4720 # after a timeout has occurred.
4721 self.cli_conn.settimeout(1)
4722 self.read_file.read(3)
4723 # First read raises a timeout
4724 self.assertRaises(socket.timeout, self.read_file.read, 1)
4725 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004726 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004727 self.read_file.read(1)
4728 self.assertIn("cannot read from timed out object", str(ctx.exception))
4729
4730 def _testReadAfterTimeout(self):
4731 self.write_file.write(self.write_msg[0:3])
4732 self.write_file.flush()
4733 self.serv_finished.wait()
4734
Guido van Rossum24e4af82002-06-12 19:18:08 +00004735 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004736 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004737 first_seg = self.read_file.read(len(self.read_msg)-3)
4738 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004739 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004740 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004741
4742 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004743 self.write_file.write(self.write_msg)
4744 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004745
Guido van Rossum8c943832002-08-08 01:00:28 +00004746 def testFullRead(self):
4747 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004748 msg = self.read_file.read()
4749 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004750
4751 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004752 self.write_file.write(self.write_msg)
4753 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004754
Guido van Rossum24e4af82002-06-12 19:18:08 +00004755 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004756 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004757 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004758 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004759 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004760 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004761 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004762 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004763 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004764
4765 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004766 self.write_file.write(self.write_msg)
4767 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004768
4769 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004770 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004771 line = self.read_file.readline()
4772 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004773
4774 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004775 self.write_file.write(self.write_msg)
4776 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004777
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004778 def testCloseAfterMakefile(self):
4779 # The file returned by makefile should keep the socket open.
4780 self.cli_conn.close()
4781 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004782 msg = self.read_file.read()
4783 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004784
4785 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004786 self.write_file.write(self.write_msg)
4787 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004788
4789 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004790 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004791 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004792 if isinstance(self.read_msg, str):
4793 msg = msg.decode()
4794 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004795
4796 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004797 self.write_file.write(self.write_msg)
4798 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004799
Tim Peters116d83c2004-03-28 02:20:45 +00004800 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004801 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004802
4803 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004804 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004805
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004806 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004807 self.assertEqual(self.read_file.mode, self.read_mode)
4808 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004809
4810 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004811 self.assertEqual(self.write_file.mode, self.write_mode)
4812 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004813
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004814 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004815 self.read_file.close()
4816 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004817 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004818 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004819
4820 def _testRealClose(self):
4821 pass
4822
4823
Guido van Rossume9f66142002-08-07 15:46:19 +00004824class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4825
4826 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004827
Guido van Rossume9f66142002-08-07 15:46:19 +00004828 In this case (and in this case only), it should be possible to
4829 create a file object, read a line from it, create another file
4830 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004831 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004832 when reading multiple requests from the same socket."""
4833
4834 bufsize = 0 # Use unbuffered mode
4835
4836 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004837 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004838 line = self.read_file.readline() # first line
4839 self.assertEqual(line, b"A. " + self.write_msg) # first line
4840 self.read_file = self.cli_conn.makefile('rb', 0)
4841 line = self.read_file.readline() # second line
4842 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004843
4844 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004845 self.write_file.write(b"A. " + self.write_msg)
4846 self.write_file.write(b"B. " + self.write_msg)
4847 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004848
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004849 def testMakefileClose(self):
4850 # The file returned by makefile should keep the socket open...
4851 self.cli_conn.close()
4852 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004853 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004854 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004855 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004856 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004857
4858 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004859 self.write_file.write(self.write_msg)
4860 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004861
4862 def testMakefileCloseSocketDestroy(self):
4863 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004864 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004865 refcount_after = sys.getrefcount(self.cli_conn)
4866 self.assertEqual(refcount_before - 1, refcount_after)
4867
4868 def _testMakefileCloseSocketDestroy(self):
4869 pass
4870
Antoine Pitrou98b46702010-09-18 22:59:00 +00004871 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004872 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004873 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4874
4875 def testSmallReadNonBlocking(self):
4876 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004877 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4878 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004879 self.evt1.set()
4880 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004881 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004882 if first_seg is None:
4883 # Data not arrived (can happen under Windows), wait a bit
4884 time.sleep(0.5)
4885 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004886 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004887 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004888 self.assertEqual(n, 3)
4889 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004890 self.assertEqual(msg, self.read_msg)
4891 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4892 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004893
4894 def _testSmallReadNonBlocking(self):
4895 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004896 self.write_file.write(self.write_msg)
4897 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004898 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004899 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004900 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4901 self.serv_finished.wait(5.0)
4902
4903 def testWriteNonBlocking(self):
4904 self.cli_finished.wait(5.0)
4905 # The client thread can't skip directly - the SkipTest exception
4906 # would appear as a failure.
4907 if self.serv_skipped:
4908 self.skipTest(self.serv_skipped)
4909
4910 def _testWriteNonBlocking(self):
4911 self.serv_skipped = None
4912 self.serv_conn.setblocking(False)
4913 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004914 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004915 LIMIT = 10
4916 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004917 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004918 self.assertGreater(n, 0)
4919 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004920 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004921 if n is None:
4922 # Succeeded
4923 break
4924 self.assertGreater(n, 0)
4925 else:
4926 # Let us know that this test didn't manage to establish
4927 # the expected conditions. This is not a failure in itself but,
4928 # if it happens repeatedly, the test should be fixed.
4929 self.serv_skipped = "failed to saturate the socket buffer"
4930
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004931
Guido van Rossum8c943832002-08-08 01:00:28 +00004932class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4933
4934 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4935
4936
4937class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4938
4939 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004940
Thomas Woutersb2137042007-02-01 18:02:27 +00004941
Antoine Pitrou834bd812010-10-13 16:17:14 +00004942class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4943 """Tests for socket.makefile() in text mode (rather than binary)"""
4944
4945 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004946 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004947 write_mode = 'wb'
4948 write_msg = MSG
4949 newline = ''
4950
4951
4952class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4953 """Tests for socket.makefile() in text mode (rather than binary)"""
4954
4955 read_mode = 'rb'
4956 read_msg = MSG
4957 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004958 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004959 newline = ''
4960
4961
4962class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4963 """Tests for socket.makefile() in text mode (rather than binary)"""
4964
4965 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004966 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004967 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004968 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004969 newline = ''
4970
4971
Guido van Rossumd8faa362007-04-27 19:54:29 +00004972class NetworkConnectionTest(object):
4973 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004974
Guido van Rossumd8faa362007-04-27 19:54:29 +00004975 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004976 # We're inherited below by BasicTCPTest2, which also inherits
4977 # BasicTCPTest, which defines self.port referenced below.
4978 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004979 self.serv_conn = self.cli
4980
4981class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4982 """Tests that NetworkConnection does not break existing TCP functionality.
4983 """
4984
4985class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004986
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004987 class MockSocket(socket.socket):
4988 def connect(self, *args):
4989 raise socket.timeout('timed out')
4990
4991 @contextlib.contextmanager
4992 def mocked_socket_module(self):
4993 """Return a socket which times out on connect"""
4994 old_socket = socket.socket
4995 socket.socket = self.MockSocket
4996 try:
4997 yield
4998 finally:
4999 socket.socket = old_socket
5000
5001 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005002 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005003 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005004 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005005 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005006 cli.connect((HOST, port))
5007 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5008
5009 def test_create_connection(self):
5010 # Issue #9792: errors raised by create_connection() should have
5011 # a proper errno attribute.
5012 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005013 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005014 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005015
5016 # Issue #16257: create_connection() calls getaddrinfo() against
5017 # 'localhost'. This may result in an IPV6 addr being returned
5018 # as well as an IPV4 one:
5019 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5020 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5021 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5022 #
5023 # create_connection() enumerates through all the addresses returned
5024 # and if it doesn't successfully bind to any of them, it propagates
5025 # the last exception it encountered.
5026 #
5027 # On Solaris, ENETUNREACH is returned in this circumstance instead
5028 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5029 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02005030 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005031 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005032
5033 def test_create_connection_timeout(self):
5034 # Issue #9792: create_connection() should not recast timeout errors
5035 # as generic socket errors.
5036 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005037 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005038 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005039 except socket.timeout:
5040 pass
5041 except OSError as exc:
5042 if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
5043 raise
5044 else:
5045 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005046
Guido van Rossumd8faa362007-04-27 19:54:29 +00005047
5048class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5049
5050 def __init__(self, methodName='runTest'):
5051 SocketTCPTest.__init__(self, methodName=methodName)
5052 ThreadableTest.__init__(self)
5053
5054 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00005055 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005056
5057 def clientTearDown(self):
5058 self.cli.close()
5059 self.cli = None
5060 ThreadableTest.clientTearDown(self)
5061
5062 def _justAccept(self):
5063 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005064 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005065
5066 testFamily = _justAccept
5067 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005068 self.cli = socket.create_connection((HOST, self.port),
5069 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005070 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005071 self.assertEqual(self.cli.family, 2)
5072
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005073 testSourceAddress = _justAccept
5074 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005075 self.cli = socket.create_connection((HOST, self.port),
5076 timeout=support.LOOPBACK_TIMEOUT,
5077 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005078 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005079 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005080 # The port number being used is sufficient to show that the bind()
5081 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005082
Guido van Rossumd8faa362007-04-27 19:54:29 +00005083 testTimeoutDefault = _justAccept
5084 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005085 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005086 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005087 socket.setdefaulttimeout(42)
5088 try:
5089 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005090 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005091 finally:
5092 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005093 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005094
5095 testTimeoutNone = _justAccept
5096 def _testTimeoutNone(self):
5097 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005098 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005099 socket.setdefaulttimeout(30)
5100 try:
5101 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005102 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005103 finally:
5104 socket.setdefaulttimeout(None)
5105 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005106
5107 testTimeoutValueNamed = _justAccept
5108 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005109 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005110 self.assertEqual(self.cli.gettimeout(), 30)
5111
5112 testTimeoutValueNonamed = _justAccept
5113 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005114 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005115 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005116 self.assertEqual(self.cli.gettimeout(), 30)
5117
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005118
Guido van Rossumd8faa362007-04-27 19:54:29 +00005119class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5120
5121 def __init__(self, methodName='runTest'):
5122 SocketTCPTest.__init__(self, methodName=methodName)
5123 ThreadableTest.__init__(self)
5124
5125 def clientSetUp(self):
5126 pass
5127
5128 def clientTearDown(self):
5129 self.cli.close()
5130 self.cli = None
5131 ThreadableTest.clientTearDown(self)
5132
5133 def testInsideTimeout(self):
5134 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005135 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005136 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005137 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005138 testOutsideTimeout = testInsideTimeout
5139
5140 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005141 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005142 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005143 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005144
5145 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005146 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005147 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005148
5149
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005150class TCPTimeoutTest(SocketTCPTest):
5151
5152 def testTCPTimeout(self):
5153 def raise_timeout(*args, **kwargs):
5154 self.serv.settimeout(1.0)
5155 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005156 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005157 "Error generating a timeout exception (TCP)")
5158
5159 def testTimeoutZero(self):
5160 ok = False
5161 try:
5162 self.serv.settimeout(0.0)
5163 foo = self.serv.accept()
5164 except socket.timeout:
5165 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005166 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005167 ok = True
5168 except:
5169 self.fail("caught unexpected exception (TCP)")
5170 if not ok:
5171 self.fail("accept() returned success when we did not expect it")
5172
Serhiy Storchaka43767632013-11-03 21:31:38 +02005173 @unittest.skipUnless(hasattr(signal, 'alarm'),
5174 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005175 def testInterruptedTimeout(self):
5176 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005177 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005178 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005179 self.serv.settimeout(5.0) # must be longer than alarm
5180 class Alarm(Exception):
5181 pass
5182 def alarm_handler(signal, frame):
5183 raise Alarm
5184 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5185 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005186 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005187 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005188 foo = self.serv.accept()
5189 except socket.timeout:
5190 self.fail("caught timeout instead of Alarm")
5191 except Alarm:
5192 pass
5193 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005194 self.fail("caught other exception instead of Alarm:"
5195 " %s(%s):\n%s" %
5196 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005197 else:
5198 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005199 finally:
5200 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005201 except Alarm:
5202 self.fail("got Alarm in wrong place")
5203 finally:
5204 # no alarm can be pending. Safe to restore old handler.
5205 signal.signal(signal.SIGALRM, old_alarm)
5206
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005207class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005208
5209 def testUDPTimeout(self):
5210 def raise_timeout(*args, **kwargs):
5211 self.serv.settimeout(1.0)
5212 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005213 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005214 "Error generating a timeout exception (UDP)")
5215
5216 def testTimeoutZero(self):
5217 ok = False
5218 try:
5219 self.serv.settimeout(0.0)
5220 foo = self.serv.recv(1024)
5221 except socket.timeout:
5222 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005223 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005224 ok = True
5225 except:
5226 self.fail("caught unexpected exception (UDP)")
5227 if not ok:
5228 self.fail("recv() returned success when we did not expect it")
5229
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005230@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5231 'UDPLITE sockets required for this test.')
5232class UDPLITETimeoutTest(SocketUDPLITETest):
5233
5234 def testUDPLITETimeout(self):
5235 def raise_timeout(*args, **kwargs):
5236 self.serv.settimeout(1.0)
5237 self.serv.recv(1024)
5238 self.assertRaises(socket.timeout, raise_timeout,
5239 "Error generating a timeout exception (UDPLITE)")
5240
5241 def testTimeoutZero(self):
5242 ok = False
5243 try:
5244 self.serv.settimeout(0.0)
5245 foo = self.serv.recv(1024)
5246 except socket.timeout:
5247 self.fail("caught timeout instead of error (UDPLITE)")
5248 except OSError:
5249 ok = True
5250 except:
5251 self.fail("caught unexpected exception (UDPLITE)")
5252 if not ok:
5253 self.fail("recv() returned success when we did not expect it")
5254
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005255class TestExceptions(unittest.TestCase):
5256
5257 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005258 self.assertTrue(issubclass(OSError, Exception))
5259 self.assertTrue(issubclass(socket.herror, OSError))
5260 self.assertTrue(issubclass(socket.gaierror, OSError))
5261 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005262
Yury Selivanovfa22b292016-10-18 16:03:52 -04005263 def test_setblocking_invalidfd(self):
5264 # Regression test for issue #28471
5265
5266 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5267 sock = socket.socket(
5268 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5269 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005270 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005271
5272 with self.assertRaises(OSError):
5273 sock.setblocking(False)
5274
5275
Serhiy Storchaka43767632013-11-03 21:31:38 +02005276@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005277class TestLinuxAbstractNamespace(unittest.TestCase):
5278
5279 UNIX_PATH_MAX = 108
5280
5281 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005282 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005283 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5284 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005285 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005286 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5287 s2.connect(s1.getsockname())
5288 with s1.accept()[0] as s3:
5289 self.assertEqual(s1.getsockname(), address)
5290 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005291
5292 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005293 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005294 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5295 s.bind(address)
5296 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005297
5298 def testNameOverflow(self):
5299 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005300 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005301 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005302
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005303 def testStrName(self):
5304 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005305 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5306 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005307 s.bind("\x00python\x00test\x00")
5308 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005309 finally:
5310 s.close()
5311
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005312 def testBytearrayName(self):
5313 # Check that an abstract name can be passed as a bytearray.
5314 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5315 s.bind(bytearray(b"\x00python\x00test\x00"))
5316 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5317
Serhiy Storchaka43767632013-11-03 21:31:38 +02005318@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005319class TestUnixDomain(unittest.TestCase):
5320
5321 def setUp(self):
5322 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5323
5324 def tearDown(self):
5325 self.sock.close()
5326
5327 def encoded(self, path):
5328 # Return the given path encoded in the file system encoding,
5329 # or skip the test if this is not possible.
5330 try:
5331 return os.fsencode(path)
5332 except UnicodeEncodeError:
5333 self.skipTest(
5334 "Pathname {0!a} cannot be represented in file "
5335 "system encoding {1!r}".format(
5336 path, sys.getfilesystemencoding()))
5337
Antoine Pitrou16374872011-12-16 15:04:12 +01005338 def bind(self, sock, path):
5339 # Bind the socket
5340 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005341 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005342 except OSError as e:
5343 if str(e) == "AF_UNIX path too long":
5344 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005345 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005346 .format(path))
5347 else:
5348 raise
5349
Antoine Pitrou495b5022017-05-02 17:20:00 +02005350 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005351 # Issue #30205 (note getsockname() can return None on OS X)
5352 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005353
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005354 def testStrAddr(self):
5355 # Test binding to and retrieving a normal string pathname.
5356 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005357 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005358 self.addCleanup(support.unlink, path)
5359 self.assertEqual(self.sock.getsockname(), path)
5360
5361 def testBytesAddr(self):
5362 # Test binding to a bytes pathname.
5363 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005364 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005365 self.addCleanup(support.unlink, path)
5366 self.assertEqual(self.sock.getsockname(), path)
5367
5368 def testSurrogateescapeBind(self):
5369 # Test binding to a valid non-ASCII pathname, with the
5370 # non-ASCII bytes supplied using surrogateescape encoding.
5371 path = os.path.abspath(support.TESTFN_UNICODE)
5372 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005373 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005374 self.addCleanup(support.unlink, path)
5375 self.assertEqual(self.sock.getsockname(), path)
5376
5377 def testUnencodableAddr(self):
5378 # Test binding to a pathname that cannot be encoded in the
5379 # file system encoding.
5380 if support.TESTFN_UNENCODABLE is None:
5381 self.skipTest("No unencodable filename available")
5382 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005383 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005384 self.addCleanup(support.unlink, path)
5385 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005386
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005387
Thomas Wouters477c8d52006-05-27 19:21:47 +00005388class BufferIOTest(SocketConnectedTest):
5389 """
5390 Test the buffer versions of socket.recv() and socket.send().
5391 """
5392 def __init__(self, methodName='runTest'):
5393 SocketConnectedTest.__init__(self, methodName=methodName)
5394
Antoine Pitrou25480782010-03-17 22:50:28 +00005395 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005396 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005397 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005398 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005399 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005400 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005401 self.assertEqual(msg, MSG)
5402
Antoine Pitrou25480782010-03-17 22:50:28 +00005403 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005404 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005405 self.serv_conn.send(buf)
5406
Antoine Pitrou25480782010-03-17 22:50:28 +00005407 def testRecvIntoBytearray(self):
5408 buf = bytearray(1024)
5409 nbytes = self.cli_conn.recv_into(buf)
5410 self.assertEqual(nbytes, len(MSG))
5411 msg = buf[:len(MSG)]
5412 self.assertEqual(msg, MSG)
5413
5414 _testRecvIntoBytearray = _testRecvIntoArray
5415
5416 def testRecvIntoMemoryview(self):
5417 buf = bytearray(1024)
5418 nbytes = self.cli_conn.recv_into(memoryview(buf))
5419 self.assertEqual(nbytes, len(MSG))
5420 msg = buf[:len(MSG)]
5421 self.assertEqual(msg, MSG)
5422
5423 _testRecvIntoMemoryview = _testRecvIntoArray
5424
5425 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005426 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005427 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005428 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005429 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005430 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005431 self.assertEqual(msg, MSG)
5432
Antoine Pitrou25480782010-03-17 22:50:28 +00005433 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005434 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005435 self.serv_conn.send(buf)
5436
Antoine Pitrou25480782010-03-17 22:50:28 +00005437 def testRecvFromIntoBytearray(self):
5438 buf = bytearray(1024)
5439 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5440 self.assertEqual(nbytes, len(MSG))
5441 msg = buf[:len(MSG)]
5442 self.assertEqual(msg, MSG)
5443
5444 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5445
5446 def testRecvFromIntoMemoryview(self):
5447 buf = bytearray(1024)
5448 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5449 self.assertEqual(nbytes, len(MSG))
5450 msg = buf[:len(MSG)]
5451 self.assertEqual(msg, MSG)
5452
5453 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5454
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005455 def testRecvFromIntoSmallBuffer(self):
5456 # See issue #20246.
5457 buf = bytearray(8)
5458 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5459
5460 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005461 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005462
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005463 def testRecvFromIntoEmptyBuffer(self):
5464 buf = bytearray()
5465 self.cli_conn.recvfrom_into(buf)
5466 self.cli_conn.recvfrom_into(buf, 0)
5467
5468 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5469
Christian Heimes043d6f62008-01-07 17:19:16 +00005470
5471TIPC_STYPE = 2000
5472TIPC_LOWER = 200
5473TIPC_UPPER = 210
5474
5475def isTipcAvailable():
5476 """Check if the TIPC module is loaded
5477
5478 The TIPC module is not loaded automatically on Ubuntu and probably
5479 other Linux distros.
5480 """
5481 if not hasattr(socket, "AF_TIPC"):
5482 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005483 try:
5484 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005485 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005486 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005487 # have not the permission to read it.
5488 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005489 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005490 for line in f:
5491 if line.startswith("tipc "):
5492 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005493 return False
5494
Serhiy Storchaka43767632013-11-03 21:31:38 +02005495@unittest.skipUnless(isTipcAvailable(),
5496 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005497class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005498 def testRDM(self):
5499 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5500 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005501 self.addCleanup(srv.close)
5502 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005503
5504 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5505 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5506 TIPC_LOWER, TIPC_UPPER)
5507 srv.bind(srvaddr)
5508
5509 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5510 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5511 cli.sendto(MSG, sendaddr)
5512
5513 msg, recvaddr = srv.recvfrom(1024)
5514
5515 self.assertEqual(cli.getsockname(), recvaddr)
5516 self.assertEqual(msg, MSG)
5517
5518
Serhiy Storchaka43767632013-11-03 21:31:38 +02005519@unittest.skipUnless(isTipcAvailable(),
5520 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005521class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005522 def __init__(self, methodName = 'runTest'):
5523 unittest.TestCase.__init__(self, methodName = methodName)
5524 ThreadableTest.__init__(self)
5525
5526 def setUp(self):
5527 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005528 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005529 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5530 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5531 TIPC_LOWER, TIPC_UPPER)
5532 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005533 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005534 self.serverExplicitReady()
5535 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005536 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005537
5538 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005539 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005540 # accept() call; sleep a little while to avoid it, otherwise
5541 # we could get an exception
5542 time.sleep(0.1)
5543 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005544 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005545 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5546 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5547 self.cli.connect(addr)
5548 self.cliaddr = self.cli.getsockname()
5549
5550 def testStream(self):
5551 msg = self.conn.recv(1024)
5552 self.assertEqual(msg, MSG)
5553 self.assertEqual(self.cliaddr, self.connaddr)
5554
5555 def _testStream(self):
5556 self.cli.send(MSG)
5557 self.cli.close()
5558
5559
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005560class ContextManagersTest(ThreadedTCPSocketTest):
5561
5562 def _testSocketClass(self):
5563 # base test
5564 with socket.socket() as sock:
5565 self.assertFalse(sock._closed)
5566 self.assertTrue(sock._closed)
5567 # close inside with block
5568 with socket.socket() as sock:
5569 sock.close()
5570 self.assertTrue(sock._closed)
5571 # exception inside with block
5572 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005573 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005574 self.assertTrue(sock._closed)
5575
5576 def testCreateConnectionBase(self):
5577 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005578 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005579 data = conn.recv(1024)
5580 conn.sendall(data)
5581
5582 def _testCreateConnectionBase(self):
5583 address = self.serv.getsockname()
5584 with socket.create_connection(address) as sock:
5585 self.assertFalse(sock._closed)
5586 sock.sendall(b'foo')
5587 self.assertEqual(sock.recv(1024), b'foo')
5588 self.assertTrue(sock._closed)
5589
5590 def testCreateConnectionClose(self):
5591 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005592 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005593 data = conn.recv(1024)
5594 conn.sendall(data)
5595
5596 def _testCreateConnectionClose(self):
5597 address = self.serv.getsockname()
5598 with socket.create_connection(address) as sock:
5599 sock.close()
5600 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005601 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005602
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005603
Victor Stinnerdaf45552013-08-28 00:53:59 +02005604class InheritanceTest(unittest.TestCase):
5605 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5606 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005607 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005608 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005609 with socket.socket(socket.AF_INET,
5610 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005611 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005612 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005613
5614 def test_default_inheritable(self):
5615 sock = socket.socket()
5616 with sock:
5617 self.assertEqual(sock.get_inheritable(), False)
5618
5619 def test_dup(self):
5620 sock = socket.socket()
5621 with sock:
5622 newsock = sock.dup()
5623 sock.close()
5624 with newsock:
5625 self.assertEqual(newsock.get_inheritable(), False)
5626
5627 def test_set_inheritable(self):
5628 sock = socket.socket()
5629 with sock:
5630 sock.set_inheritable(True)
5631 self.assertEqual(sock.get_inheritable(), True)
5632
5633 sock.set_inheritable(False)
5634 self.assertEqual(sock.get_inheritable(), False)
5635
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005636 @unittest.skipIf(fcntl is None, "need fcntl")
5637 def test_get_inheritable_cloexec(self):
5638 sock = socket.socket()
5639 with sock:
5640 fd = sock.fileno()
5641 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005642
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005643 # clear FD_CLOEXEC flag
5644 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5645 flags &= ~fcntl.FD_CLOEXEC
5646 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005647
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005648 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005649
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005650 @unittest.skipIf(fcntl is None, "need fcntl")
5651 def test_set_inheritable_cloexec(self):
5652 sock = socket.socket()
5653 with sock:
5654 fd = sock.fileno()
5655 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5656 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005657
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005658 sock.set_inheritable(True)
5659 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5660 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005661
5662
Victor Stinnerdaf45552013-08-28 00:53:59 +02005663 def test_socketpair(self):
5664 s1, s2 = socket.socketpair()
5665 self.addCleanup(s1.close)
5666 self.addCleanup(s2.close)
5667 self.assertEqual(s1.get_inheritable(), False)
5668 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005669
5670
5671@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5672 "SOCK_NONBLOCK not defined")
5673class NonblockConstantTest(unittest.TestCase):
5674 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5675 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005676 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005677 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005678 self.assertTrue(
5679 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005680 if timeout == 0:
5681 # timeout == 0: means that getblocking() must be False.
5682 self.assertFalse(s.getblocking())
5683 else:
5684 # If timeout > 0, the socket will be in a "blocking" mode
5685 # from the standpoint of the Python API. For Python socket
5686 # object, "blocking" means that operations like 'sock.recv()'
5687 # will block. Internally, file descriptors for
5688 # "blocking" Python sockets *with timeouts* are in a
5689 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5690 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5691 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005692 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005693 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005694 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005695 self.assertFalse(
5696 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005697 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005698
Charles-François Natali239bb962011-06-03 12:55:15 +02005699 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005700 def test_SOCK_NONBLOCK(self):
5701 # a lot of it seems silly and redundant, but I wanted to test that
5702 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005703 with socket.socket(socket.AF_INET,
5704 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5705 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005706 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005707 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005708 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005709 self.checkNonblock(s)
5710 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005711 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005712 s.settimeout(2.0)
5713 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005714 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005715 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005716 # defaulttimeout
5717 t = socket.getdefaulttimeout()
5718 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005719 with socket.socket() as s:
5720 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005721 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005722 with socket.socket() as s:
5723 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005724 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005725 with socket.socket() as s:
5726 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005727 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005728 with socket.socket() as s:
5729 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005730 socket.setdefaulttimeout(t)
5731
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005732
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005733@unittest.skipUnless(os.name == "nt", "Windows specific")
5734@unittest.skipUnless(multiprocessing, "need multiprocessing")
5735class TestSocketSharing(SocketTCPTest):
5736 # This must be classmethod and not staticmethod or multiprocessing
5737 # won't be able to bootstrap it.
5738 @classmethod
5739 def remoteProcessServer(cls, q):
5740 # Recreate socket from shared data
5741 sdata = q.get()
5742 message = q.get()
5743
5744 s = socket.fromshare(sdata)
5745 s2, c = s.accept()
5746
5747 # Send the message
5748 s2.sendall(message)
5749 s2.close()
5750 s.close()
5751
5752 def testShare(self):
5753 # Transfer the listening server socket to another process
5754 # and service it from there.
5755
5756 # Create process:
5757 q = multiprocessing.Queue()
5758 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5759 p.start()
5760
5761 # Get the shared socket data
5762 data = self.serv.share(p.pid)
5763
5764 # Pass the shared socket to the other process
5765 addr = self.serv.getsockname()
5766 self.serv.close()
5767 q.put(data)
5768
5769 # The data that the server will send us
5770 message = b"slapmahfro"
5771 q.put(message)
5772
5773 # Connect
5774 s = socket.create_connection(addr)
5775 # listen for the data
5776 m = []
5777 while True:
5778 data = s.recv(100)
5779 if not data:
5780 break
5781 m.append(data)
5782 s.close()
5783 received = b"".join(m)
5784 self.assertEqual(received, message)
5785 p.join()
5786
5787 def testShareLength(self):
5788 data = self.serv.share(os.getpid())
5789 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5790 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5791
5792 def compareSockets(self, org, other):
5793 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005794 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005795 self.assertEqual(org.gettimeout(), None)
5796 self.assertEqual(org.gettimeout(), other.gettimeout())
5797
5798 self.assertEqual(org.family, other.family)
5799 self.assertEqual(org.type, other.type)
5800 # If the user specified "0" for proto, then
5801 # internally windows will have picked the correct value.
5802 # Python introspection on the socket however will still return
5803 # 0. For the shared socket, the python value is recreated
5804 # from the actual value, so it may not compare correctly.
5805 if org.proto != 0:
5806 self.assertEqual(org.proto, other.proto)
5807
5808 def testShareLocal(self):
5809 data = self.serv.share(os.getpid())
5810 s = socket.fromshare(data)
5811 try:
5812 self.compareSockets(self.serv, s)
5813 finally:
5814 s.close()
5815
5816 def testTypes(self):
5817 families = [socket.AF_INET, socket.AF_INET6]
5818 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5819 for f in families:
5820 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005821 try:
5822 source = socket.socket(f, t)
5823 except OSError:
5824 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005825 try:
5826 data = source.share(os.getpid())
5827 shared = socket.fromshare(data)
5828 try:
5829 self.compareSockets(source, shared)
5830 finally:
5831 shared.close()
5832 finally:
5833 source.close()
5834
5835
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005836class SendfileUsingSendTest(ThreadedTCPSocketTest):
5837 """
5838 Test the send() implementation of socket.sendfile().
5839 """
5840
Victor Stinner8c663fd2017-11-08 14:44:44 -08005841 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005842 BUFSIZE = 8192
5843 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005844 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005845
5846 @classmethod
5847 def setUpClass(cls):
5848 def chunks(total, step):
5849 assert total >= step
5850 while total > step:
5851 yield step
5852 total -= step
5853 if total:
5854 yield total
5855
5856 chunk = b"".join([random.choice(string.ascii_letters).encode()
5857 for i in range(cls.BUFSIZE)])
5858 with open(support.TESTFN, 'wb') as f:
5859 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5860 f.write(chunk)
5861 with open(support.TESTFN, 'rb') as f:
5862 cls.FILEDATA = f.read()
5863 assert len(cls.FILEDATA) == cls.FILESIZE
5864
5865 @classmethod
5866 def tearDownClass(cls):
5867 support.unlink(support.TESTFN)
5868
5869 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005870 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005871 conn, addr = self.serv.accept()
5872 conn.settimeout(self.TIMEOUT)
5873 self.addCleanup(conn.close)
5874 return conn
5875
5876 def recv_data(self, conn):
5877 received = []
5878 while True:
5879 chunk = conn.recv(self.BUFSIZE)
5880 if not chunk:
5881 break
5882 received.append(chunk)
5883 return b''.join(received)
5884
5885 def meth_from_sock(self, sock):
5886 # Depending on the mixin class being run return either send()
5887 # or sendfile() method implementation.
5888 return getattr(sock, "_sendfile_use_send")
5889
5890 # regular file
5891
5892 def _testRegularFile(self):
5893 address = self.serv.getsockname()
5894 file = open(support.TESTFN, 'rb')
5895 with socket.create_connection(address) as sock, file as file:
5896 meth = self.meth_from_sock(sock)
5897 sent = meth(file)
5898 self.assertEqual(sent, self.FILESIZE)
5899 self.assertEqual(file.tell(), self.FILESIZE)
5900
5901 def testRegularFile(self):
5902 conn = self.accept_conn()
5903 data = self.recv_data(conn)
5904 self.assertEqual(len(data), self.FILESIZE)
5905 self.assertEqual(data, self.FILEDATA)
5906
5907 # non regular file
5908
5909 def _testNonRegularFile(self):
5910 address = self.serv.getsockname()
5911 file = io.BytesIO(self.FILEDATA)
5912 with socket.create_connection(address) as sock, file as file:
5913 sent = sock.sendfile(file)
5914 self.assertEqual(sent, self.FILESIZE)
5915 self.assertEqual(file.tell(), self.FILESIZE)
5916 self.assertRaises(socket._GiveupOnSendfile,
5917 sock._sendfile_use_sendfile, file)
5918
5919 def testNonRegularFile(self):
5920 conn = self.accept_conn()
5921 data = self.recv_data(conn)
5922 self.assertEqual(len(data), self.FILESIZE)
5923 self.assertEqual(data, self.FILEDATA)
5924
5925 # empty file
5926
5927 def _testEmptyFileSend(self):
5928 address = self.serv.getsockname()
5929 filename = support.TESTFN + "2"
5930 with open(filename, 'wb'):
5931 self.addCleanup(support.unlink, filename)
5932 file = open(filename, 'rb')
5933 with socket.create_connection(address) as sock, file as file:
5934 meth = self.meth_from_sock(sock)
5935 sent = meth(file)
5936 self.assertEqual(sent, 0)
5937 self.assertEqual(file.tell(), 0)
5938
5939 def testEmptyFileSend(self):
5940 conn = self.accept_conn()
5941 data = self.recv_data(conn)
5942 self.assertEqual(data, b"")
5943
5944 # offset
5945
5946 def _testOffset(self):
5947 address = self.serv.getsockname()
5948 file = open(support.TESTFN, 'rb')
5949 with socket.create_connection(address) as sock, file as file:
5950 meth = self.meth_from_sock(sock)
5951 sent = meth(file, offset=5000)
5952 self.assertEqual(sent, self.FILESIZE - 5000)
5953 self.assertEqual(file.tell(), self.FILESIZE)
5954
5955 def testOffset(self):
5956 conn = self.accept_conn()
5957 data = self.recv_data(conn)
5958 self.assertEqual(len(data), self.FILESIZE - 5000)
5959 self.assertEqual(data, self.FILEDATA[5000:])
5960
5961 # count
5962
5963 def _testCount(self):
5964 address = self.serv.getsockname()
5965 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01005966 sock = socket.create_connection(address,
5967 timeout=support.LOOPBACK_TIMEOUT)
5968 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005969 count = 5000007
5970 meth = self.meth_from_sock(sock)
5971 sent = meth(file, count=count)
5972 self.assertEqual(sent, count)
5973 self.assertEqual(file.tell(), count)
5974
5975 def testCount(self):
5976 count = 5000007
5977 conn = self.accept_conn()
5978 data = self.recv_data(conn)
5979 self.assertEqual(len(data), count)
5980 self.assertEqual(data, self.FILEDATA[:count])
5981
5982 # count small
5983
5984 def _testCountSmall(self):
5985 address = self.serv.getsockname()
5986 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01005987 sock = socket.create_connection(address,
5988 timeout=support.LOOPBACK_TIMEOUT)
5989 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005990 count = 1
5991 meth = self.meth_from_sock(sock)
5992 sent = meth(file, count=count)
5993 self.assertEqual(sent, count)
5994 self.assertEqual(file.tell(), count)
5995
5996 def testCountSmall(self):
5997 count = 1
5998 conn = self.accept_conn()
5999 data = self.recv_data(conn)
6000 self.assertEqual(len(data), count)
6001 self.assertEqual(data, self.FILEDATA[:count])
6002
6003 # count + offset
6004
6005 def _testCountWithOffset(self):
6006 address = self.serv.getsockname()
6007 file = open(support.TESTFN, 'rb')
6008 with socket.create_connection(address, timeout=2) as sock, file as file:
6009 count = 100007
6010 meth = self.meth_from_sock(sock)
6011 sent = meth(file, offset=2007, count=count)
6012 self.assertEqual(sent, count)
6013 self.assertEqual(file.tell(), count + 2007)
6014
6015 def testCountWithOffset(self):
6016 count = 100007
6017 conn = self.accept_conn()
6018 data = self.recv_data(conn)
6019 self.assertEqual(len(data), count)
6020 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6021
6022 # non blocking sockets are not supposed to work
6023
6024 def _testNonBlocking(self):
6025 address = self.serv.getsockname()
6026 file = open(support.TESTFN, 'rb')
6027 with socket.create_connection(address) as sock, file as file:
6028 sock.setblocking(False)
6029 meth = self.meth_from_sock(sock)
6030 self.assertRaises(ValueError, meth, file)
6031 self.assertRaises(ValueError, sock.sendfile, file)
6032
6033 def testNonBlocking(self):
6034 conn = self.accept_conn()
6035 if conn.recv(8192):
6036 self.fail('was not supposed to receive any data')
6037
6038 # timeout (non-triggered)
6039
6040 def _testWithTimeout(self):
6041 address = self.serv.getsockname()
6042 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006043 sock = socket.create_connection(address,
6044 timeout=support.LOOPBACK_TIMEOUT)
6045 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006046 meth = self.meth_from_sock(sock)
6047 sent = meth(file)
6048 self.assertEqual(sent, self.FILESIZE)
6049
6050 def testWithTimeout(self):
6051 conn = self.accept_conn()
6052 data = self.recv_data(conn)
6053 self.assertEqual(len(data), self.FILESIZE)
6054 self.assertEqual(data, self.FILEDATA)
6055
6056 # timeout (triggered)
6057
6058 def _testWithTimeoutTriggeredSend(self):
6059 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006060 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006061 with socket.create_connection(address) as sock:
6062 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006063 meth = self.meth_from_sock(sock)
6064 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006065
6066 def testWithTimeoutTriggeredSend(self):
6067 conn = self.accept_conn()
6068 conn.recv(88192)
6069
6070 # errors
6071
6072 def _test_errors(self):
6073 pass
6074
6075 def test_errors(self):
6076 with open(support.TESTFN, 'rb') as file:
6077 with socket.socket(type=socket.SOCK_DGRAM) as s:
6078 meth = self.meth_from_sock(s)
6079 self.assertRaisesRegex(
6080 ValueError, "SOCK_STREAM", meth, file)
6081 with open(support.TESTFN, 'rt') as file:
6082 with socket.socket() as s:
6083 meth = self.meth_from_sock(s)
6084 self.assertRaisesRegex(
6085 ValueError, "binary mode", meth, file)
6086 with open(support.TESTFN, 'rb') as file:
6087 with socket.socket() as s:
6088 meth = self.meth_from_sock(s)
6089 self.assertRaisesRegex(TypeError, "positive integer",
6090 meth, file, count='2')
6091 self.assertRaisesRegex(TypeError, "positive integer",
6092 meth, file, count=0.1)
6093 self.assertRaisesRegex(ValueError, "positive integer",
6094 meth, file, count=0)
6095 self.assertRaisesRegex(ValueError, "positive integer",
6096 meth, file, count=-1)
6097
6098
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006099@unittest.skipUnless(hasattr(os, "sendfile"),
6100 'os.sendfile() required for this test.')
6101class SendfileUsingSendfileTest(SendfileUsingSendTest):
6102 """
6103 Test the sendfile() implementation of socket.sendfile().
6104 """
6105 def meth_from_sock(self, sock):
6106 return getattr(sock, "_sendfile_use_sendfile")
6107
Christian Heimes48371412016-09-06 00:37:46 +02006108
6109@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006110class LinuxKernelCryptoAPI(unittest.TestCase):
6111 # tests for AF_ALG
6112 def create_alg(self, typ, name):
6113 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006114 try:
6115 sock.bind((typ, name))
6116 except FileNotFoundError as e:
6117 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006118 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006119 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006120 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006121 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006122
Victor Stinner86afc1f2017-11-30 13:58:43 +01006123 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6124 # at least on ppc64le architecture
6125 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006126 def test_sha256(self):
6127 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6128 "177a9cb410ff61f20015ad")
6129 with self.create_alg('hash', 'sha256') as algo:
6130 op, _ = algo.accept()
6131 with op:
6132 op.sendall(b"abc")
6133 self.assertEqual(op.recv(512), expected)
6134
6135 op, _ = algo.accept()
6136 with op:
6137 op.send(b'a', socket.MSG_MORE)
6138 op.send(b'b', socket.MSG_MORE)
6139 op.send(b'c', socket.MSG_MORE)
6140 op.send(b'')
6141 self.assertEqual(op.recv(512), expected)
6142
6143 def test_hmac_sha1(self):
6144 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6145 with self.create_alg('hash', 'hmac(sha1)') as algo:
6146 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6147 op, _ = algo.accept()
6148 with op:
6149 op.sendall(b"what do ya want for nothing?")
6150 self.assertEqual(op.recv(512), expected)
6151
Christian Heimese084f842016-09-11 20:11:30 +02006152 # Although it should work with 3.19 and newer the test blocks on
6153 # Ubuntu 15.10 with Kernel 4.2.0-19.
6154 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006155 def test_aes_cbc(self):
6156 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6157 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6158 msg = b"Single block msg"
6159 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6160 msglen = len(msg)
6161 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6162 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6163 op, _ = algo.accept()
6164 with op:
6165 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6166 flags=socket.MSG_MORE)
6167 op.sendall(msg)
6168 self.assertEqual(op.recv(msglen), ciphertext)
6169
6170 op, _ = algo.accept()
6171 with op:
6172 op.sendmsg_afalg([ciphertext],
6173 op=socket.ALG_OP_DECRYPT, iv=iv)
6174 self.assertEqual(op.recv(msglen), msg)
6175
6176 # long message
6177 multiplier = 1024
6178 longmsg = [msg] * multiplier
6179 op, _ = algo.accept()
6180 with op:
6181 op.sendmsg_afalg(longmsg,
6182 op=socket.ALG_OP_ENCRYPT, iv=iv)
6183 enc = op.recv(msglen * multiplier)
6184 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006185 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006186
6187 op, _ = algo.accept()
6188 with op:
6189 op.sendmsg_afalg([enc],
6190 op=socket.ALG_OP_DECRYPT, iv=iv)
6191 dec = op.recv(msglen * multiplier)
6192 self.assertEqual(len(dec), msglen * multiplier)
6193 self.assertEqual(dec, msg * multiplier)
6194
matejcik9764c152017-02-16 14:41:31 +01006195 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006196 def test_aead_aes_gcm(self):
6197 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6198 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6199 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6200 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6201 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6202 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6203
6204 taglen = len(expected_tag)
6205 assoclen = len(assoc)
6206
6207 with self.create_alg('aead', 'gcm(aes)') as algo:
6208 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6209 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6210 None, taglen)
6211
6212 # send assoc, plain and tag buffer in separate steps
6213 op, _ = algo.accept()
6214 with op:
6215 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6216 assoclen=assoclen, flags=socket.MSG_MORE)
6217 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006218 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006219 res = op.recv(assoclen + len(plain) + taglen)
6220 self.assertEqual(expected_ct, res[assoclen:-taglen])
6221 self.assertEqual(expected_tag, res[-taglen:])
6222
6223 # now with msg
6224 op, _ = algo.accept()
6225 with op:
matejcik9764c152017-02-16 14:41:31 +01006226 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006227 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6228 assoclen=assoclen)
6229 res = op.recv(assoclen + len(plain) + taglen)
6230 self.assertEqual(expected_ct, res[assoclen:-taglen])
6231 self.assertEqual(expected_tag, res[-taglen:])
6232
6233 # create anc data manually
6234 pack_uint32 = struct.Struct('I').pack
6235 op, _ = algo.accept()
6236 with op:
matejcik9764c152017-02-16 14:41:31 +01006237 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006238 op.sendmsg(
6239 [msg],
6240 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6241 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6242 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6243 )
6244 )
matejcik9764c152017-02-16 14:41:31 +01006245 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006246 self.assertEqual(expected_ct, res[assoclen:-taglen])
6247 self.assertEqual(expected_tag, res[-taglen:])
6248
6249 # decrypt and verify
6250 op, _ = algo.accept()
6251 with op:
6252 msg = assoc + expected_ct + expected_tag
6253 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6254 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006255 res = op.recv(len(msg) - taglen)
6256 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006257
Christian Heimese084f842016-09-11 20:11:30 +02006258 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006259 def test_drbg_pr_sha256(self):
6260 # deterministic random bit generator, prediction resistance, sha256
6261 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6262 extra_seed = os.urandom(32)
6263 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6264 op, _ = algo.accept()
6265 with op:
6266 rn = op.recv(32)
6267 self.assertEqual(len(rn), 32)
6268
6269 def test_sendmsg_afalg_args(self):
6270 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006271 with sock:
6272 with self.assertRaises(TypeError):
6273 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006274
Christian Heimes02b30352016-09-11 19:49:56 +02006275 with self.assertRaises(TypeError):
6276 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006277
Christian Heimes02b30352016-09-11 19:49:56 +02006278 with self.assertRaises(TypeError):
6279 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006280
Christian Heimes02b30352016-09-11 19:49:56 +02006281 with self.assertRaises(TypeError):
6282 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006283
Christian Heimes02b30352016-09-11 19:49:56 +02006284 with self.assertRaises(TypeError):
6285 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6286
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006287 def test_length_restriction(self):
6288 # bpo-35050, off-by-one error in length check
6289 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6290 self.addCleanup(sock.close)
6291
6292 # salg_type[14]
6293 with self.assertRaises(FileNotFoundError):
6294 sock.bind(("t" * 13, "name"))
6295 with self.assertRaisesRegex(ValueError, "type too long"):
6296 sock.bind(("t" * 14, "name"))
6297
6298 # salg_name[64]
6299 with self.assertRaises(FileNotFoundError):
6300 sock.bind(("type", "n" * 63))
6301 with self.assertRaisesRegex(ValueError, "name too long"):
6302 sock.bind(("type", "n" * 64))
6303
6304
animalize19e7d482018-02-27 02:10:36 +08006305@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6306class TestMSWindowsTCPFlags(unittest.TestCase):
6307 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006308 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006309 'TCP_MAXSEG',
6310 'TCP_NODELAY',
6311 # available starting with Windows 10 1607
6312 'TCP_FASTOPEN',
6313 # available starting with Windows 10 1703
6314 'TCP_KEEPCNT',
6315 # available starting with Windows 10 1709
6316 'TCP_KEEPIDLE',
6317 'TCP_KEEPINTVL'
6318 }
6319
6320 def test_new_tcp_flags(self):
6321 provided = [s for s in dir(socket) if s.startswith('TCP')]
6322 unknown = [s for s in provided if s not in self.knownTCPFlags]
6323
6324 self.assertEqual([], unknown,
6325 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006326
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006327
6328class CreateServerTest(unittest.TestCase):
6329
6330 def test_address(self):
6331 port = support.find_unused_port()
6332 with socket.create_server(("127.0.0.1", port)) as sock:
6333 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6334 self.assertEqual(sock.getsockname()[1], port)
6335 if support.IPV6_ENABLED:
6336 with socket.create_server(("::1", port),
6337 family=socket.AF_INET6) as sock:
6338 self.assertEqual(sock.getsockname()[0], "::1")
6339 self.assertEqual(sock.getsockname()[1], port)
6340
6341 def test_family_and_type(self):
6342 with socket.create_server(("127.0.0.1", 0)) as sock:
6343 self.assertEqual(sock.family, socket.AF_INET)
6344 self.assertEqual(sock.type, socket.SOCK_STREAM)
6345 if support.IPV6_ENABLED:
6346 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6347 self.assertEqual(s.family, socket.AF_INET6)
6348 self.assertEqual(sock.type, socket.SOCK_STREAM)
6349
6350 def test_reuse_port(self):
6351 if not hasattr(socket, "SO_REUSEPORT"):
6352 with self.assertRaises(ValueError):
6353 socket.create_server(("localhost", 0), reuse_port=True)
6354 else:
6355 with socket.create_server(("localhost", 0)) as sock:
6356 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6357 self.assertEqual(opt, 0)
6358 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6359 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6360 self.assertNotEqual(opt, 0)
6361
6362 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6363 not hasattr(_socket, 'IPV6_V6ONLY'),
6364 "IPV6_V6ONLY option not supported")
6365 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6366 def test_ipv6_only_default(self):
6367 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6368 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6369
6370 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6371 "dualstack_ipv6 not supported")
6372 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6373 def test_dualstack_ipv6_family(self):
6374 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6375 dualstack_ipv6=True) as sock:
6376 self.assertEqual(sock.family, socket.AF_INET6)
6377
6378
6379class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006380 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006381
6382 def setUp(self):
6383 self.thread = None
6384
6385 def tearDown(self):
6386 if self.thread is not None:
6387 self.thread.join(self.timeout)
6388
6389 def echo_server(self, sock):
6390 def run(sock):
6391 with sock:
6392 conn, _ = sock.accept()
6393 with conn:
6394 event.wait(self.timeout)
6395 msg = conn.recv(1024)
6396 if not msg:
6397 return
6398 conn.sendall(msg)
6399
6400 event = threading.Event()
6401 sock.settimeout(self.timeout)
6402 self.thread = threading.Thread(target=run, args=(sock, ))
6403 self.thread.start()
6404 event.set()
6405
6406 def echo_client(self, addr, family):
6407 with socket.socket(family=family) as sock:
6408 sock.settimeout(self.timeout)
6409 sock.connect(addr)
6410 sock.sendall(b'foo')
6411 self.assertEqual(sock.recv(1024), b'foo')
6412
6413 def test_tcp4(self):
6414 port = support.find_unused_port()
6415 with socket.create_server(("", port)) as sock:
6416 self.echo_server(sock)
6417 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6418
6419 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6420 def test_tcp6(self):
6421 port = support.find_unused_port()
6422 with socket.create_server(("", port),
6423 family=socket.AF_INET6) as sock:
6424 self.echo_server(sock)
6425 self.echo_client(("::1", port), socket.AF_INET6)
6426
6427 # --- dual stack tests
6428
6429 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6430 "dualstack_ipv6 not supported")
6431 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6432 def test_dual_stack_client_v4(self):
6433 port = support.find_unused_port()
6434 with socket.create_server(("", port), family=socket.AF_INET6,
6435 dualstack_ipv6=True) as sock:
6436 self.echo_server(sock)
6437 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6438
6439 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6440 "dualstack_ipv6 not supported")
6441 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6442 def test_dual_stack_client_v6(self):
6443 port = support.find_unused_port()
6444 with socket.create_server(("", port), family=socket.AF_INET6,
6445 dualstack_ipv6=True) as sock:
6446 self.echo_server(sock)
6447 self.echo_client(("::1", port), socket.AF_INET6)
6448
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006449@requireAttrs(socket, "send_fds")
6450@requireAttrs(socket, "recv_fds")
6451@requireAttrs(socket, "AF_UNIX")
6452class SendRecvFdsTests(unittest.TestCase):
6453 def testSendAndRecvFds(self):
6454 def close_pipes(pipes):
6455 for fd1, fd2 in pipes:
6456 os.close(fd1)
6457 os.close(fd2)
6458
6459 def close_fds(fds):
6460 for fd in fds:
6461 os.close(fd)
6462
6463 # send 10 file descriptors
6464 pipes = [os.pipe() for _ in range(10)]
6465 self.addCleanup(close_pipes, pipes)
6466 fds = [rfd for rfd, wfd in pipes]
6467
6468 # use a UNIX socket pair to exchange file descriptors locally
6469 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6470 with sock1, sock2:
6471 socket.send_fds(sock1, [MSG], fds)
6472 # request more data and file descriptors than expected
6473 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6474 self.addCleanup(close_fds, fds2)
6475
6476 self.assertEqual(msg, MSG)
6477 self.assertEqual(len(fds2), len(fds))
6478 self.assertEqual(flags, 0)
6479 # don't test addr
6480
6481 # test that file descriptors are connected
6482 for index, fds in enumerate(pipes):
6483 rfd, wfd = fds
6484 os.write(wfd, str(index).encode())
6485
6486 for index, rfd in enumerate(fds2):
6487 data = os.read(rfd, 100)
6488 self.assertEqual(data, str(index).encode())
6489
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006490
Guido van Rossumb995eb72002-07-31 16:08:40 +00006491def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006492 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006493 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006494 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6495 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006496
6497 tests.extend([
6498 NonBlockingTCPTests,
6499 FileObjectClassTestCase,
6500 UnbufferedFileObjectClassTestCase,
6501 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006502 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006503 UnicodeReadFileObjectClassTestCase,
6504 UnicodeWriteFileObjectClassTestCase,
6505 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006506 NetworkConnectionNoServer,
6507 NetworkConnectionAttributesTest,
6508 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006509 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006510 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006511 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006512 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006513 tests.append(BasicSocketPairTest)
6514 tests.append(TestUnixDomain)
6515 tests.append(TestLinuxAbstractNamespace)
6516 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006517 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006518 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006519 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006520 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006521 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006522 BasicVSOCKTest,
6523 ThreadedVSOCKSocketStreamTest,
6524 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006525 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006526 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006527 CmsgMacroTests,
6528 SendmsgUDPTest,
6529 RecvmsgUDPTest,
6530 RecvmsgIntoUDPTest,
6531 SendmsgUDP6Test,
6532 RecvmsgUDP6Test,
6533 RecvmsgRFC3542AncillaryUDP6Test,
6534 RecvmsgIntoRFC3542AncillaryUDP6Test,
6535 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006536 SendmsgUDPLITETest,
6537 RecvmsgUDPLITETest,
6538 RecvmsgIntoUDPLITETest,
6539 SendmsgUDPLITE6Test,
6540 RecvmsgUDPLITE6Test,
6541 RecvmsgRFC3542AncillaryUDPLITE6Test,
6542 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6543 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006544 SendmsgTCPTest,
6545 RecvmsgTCPTest,
6546 RecvmsgIntoTCPTest,
6547 SendmsgSCTPStreamTest,
6548 RecvmsgSCTPStreamTest,
6549 RecvmsgIntoSCTPStreamTest,
6550 SendmsgUnixStreamTest,
6551 RecvmsgUnixStreamTest,
6552 RecvmsgIntoUnixStreamTest,
6553 RecvmsgSCMRightsStreamTest,
6554 RecvmsgIntoSCMRightsStreamTest,
6555 # These are slow when setitimer() is not available
6556 InterruptedRecvTimeoutTest,
6557 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006558 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006559 SendfileUsingSendTest,
6560 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006561 ])
animalize19e7d482018-02-27 02:10:36 +08006562 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006563
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006564 thread_info = support.threading_setup()
6565 support.run_unittest(*tests)
6566 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006567
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006568
Guido van Rossum24e4af82002-06-12 19:18:08 +00006569if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006570 test_main()