blob: 64e95ea34b99730688eff599520cebb1709ed482 [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
52 try:
53 with open("/dev/vsock", "rb") as f:
54 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
55 except OSError:
56 return None
57 else:
58 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000059
Charles-François Natali47413c12011-10-06 19:47:44 +020060def _have_socket_can():
61 """Check whether CAN sockets are supported on this host."""
62 try:
63 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020064 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020065 return False
66 else:
67 s.close()
68 return True
69
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040070def _have_socket_can_isotp():
71 """Check whether CAN ISOTP sockets are supported on this host."""
72 try:
73 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
74 except (AttributeError, OSError):
75 return False
76 else:
77 s.close()
78 return True
79
Charles-François Natali10b8cf42011-11-10 19:21:37 +010080def _have_socket_rds():
81 """Check whether RDS sockets are supported on this host."""
82 try:
83 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
84 except (AttributeError, OSError):
85 return False
86 else:
87 s.close()
88 return True
89
Christian Heimes48371412016-09-06 00:37:46 +020090def _have_socket_alg():
91 """Check whether AF_ALG sockets are supported on this host."""
92 try:
93 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
94 except (AttributeError, OSError):
95 return False
96 else:
97 s.close()
98 return True
99
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700100def _have_socket_qipcrtr():
101 """Check whether AF_QIPCRTR sockets are supported on this host."""
102 try:
103 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
104 except (AttributeError, OSError):
105 return False
106 else:
107 s.close()
108 return True
109
caaveryeffc12f2017-09-06 18:18:10 -0400110def _have_socket_vsock():
111 """Check whether AF_VSOCK sockets are supported on this host."""
112 ret = get_cid() is not None
113 return ret
114
Yury Selivanovf11b4602018-01-28 17:27:38 -0500115
Greg Bowser8fbece12019-08-02 16:29:52 -0400116def _have_socket_bluetooth():
117 """Check whether AF_BLUETOOTH sockets are supported on this host."""
118 try:
119 # RFCOMM is supported by all platforms with bluetooth support. Windows
120 # does not support omitting the protocol.
121 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
122 except (AttributeError, OSError):
123 return False
124 else:
125 s.close()
126 return True
127
128
Victor Stinner304315d2018-11-30 13:22:44 +0100129@contextlib.contextmanager
130def socket_setdefaulttimeout(timeout):
131 old_timeout = socket.getdefaulttimeout()
132 try:
133 socket.setdefaulttimeout(timeout)
134 yield
135 finally:
136 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500137
138
Charles-François Natali47413c12011-10-06 19:47:44 +0200139HAVE_SOCKET_CAN = _have_socket_can()
140
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400141HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
142
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100143HAVE_SOCKET_RDS = _have_socket_rds()
144
Christian Heimes48371412016-09-06 00:37:46 +0200145HAVE_SOCKET_ALG = _have_socket_alg()
146
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700147HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
148
caaveryeffc12f2017-09-06 18:18:10 -0400149HAVE_SOCKET_VSOCK = _have_socket_vsock()
150
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700151HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
152
Greg Bowser8fbece12019-08-02 16:29:52 -0400153HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
154
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000155# Size in bytes of the int type
156SIZEOF_INT = array.array("i").itemsize
157
Guido van Rossum24e4af82002-06-12 19:18:08 +0000158class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000159
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 def setUp(self):
161 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000162 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100163 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000164
Guido van Rossum24e4af82002-06-12 19:18:08 +0000165 def tearDown(self):
166 self.serv.close()
167 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000168
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169class SocketUDPTest(unittest.TestCase):
170
171 def setUp(self):
172 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000173 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000174
175 def tearDown(self):
176 self.serv.close()
177 self.serv = None
178
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700179class SocketUDPLITETest(SocketUDPTest):
180
181 def setUp(self):
182 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
183 self.port = support.bind_port(self.serv)
184
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000185class ThreadSafeCleanupTestCase(unittest.TestCase):
186 """Subclass of unittest.TestCase with thread-safe cleanup methods.
187
188 This subclass protects the addCleanup() and doCleanups() methods
189 with a recursive lock.
190 """
191
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200192 def __init__(self, *args, **kwargs):
193 super().__init__(*args, **kwargs)
194 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000195
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200196 def addCleanup(self, *args, **kwargs):
197 with self._cleanup_lock:
198 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000199
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200200 def doCleanups(self, *args, **kwargs):
201 with self._cleanup_lock:
202 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000203
Charles-François Natali47413c12011-10-06 19:47:44 +0200204class SocketCANTest(unittest.TestCase):
205
206 """To be able to run this test, a `vcan0` CAN interface can be created with
207 the following commands:
208 # modprobe vcan
209 # ip link add dev vcan0 type vcan
210 # ifconfig vcan0 up
211 """
212 interface = 'vcan0'
213 bufsize = 128
214
Charles-François Natali773e42d2013-02-05 19:42:01 +0100215 """The CAN frame structure is defined in <linux/can.h>:
216
217 struct can_frame {
218 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
219 __u8 can_dlc; /* data length code: 0 .. 8 */
220 __u8 data[8] __attribute__((aligned(8)));
221 };
222 """
223 can_frame_fmt = "=IB3x8s"
224 can_frame_size = struct.calcsize(can_frame_fmt)
225
226 """The Broadcast Management Command frame structure is defined
227 in <linux/can/bcm.h>:
228
229 struct bcm_msg_head {
230 __u32 opcode;
231 __u32 flags;
232 __u32 count;
233 struct timeval ival1, ival2;
234 canid_t can_id;
235 __u32 nframes;
236 struct can_frame frames[0];
237 }
238
239 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
240 `struct can_frame` definition). Must use native not standard types for packing.
241 """
242 bcm_cmd_msg_fmt = "@3I4l2I"
243 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
244
Charles-François Natali47413c12011-10-06 19:47:44 +0200245 def setUp(self):
246 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200247 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200248 try:
249 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200250 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200251 self.skipTest('network interface `%s` does not exist' %
252 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200253
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100254
255class SocketRDSTest(unittest.TestCase):
256
257 """To be able to run this test, the `rds` kernel module must be loaded:
258 # modprobe rds
259 """
260 bufsize = 8192
261
262 def setUp(self):
263 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
264 self.addCleanup(self.serv.close)
265 try:
266 self.port = support.bind_port(self.serv)
267 except OSError:
268 self.skipTest('unable to bind RDS socket')
269
270
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000272 """Threadable Test class
273
274 The ThreadableTest class makes it easy to create a threaded
275 client/server pair from an existing unit test. To create a
276 new threaded class from an existing unit test, use multiple
277 inheritance:
278
279 class NewClass (OldClass, ThreadableTest):
280 pass
281
282 This class defines two new fixture functions with obvious
283 purposes for overriding:
284
285 clientSetUp ()
286 clientTearDown ()
287
288 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000289 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000290 '_' to indicate the client portion of the test. Ex:
291
292 def testFoo(self):
293 # Server portion
294
295 def _testFoo(self):
296 # Client portion
297
298 Any exceptions raised by the clients during their tests
299 are caught and transferred to the main thread to alert
300 the testing framework.
301
302 Note, the server setup function cannot call any blocking
303 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000304 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000305 the blocking call (such as in setting up a client/server
306 connection and performing the accept() in setUp().
307 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000308
309 def __init__(self):
310 # Swap the true setup function
311 self.__setUp = self.setUp
312 self.__tearDown = self.tearDown
313 self.setUp = self._setUp
314 self.tearDown = self._tearDown
315
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000316 def serverExplicitReady(self):
317 """This method allows the server to explicitly indicate that
318 it wants the client thread to proceed. This is useful if the
319 server is about to execute a blocking routine that is
320 dependent upon the client thread during its setup routine."""
321 self.server_ready.set()
322
Guido van Rossum24e4af82002-06-12 19:18:08 +0000323 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700324 self.wait_threads = support.wait_threads_exit()
325 self.wait_threads.__enter__()
326
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000327 self.server_ready = threading.Event()
328 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000329 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000330 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200331 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332
333 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000334 methodname = self.id()
335 i = methodname.rfind('.')
336 methodname = methodname[i+1:]
337 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000338 self.client_thread = thread.start_new_thread(
339 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200341 try:
342 self.__setUp()
343 except:
344 self.server_crashed = True
345 raise
346 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000347 self.server_ready.set()
348 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349
350 def _tearDown(self):
351 self.__tearDown()
352 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700353 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000354
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000355 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000356 exc = self.queue.get()
357 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358
359 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000360 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100361 try:
362 self.clientSetUp()
363 except BaseException as e:
364 self.queue.put(e)
365 self.clientTearDown()
366 return
367 finally:
368 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200369 if self.server_crashed:
370 self.clientTearDown()
371 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000372 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000373 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000374 try:
375 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000376 except BaseException as e:
377 self.queue.put(e)
378 finally:
379 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000380
381 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000382 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000383
384 def clientTearDown(self):
385 self.done.set()
386 thread.exit()
387
388class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
389
390 def __init__(self, methodName='runTest'):
391 SocketTCPTest.__init__(self, methodName=methodName)
392 ThreadableTest.__init__(self)
393
394 def clientSetUp(self):
395 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
396
397 def clientTearDown(self):
398 self.cli.close()
399 self.cli = None
400 ThreadableTest.clientTearDown(self)
401
402class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
403
404 def __init__(self, methodName='runTest'):
405 SocketUDPTest.__init__(self, methodName=methodName)
406 ThreadableTest.__init__(self)
407
408 def clientSetUp(self):
409 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
410
Brian Curtin3beb38f2010-11-04 03:41:43 +0000411 def clientTearDown(self):
412 self.cli.close()
413 self.cli = None
414 ThreadableTest.clientTearDown(self)
415
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700416@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
417 'UDPLITE sockets required for this test.')
418class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
419
420 def __init__(self, methodName='runTest'):
421 SocketUDPLITETest.__init__(self, methodName=methodName)
422 ThreadableTest.__init__(self)
423
424 def clientSetUp(self):
425 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
426
427 def clientTearDown(self):
428 self.cli.close()
429 self.cli = None
430 ThreadableTest.clientTearDown(self)
431
Charles-François Natali47413c12011-10-06 19:47:44 +0200432class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
433
434 def __init__(self, methodName='runTest'):
435 SocketCANTest.__init__(self, methodName=methodName)
436 ThreadableTest.__init__(self)
437
438 def clientSetUp(self):
439 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
440 try:
441 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200442 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200443 # skipTest should not be called here, and will be called in the
444 # server instead
445 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200446
447 def clientTearDown(self):
448 self.cli.close()
449 self.cli = None
450 ThreadableTest.clientTearDown(self)
451
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100452class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
453
454 def __init__(self, methodName='runTest'):
455 SocketRDSTest.__init__(self, methodName=methodName)
456 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100457
458 def clientSetUp(self):
459 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
460 try:
461 # RDS sockets must be bound explicitly to send or receive data
462 self.cli.bind((HOST, 0))
463 self.cli_addr = self.cli.getsockname()
464 except OSError:
465 # skipTest should not be called here, and will be called in the
466 # server instead
467 pass
468
469 def clientTearDown(self):
470 self.cli.close()
471 self.cli = None
472 ThreadableTest.clientTearDown(self)
473
caaveryeffc12f2017-09-06 18:18:10 -0400474@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400475@unittest.skipUnless(HAVE_SOCKET_VSOCK,
476 'VSOCK sockets required for this test.')
477@unittest.skipUnless(get_cid() != 2,
478 "This test can only be run on a virtual guest.")
479class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
480
481 def __init__(self, methodName='runTest'):
482 unittest.TestCase.__init__(self, methodName=methodName)
483 ThreadableTest.__init__(self)
484
485 def setUp(self):
486 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
487 self.addCleanup(self.serv.close)
488 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
489 self.serv.listen()
490 self.serverExplicitReady()
491 self.conn, self.connaddr = self.serv.accept()
492 self.addCleanup(self.conn.close)
493
494 def clientSetUp(self):
495 time.sleep(0.1)
496 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
497 self.addCleanup(self.cli.close)
498 cid = get_cid()
499 self.cli.connect((cid, VSOCKPORT))
500
501 def testStream(self):
502 msg = self.conn.recv(1024)
503 self.assertEqual(msg, MSG)
504
505 def _testStream(self):
506 self.cli.send(MSG)
507 self.cli.close()
508
Guido van Rossum24e4af82002-06-12 19:18:08 +0000509class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000510 """Socket tests for client-server connection.
511
512 self.cli_conn is a client socket connected to the server. The
513 setUp() method guarantees that it is connected to the server.
514 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000515
516 def __init__(self, methodName='runTest'):
517 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
518
519 def setUp(self):
520 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000521 # Indicate explicitly we're ready for the client thread to
522 # proceed and then perform the blocking call to accept
523 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524 conn, addr = self.serv.accept()
525 self.cli_conn = conn
526
527 def tearDown(self):
528 self.cli_conn.close()
529 self.cli_conn = None
530 ThreadedTCPSocketTest.tearDown(self)
531
532 def clientSetUp(self):
533 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000534 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 self.serv_conn = self.cli
536
537 def clientTearDown(self):
538 self.serv_conn.close()
539 self.serv_conn = None
540 ThreadedTCPSocketTest.clientTearDown(self)
541
Dave Cole331708b2004-08-09 04:51:41 +0000542class SocketPairTest(unittest.TestCase, ThreadableTest):
543
544 def __init__(self, methodName='runTest'):
545 unittest.TestCase.__init__(self, methodName=methodName)
546 ThreadableTest.__init__(self)
547
548 def setUp(self):
549 self.serv, self.cli = socket.socketpair()
550
551 def tearDown(self):
552 self.serv.close()
553 self.serv = None
554
555 def clientSetUp(self):
556 pass
557
558 def clientTearDown(self):
559 self.cli.close()
560 self.cli = None
561 ThreadableTest.clientTearDown(self)
562
Tim Peters494aaee2004-08-09 18:54:11 +0000563
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000564# The following classes are used by the sendmsg()/recvmsg() tests.
565# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
566# gives a drop-in replacement for SocketConnectedTest, but different
567# address families can be used, and the attributes serv_addr and
568# cli_addr will be set to the addresses of the endpoints.
569
570class SocketTestBase(unittest.TestCase):
571 """A base class for socket tests.
572
573 Subclasses must provide methods newSocket() to return a new socket
574 and bindSock(sock) to bind it to an unused address.
575
576 Creates a socket self.serv and sets self.serv_addr to its address.
577 """
578
579 def setUp(self):
580 self.serv = self.newSocket()
581 self.bindServer()
582
583 def bindServer(self):
584 """Bind server socket and set self.serv_addr to its address."""
585 self.bindSock(self.serv)
586 self.serv_addr = self.serv.getsockname()
587
588 def tearDown(self):
589 self.serv.close()
590 self.serv = None
591
592
593class SocketListeningTestMixin(SocketTestBase):
594 """Mixin to listen on the server socket."""
595
596 def setUp(self):
597 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100598 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000599
600
601class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
602 ThreadableTest):
603 """Mixin to add client socket and allow client/server tests.
604
605 Client socket is self.cli and its address is self.cli_addr. See
606 ThreadableTest for usage information.
607 """
608
609 def __init__(self, *args, **kwargs):
610 super().__init__(*args, **kwargs)
611 ThreadableTest.__init__(self)
612
613 def clientSetUp(self):
614 self.cli = self.newClientSocket()
615 self.bindClient()
616
617 def newClientSocket(self):
618 """Return a new socket for use as client."""
619 return self.newSocket()
620
621 def bindClient(self):
622 """Bind client socket and set self.cli_addr to its address."""
623 self.bindSock(self.cli)
624 self.cli_addr = self.cli.getsockname()
625
626 def clientTearDown(self):
627 self.cli.close()
628 self.cli = None
629 ThreadableTest.clientTearDown(self)
630
631
632class ConnectedStreamTestMixin(SocketListeningTestMixin,
633 ThreadedSocketTestMixin):
634 """Mixin to allow client/server stream tests with connected client.
635
636 Server's socket representing connection to client is self.cli_conn
637 and client's connection to server is self.serv_conn. (Based on
638 SocketConnectedTest.)
639 """
640
641 def setUp(self):
642 super().setUp()
643 # Indicate explicitly we're ready for the client thread to
644 # proceed and then perform the blocking call to accept
645 self.serverExplicitReady()
646 conn, addr = self.serv.accept()
647 self.cli_conn = conn
648
649 def tearDown(self):
650 self.cli_conn.close()
651 self.cli_conn = None
652 super().tearDown()
653
654 def clientSetUp(self):
655 super().clientSetUp()
656 self.cli.connect(self.serv_addr)
657 self.serv_conn = self.cli
658
659 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100660 try:
661 self.serv_conn.close()
662 self.serv_conn = None
663 except AttributeError:
664 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000665 super().clientTearDown()
666
667
668class UnixSocketTestBase(SocketTestBase):
669 """Base class for Unix-domain socket tests."""
670
671 # This class is used for file descriptor passing tests, so we
672 # create the sockets in a private directory so that other users
673 # can't send anything that might be problematic for a privileged
674 # user running the tests.
675
676 def setUp(self):
677 self.dir_path = tempfile.mkdtemp()
678 self.addCleanup(os.rmdir, self.dir_path)
679 super().setUp()
680
681 def bindSock(self, sock):
682 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100683 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000684 self.addCleanup(support.unlink, path)
685
686class UnixStreamBase(UnixSocketTestBase):
687 """Base class for Unix-domain SOCK_STREAM tests."""
688
689 def newSocket(self):
690 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
691
692
693class InetTestBase(SocketTestBase):
694 """Base class for IPv4 socket tests."""
695
696 host = HOST
697
698 def setUp(self):
699 super().setUp()
700 self.port = self.serv_addr[1]
701
702 def bindSock(self, sock):
703 support.bind_port(sock, host=self.host)
704
705class TCPTestBase(InetTestBase):
706 """Base class for TCP-over-IPv4 tests."""
707
708 def newSocket(self):
709 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
710
711class UDPTestBase(InetTestBase):
712 """Base class for UDP-over-IPv4 tests."""
713
714 def newSocket(self):
715 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
716
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700717class UDPLITETestBase(InetTestBase):
718 """Base class for UDPLITE-over-IPv4 tests."""
719
720 def newSocket(self):
721 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
722
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000723class SCTPStreamBase(InetTestBase):
724 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
725
726 def newSocket(self):
727 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
728 socket.IPPROTO_SCTP)
729
730
731class Inet6TestBase(InetTestBase):
732 """Base class for IPv6 socket tests."""
733
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200734 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000735
736class UDP6TestBase(Inet6TestBase):
737 """Base class for UDP-over-IPv6 tests."""
738
739 def newSocket(self):
740 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
741
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700742class UDPLITE6TestBase(Inet6TestBase):
743 """Base class for UDPLITE-over-IPv6 tests."""
744
745 def newSocket(self):
746 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
747
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000748
749# Test-skipping decorators for use with ThreadableTest.
750
751def skipWithClientIf(condition, reason):
752 """Skip decorated test if condition is true, add client_skip decorator.
753
754 If the decorated object is not a class, sets its attribute
755 "client_skip" to a decorator which will return an empty function
756 if the test is to be skipped, or the original function if it is
757 not. This can be used to avoid running the client part of a
758 skipped test when using ThreadableTest.
759 """
760 def client_pass(*args, **kwargs):
761 pass
762 def skipdec(obj):
763 retval = unittest.skip(reason)(obj)
764 if not isinstance(obj, type):
765 retval.client_skip = lambda f: client_pass
766 return retval
767 def noskipdec(obj):
768 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
769 obj.client_skip = lambda f: f
770 return obj
771 return skipdec if condition else noskipdec
772
773
774def requireAttrs(obj, *attributes):
775 """Skip decorated test if obj is missing any of the given attributes.
776
777 Sets client_skip attribute as skipWithClientIf() does.
778 """
779 missing = [name for name in attributes if not hasattr(obj, name)]
780 return skipWithClientIf(
781 missing, "don't have " + ", ".join(name for name in missing))
782
783
784def requireSocket(*args):
785 """Skip decorated test if a socket cannot be created with given arguments.
786
787 When an argument is given as a string, will use the value of that
788 attribute of the socket module, or skip the test if it doesn't
789 exist. Sets client_skip attribute as skipWithClientIf() does.
790 """
791 err = None
792 missing = [obj for obj in args if
793 isinstance(obj, str) and not hasattr(socket, obj)]
794 if missing:
795 err = "don't have " + ", ".join(name for name in missing)
796 else:
797 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
798 for obj in args]
799 try:
800 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200801 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000802 # XXX: check errno?
803 err = str(e)
804 else:
805 s.close()
806 return skipWithClientIf(
807 err is not None,
808 "can't create socket({0}): {1}".format(
809 ", ".join(str(o) for o in args), err))
810
811
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812#######################################################################
813## Begin Tests
814
815class GeneralModuleTests(unittest.TestCase):
816
Ethan Furman7184bac2014-10-14 18:56:53 -0700817 def test_SocketType_is_socketobject(self):
818 import _socket
819 self.assertTrue(socket.SocketType is _socket.socket)
820 s = socket.socket()
821 self.assertIsInstance(s, socket.SocketType)
822 s.close()
823
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000824 def test_repr(self):
825 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200826 with s:
827 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000828 self.assertIn('family=%s' % socket.AF_INET, repr(s))
829 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200830 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200831 self.assertNotIn('raddr', repr(s))
832 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200833 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200834 self.assertIn(str(s.getsockname()), repr(s))
835 self.assertIn('[closed]', repr(s))
836 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000837
Victor Stinnere254e532014-07-26 14:36:55 +0200838 @unittest.skipUnless(_socket is not None, 'need _socket module')
839 def test_csocket_repr(self):
840 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
841 try:
842 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
843 % (s.fileno(), s.family, s.type, s.proto))
844 self.assertEqual(repr(s), expected)
845 finally:
846 s.close()
847 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
848 % (s.family, s.type, s.proto))
849 self.assertEqual(repr(s), expected)
850
Raymond Hettinger027bb632004-05-31 03:09:25 +0000851 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200852 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
853 p = proxy(s)
854 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000855 s = None
856 try:
857 p.fileno()
858 except ReferenceError:
859 pass
860 else:
861 self.fail('Socket proxy still exists')
862
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000864 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300865 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200866 with self.assertRaises(OSError, msg=msg % 'OSError'):
867 raise OSError
868 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200870 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872
Ezio Melotti63e42302011-05-07 19:47:48 +0300873 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000874 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300875 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
876 self.addCleanup(s.close)
877 s.bind(('', 0))
878 sockname = s.getsockname()
879 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300880 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300881 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300882 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400883 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300884 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300885 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300886 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400887 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300888 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300889 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300890 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300891 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300892 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300893 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300894 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400895 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300896 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300897 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300898 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400899 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300900 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300901 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300902 self.assertIn('not NoneType', str(cm.exception))
903 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300904 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300905 self.assertIn('an integer is required', str(cm.exception))
906 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300907 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300908 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300909 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300910 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300911 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300912 self.assertIn('(1 given)', str(cm.exception))
913 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300914 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300915 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300916
Guido van Rossum24e4af82002-06-12 19:18:08 +0000917 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000918 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100920 if socket.has_ipv6:
921 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922 socket.SOCK_STREAM
923 socket.SOCK_DGRAM
924 socket.SOCK_RAW
925 socket.SOCK_RDM
926 socket.SOCK_SEQPACKET
927 socket.SOL_SOCKET
928 socket.SO_REUSEADDR
929
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100930 def testCrucialIpProtoConstants(self):
931 socket.IPPROTO_TCP
932 socket.IPPROTO_UDP
933 if socket.has_ipv6:
934 socket.IPPROTO_IPV6
935
936 @unittest.skipUnless(os.name == "nt", "Windows specific")
937 def testWindowsSpecificConstants(self):
938 socket.IPPROTO_ICLFXBM
939 socket.IPPROTO_ST
940 socket.IPPROTO_CBT
941 socket.IPPROTO_IGP
942 socket.IPPROTO_RDP
943 socket.IPPROTO_PGM
944 socket.IPPROTO_L2TP
945 socket.IPPROTO_SCTP
946
Guido van Rossum654c11e2002-06-13 20:24:17 +0000947 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000948 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000949 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000950 try:
951 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200952 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000953 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600954 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000955 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000956 try:
957 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200958 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000959 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600960 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000961 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000962 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000963 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000964 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000965
Charles-François Natali0cc86852013-09-13 19:53:08 +0200966 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700967 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200968 self.assertEqual(socket.gethostbyname(addr), addr)
969
970 # we don't test support.HOSTv6 because there's a chance it doesn't have
971 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700972 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200973 self.assertIn(host, socket.gethostbyaddr(host)[2])
974
Xiang Zhangd36a7162017-03-07 11:06:09 +0800975 def test_host_resolution_bad_address(self):
976 # These are all malformed IP addresses and expected not to resolve to
977 # any result. But some ISPs, e.g. AWS, may successfully resolve these
978 # IPs.
979 explanation = (
980 "resolving an invalid IP address did not raise OSError; "
981 "can be caused by a broken DNS server"
982 )
983 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
984 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400985 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800986 socket.gethostbyname(addr)
987 with self.assertRaises(OSError, msg=explanation):
988 socket.gethostbyaddr(addr)
989
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000990 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
991 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
992 def test_sethostname(self):
993 oldhn = socket.gethostname()
994 try:
995 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200996 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000997 if e.errno == errno.EPERM:
998 self.skipTest("test should be run as root")
999 else:
1000 raise
1001 try:
1002 # running test as root!
1003 self.assertEqual(socket.gethostname(), 'new')
1004 # Should work with bytes objects too
1005 socket.sethostname(b'bar')
1006 self.assertEqual(socket.gethostname(), 'bar')
1007 finally:
1008 socket.sethostname(oldhn)
1009
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001010 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1011 'socket.if_nameindex() not available.')
1012 def testInterfaceNameIndex(self):
1013 interfaces = socket.if_nameindex()
1014 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001015 self.assertIsInstance(index, int)
1016 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001017 # interface indices are non-zero integers
1018 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001019 _index = socket.if_nametoindex(name)
1020 self.assertIsInstance(_index, int)
1021 self.assertEqual(index, _index)
1022 _name = socket.if_indextoname(index)
1023 self.assertIsInstance(_name, str)
1024 self.assertEqual(name, _name)
1025
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001026 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1027 'socket.if_indextoname() not available.')
1028 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001029 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001030 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001031
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001032 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1033 'socket.if_nametoindex() not available.')
1034 def testInvalidInterfaceNameToIndex(self):
1035 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1036 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1037
Serhiy Storchaka43767632013-11-03 21:31:38 +02001038 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1039 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001040 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001041 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001042 try:
1043 # On some versions, this loses a reference
1044 orig = sys.getrefcount(__name__)
1045 socket.getnameinfo(__name__,0)
1046 except TypeError:
1047 if sys.getrefcount(__name__) != orig:
1048 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001049
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001051 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052 try:
1053 # On some versions, this crashes the interpreter.
1054 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001055 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001057
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001058 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001059 # This just checks that htons etc. are their own inverse,
1060 # when looking at the lower 16 or 32 bits.
1061 sizes = {socket.htonl: 32, socket.ntohl: 32,
1062 socket.htons: 16, socket.ntohs: 16}
1063 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001064 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001065 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1066 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001067
Guido van Rossuma2627af2002-09-14 00:58:46 +00001068 swapped = func(mask)
1069 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001070 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001071
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001072 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001073 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001074 import _testcapi
1075 s_good_values = [0, 1, 2, 0xffff]
1076 l_good_values = s_good_values + [0xffffffff]
1077 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1078 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1079 _testcapi.INT_MAX + 1]
1080 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1081 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001082 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001083 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001084 for k in l_good_values:
1085 socket.ntohl(k)
1086 socket.htonl(k)
1087 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001088 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001089 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001090 for k in l_bad_values:
1091 self.assertRaises(OverflowError, socket.ntohl, k)
1092 self.assertRaises(OverflowError, socket.htonl, k)
1093 for k in s_deprecated_values:
1094 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1095 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001096
Barry Warsaw11b91a02004-06-28 00:50:43 +00001097 def testGetServBy(self):
1098 eq = self.assertEqual
1099 # Find one service that exists, then check all the related interfaces.
1100 # I've ordered this by protocols that have both a tcp and udp
1101 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001102 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001103 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001104 # avoid the 'echo' service on this platform, as there is an
1105 # assumption breaking non-standard port/protocol entry
1106 services = ('daytime', 'qotd', 'domain')
1107 else:
1108 services = ('echo', 'daytime', 'domain')
1109 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001110 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001111 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001112 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001113 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001114 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001115 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001116 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001117 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001118 # Issue #26936: Android getservbyname() was broken before API 23.
1119 if (not hasattr(sys, 'getandroidapilevel') or
1120 sys.getandroidapilevel() >= 23):
1121 port2 = socket.getservbyname(service)
1122 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001123 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001124 try:
1125 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001126 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001127 udpport = None
1128 else:
1129 eq(udpport, port)
1130 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001131 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001132 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001133 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001134 eq(socket.getservbyport(port, 'tcp'), service)
1135 if udpport is not None:
1136 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001137 # Make sure getservbyport does not accept out of range ports.
1138 self.assertRaises(OverflowError, socket.getservbyport, -1)
1139 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001141 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001142 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001143 # The default timeout should initially be None
1144 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001145 with socket.socket() as s:
1146 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001147
1148 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001149 with socket_setdefaulttimeout(10):
1150 self.assertEqual(socket.getdefaulttimeout(), 10)
1151 with socket.socket() as sock:
1152 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001153
Victor Stinner304315d2018-11-30 13:22:44 +01001154 # Reset the default timeout to None, and see if it propagates
1155 socket.setdefaulttimeout(None)
1156 self.assertEqual(socket.getdefaulttimeout(), None)
1157 with socket.socket() as sock:
1158 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001159
1160 # Check that setting it to an invalid value raises ValueError
1161 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1162
1163 # Check that setting it to an invalid type raises TypeError
1164 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1165
Serhiy Storchaka43767632013-11-03 21:31:38 +02001166 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1167 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001168 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001169 # Test that issue1008086 and issue767150 are fixed.
1170 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001171 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1172 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001173
Serhiy Storchaka43767632013-11-03 21:31:38 +02001174 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1175 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001176 def testIPv4toString(self):
1177 from socket import inet_aton as f, inet_pton, AF_INET
1178 g = lambda a: inet_pton(AF_INET, a)
1179
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001180 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001181 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001182 )
1183
Ezio Melottib3aedd42010-11-20 19:04:17 +00001184 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1185 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1186 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1187 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1188 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001189 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001190 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001191 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001192 assertInvalid(f, '300.0.0.0')
1193 assertInvalid(f, 'a.0.0.0')
1194 assertInvalid(f, '1.2.3.4.5')
1195 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001196
Ezio Melottib3aedd42010-11-20 19:04:17 +00001197 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1198 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1199 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1200 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001201 assertInvalid(g, '0.0.0.')
1202 assertInvalid(g, '300.0.0.0')
1203 assertInvalid(g, 'a.0.0.0')
1204 assertInvalid(g, '1.2.3.4.5')
1205 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001206
Serhiy Storchaka43767632013-11-03 21:31:38 +02001207 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1208 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001209 def testIPv6toString(self):
1210 try:
1211 from socket import inet_pton, AF_INET6, has_ipv6
1212 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001213 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001214 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001215 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001216
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001217 if sys.platform == "win32":
1218 try:
1219 inet_pton(AF_INET6, '::')
1220 except OSError as e:
1221 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001222 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001223
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001224 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001225 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001226 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001227 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001228
Ezio Melottib3aedd42010-11-20 19:04:17 +00001229 self.assertEqual(b'\x00' * 16, f('::'))
1230 self.assertEqual(b'\x00' * 16, f('0::0'))
1231 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1232 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001233 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 +00001234 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1235 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001236 self.assertEqual(
1237 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1238 f('ad42:abc::127:0:254:2')
1239 )
1240 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1241 assertInvalid('0x20::')
1242 assertInvalid(':::')
1243 assertInvalid('::0::')
1244 assertInvalid('1::abc::')
1245 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001246 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001247 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001248 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001249 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001250 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001251 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001252
1253 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1254 f('::254.42.23.64')
1255 )
1256 self.assertEqual(
1257 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1258 f('42::a29b:254.42.23.64')
1259 )
1260 self.assertEqual(
1261 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1262 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1263 )
1264 assertInvalid('255.254.253.252')
1265 assertInvalid('1::260.2.3.0')
1266 assertInvalid('1::0.be.e.0')
1267 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1268 assertInvalid('::1.2.3.4:0')
1269 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001270
Serhiy Storchaka43767632013-11-03 21:31:38 +02001271 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1272 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001273 def testStringToIPv4(self):
1274 from socket import inet_ntoa as f, inet_ntop, AF_INET
1275 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001276 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001277 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001278 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001279
Ezio Melottib3aedd42010-11-20 19:04:17 +00001280 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1281 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1282 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1283 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001284 assertInvalid(f, b'\x00' * 3)
1285 assertInvalid(f, b'\x00' * 5)
1286 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001287 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001288
Ezio Melottib3aedd42010-11-20 19:04:17 +00001289 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1290 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1291 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001292 assertInvalid(g, b'\x00' * 3)
1293 assertInvalid(g, b'\x00' * 5)
1294 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001295 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001296
Serhiy Storchaka43767632013-11-03 21:31:38 +02001297 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1298 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001299 def testStringToIPv6(self):
1300 try:
1301 from socket import inet_ntop, AF_INET6, has_ipv6
1302 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001303 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001304 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001305 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001306
1307 if sys.platform == "win32":
1308 try:
1309 inet_ntop(AF_INET6, b'\x00' * 16)
1310 except OSError as e:
1311 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001312 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001313
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001314 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001315 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001316 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001317 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001318
Ezio Melottib3aedd42010-11-20 19:04:17 +00001319 self.assertEqual('::', f(b'\x00' * 16))
1320 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1321 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001322 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001323 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 +00001324 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001325 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001326
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001327 assertInvalid(b'\x12' * 15)
1328 assertInvalid(b'\x12' * 17)
1329 assertInvalid(b'\x12' * 4)
1330
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001331 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001332
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001333 def testSockName(self):
1334 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001335 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001336 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001337 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001338 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001339 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001340 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1341 # it reasonable to get the host's addr in addition to 0.0.0.0.
1342 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001343 try:
1344 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001345 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001346 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001347 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001348 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001349 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001350
1351 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001352 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001353 # We know a socket should start without reuse==0
1354 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001355 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001356 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001357 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001358
1359 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001360 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001361 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001362 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001363 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1364 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001365 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001366
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001367 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001368 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001369 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1370 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001371 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001372
Martin Panter50ab1a32016-04-11 00:38:12 +00001373 def testCloseException(self):
1374 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001375 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001376 socket.socket(fileno=sock.fileno()).close()
1377 try:
1378 sock.close()
1379 except OSError as err:
1380 # Winsock apparently raises ENOTSOCK
1381 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1382 else:
1383 self.fail("close() should raise EBADF/ENOTSOCK")
1384
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001385 def testNewAttributes(self):
1386 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001387
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001388 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1389 self.assertEqual(sock.family, socket.AF_INET)
1390 if hasattr(socket, 'SOCK_CLOEXEC'):
1391 self.assertIn(sock.type,
1392 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1393 socket.SOCK_STREAM))
1394 else:
1395 self.assertEqual(sock.type, socket.SOCK_STREAM)
1396 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001397
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001398 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001399 sock = socket.socket()
1400 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001401 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001402 big_port = port + 65536
1403 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001404 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1405 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1406 # Since find_unused_port() is inherently subject to race conditions, we
1407 # call it a couple times if necessary.
1408 for i in itertools.count():
1409 port = support.find_unused_port()
1410 try:
1411 sock.bind((HOST, port))
1412 except OSError as e:
1413 if e.errno != errno.EADDRINUSE or i == 5:
1414 raise
1415 else:
1416 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001417
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001418 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001419 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001420 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1421 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1422 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1423 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001424 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1425 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001426 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001427 self.assertRaises(ValueError, s.ioctl, -1, None)
1428 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001429
Steve Dowerea93ac02016-06-17 12:52:18 -07001430 @unittest.skipUnless(os.name == "nt", "Windows specific")
1431 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1432 'Loopback fast path support required for this test')
1433 def test_sio_loopback_fast_path(self):
1434 s = socket.socket()
1435 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001436 try:
1437 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1438 except OSError as exc:
1439 WSAEOPNOTSUPP = 10045
1440 if exc.winerror == WSAEOPNOTSUPP:
1441 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1442 "doesn't implemented in this Windows version")
1443 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001444 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1445
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001446 def testGetaddrinfo(self):
1447 try:
1448 socket.getaddrinfo('localhost', 80)
1449 except socket.gaierror as err:
1450 if err.errno == socket.EAI_SERVICE:
1451 # see http://bugs.python.org/issue1282647
1452 self.skipTest("buggy libc version")
1453 raise
1454 # len of every sequence is supposed to be == 5
1455 for info in socket.getaddrinfo(HOST, None):
1456 self.assertEqual(len(info), 5)
1457 # host can be a domain name, a string representation of an
1458 # IPv4/v6 address or None
1459 socket.getaddrinfo('localhost', 80)
1460 socket.getaddrinfo('127.0.0.1', 80)
1461 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001462 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001463 socket.getaddrinfo('::1', 80)
1464 # port can be a string service name such as "http", a numeric
1465 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001466 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1467 if (not hasattr(sys, 'getandroidapilevel') or
1468 sys.getandroidapilevel() >= 23):
1469 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001470 socket.getaddrinfo(HOST, 80)
1471 socket.getaddrinfo(HOST, None)
1472 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001473 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1474 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001475 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001476 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1477 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001478 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001479 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1480 for _, socktype, _, _, _ in infos:
1481 self.assertEqual(socktype, socket.SOCK_STREAM)
1482 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001483 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001484 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1485 # a server willing to support both IPv4 and IPv6 will
1486 # usually do this
1487 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1488 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001489 # test keyword arguments
1490 a = socket.getaddrinfo(HOST, None)
1491 b = socket.getaddrinfo(host=HOST, port=None)
1492 self.assertEqual(a, b)
1493 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1494 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1495 self.assertEqual(a, b)
1496 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1497 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1498 self.assertEqual(a, b)
1499 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1500 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1501 self.assertEqual(a, b)
1502 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1503 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1504 self.assertEqual(a, b)
1505 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1506 socket.AI_PASSIVE)
1507 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1508 type=socket.SOCK_STREAM, proto=0,
1509 flags=socket.AI_PASSIVE)
1510 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001511 # Issue #6697.
1512 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001513
Ned Deilyb24f4812014-02-13 22:50:42 -08001514 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001515 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001516 try:
1517 # The arguments here are undefined and the call may succeed
1518 # or fail. All we care here is that it doesn't segfault.
1519 socket.getaddrinfo("localhost", None, 0, 0, 0,
1520 socket.AI_NUMERICSERV)
1521 except socket.gaierror:
1522 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001523
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001524 def test_getnameinfo(self):
1525 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001526 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001527
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001528 @unittest.skipUnless(support.is_resource_enabled('network'),
1529 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001530 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001531 # Check for internet access before running test
1532 # (issue #12804, issue #25138).
1533 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001534 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001535
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001536 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001537 domain = 'испытание.pythontest.net'
1538 socket.gethostbyname(domain)
1539 socket.gethostbyname_ex(domain)
1540 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001541 # 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 +00001542 # have a reverse entry yet
1543 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001544
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001545 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001546 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001547 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1548 self.skipTest("signal.alarm and socket.socketpair required for this test")
1549 # Our signal handlers clobber the C errno by calling a math function
1550 # with an invalid domain value.
1551 def ok_handler(*args):
1552 self.assertRaises(ValueError, math.acosh, 0)
1553 def raising_handler(*args):
1554 self.assertRaises(ValueError, math.acosh, 0)
1555 1 // 0
1556 c, s = socket.socketpair()
1557 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1558 try:
1559 if with_timeout:
1560 # Just above the one second minimum for signal.alarm
1561 c.settimeout(1.5)
1562 with self.assertRaises(ZeroDivisionError):
1563 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001564 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001565 if with_timeout:
1566 signal.signal(signal.SIGALRM, ok_handler)
1567 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001568 self.assertRaises(socket.timeout, c.sendall,
1569 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001570 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001571 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001572 signal.signal(signal.SIGALRM, old_alarm)
1573 c.close()
1574 s.close()
1575
1576 def test_sendall_interrupted(self):
1577 self.check_sendall_interrupted(False)
1578
1579 def test_sendall_interrupted_with_timeout(self):
1580 self.check_sendall_interrupted(True)
1581
Antoine Pitroue033e062010-10-29 10:38:18 +00001582 def test_dealloc_warn(self):
1583 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1584 r = repr(sock)
1585 with self.assertWarns(ResourceWarning) as cm:
1586 sock = None
1587 support.gc_collect()
1588 self.assertIn(r, str(cm.warning.args[0]))
1589 # An open socket file object gets dereferenced after the socket
1590 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1591 f = sock.makefile('rb')
1592 r = repr(sock)
1593 sock = None
1594 support.gc_collect()
1595 with self.assertWarns(ResourceWarning):
1596 f = None
1597 support.gc_collect()
1598
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001599 def test_name_closed_socketio(self):
1600 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1601 fp = sock.makefile("rb")
1602 fp.close()
1603 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1604
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001605 def test_unusable_closed_socketio(self):
1606 with socket.socket() as sock:
1607 fp = sock.makefile("rb", buffering=0)
1608 self.assertTrue(fp.readable())
1609 self.assertFalse(fp.writable())
1610 self.assertFalse(fp.seekable())
1611 fp.close()
1612 self.assertRaises(ValueError, fp.readable)
1613 self.assertRaises(ValueError, fp.writable)
1614 self.assertRaises(ValueError, fp.seekable)
1615
Christian Heimesd0e31b92018-01-27 09:54:13 +01001616 def test_socket_close(self):
1617 sock = socket.socket()
1618 try:
1619 sock.bind((HOST, 0))
1620 socket.close(sock.fileno())
1621 with self.assertRaises(OSError):
1622 sock.listen(1)
1623 finally:
1624 with self.assertRaises(OSError):
1625 # sock.close() fails with EBADF
1626 sock.close()
1627 with self.assertRaises(TypeError):
1628 socket.close(None)
1629 with self.assertRaises(OSError):
1630 socket.close(-1)
1631
Berker Peksag3fe64d02016-02-18 17:34:00 +02001632 def test_makefile_mode(self):
1633 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1634 with self.subTest(mode=mode):
1635 with socket.socket() as sock:
1636 with sock.makefile(mode) as fp:
1637 self.assertEqual(fp.mode, mode)
1638
1639 def test_makefile_invalid_mode(self):
1640 for mode in 'rt', 'x', '+', 'a':
1641 with self.subTest(mode=mode):
1642 with socket.socket() as sock:
1643 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1644 sock.makefile(mode)
1645
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001646 def test_pickle(self):
1647 sock = socket.socket()
1648 with sock:
1649 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1650 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001651 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1652 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1653 self.assertEqual(family, socket.AF_INET)
1654 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1655 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001656
Serhiy Storchaka78980432013-01-15 01:12:17 +02001657 def test_listen_backlog(self):
1658 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001659 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1660 srv.bind((HOST, 0))
1661 srv.listen(backlog)
1662
1663 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001664 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001665 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001666
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001667 @support.cpython_only
1668 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001669 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001670 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001671 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1672 srv.bind((HOST, 0))
1673 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001674
Charles-François Natali42663332012-01-02 15:57:30 +01001675 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001676 def test_flowinfo(self):
1677 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001678 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001679 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001680 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001681
Коренберг Марк7766b962018-02-13 00:47:42 +05001682 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1683 def test_getaddrinfo_ipv6_basic(self):
1684 ((*_, sockaddr),) = socket.getaddrinfo(
1685 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1686 1234, socket.AF_INET6,
1687 socket.SOCK_DGRAM,
1688 socket.IPPROTO_UDP
1689 )
1690 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1691
1692 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001693 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001694 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001695 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1696 # Just pick up any network interface (Linux, Mac OS X)
1697 (ifindex, test_interface) = socket.if_nameindex()[0]
1698 ((*_, sockaddr),) = socket.getaddrinfo(
1699 'ff02::1de:c0:face:8D%' + test_interface,
1700 1234, socket.AF_INET6,
1701 socket.SOCK_DGRAM,
1702 socket.IPPROTO_UDP
1703 )
1704 # Note missing interface name part in IPv6 address
1705 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1706
1707 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1708 @unittest.skipUnless(
1709 sys.platform == 'win32',
1710 'Numeric scope id does not work or undocumented')
1711 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1712 # Also works on Linux and Mac OS X, but is not documented (?)
1713 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1714 ifindex = 42
1715 ((*_, sockaddr),) = socket.getaddrinfo(
1716 'ff02::1de:c0:face:8D%' + str(ifindex),
1717 1234, socket.AF_INET6,
1718 socket.SOCK_DGRAM,
1719 socket.IPPROTO_UDP
1720 )
1721 # Note missing interface name part in IPv6 address
1722 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1723
1724 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001725 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001726 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001727 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1728 # Just pick up any network interface.
1729 (ifindex, test_interface) = socket.if_nameindex()[0]
1730 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1731 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1732 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1733
1734 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001735 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001736 'Numeric scope id does not work or undocumented')
1737 def test_getnameinfo_ipv6_scopeid_numeric(self):
1738 # Also works on Linux (undocumented), but does not work on Mac OS X
1739 # Windows and Linux allow nonexistent interface numbers here.
1740 ifindex = 42
1741 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1742 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1743 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1744
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001745 def test_str_for_enums(self):
1746 # Make sure that the AF_* and SOCK_* constants have enum-like string
1747 # reprs.
1748 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1749 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001750 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001751
Yury Selivanov98181422017-12-18 20:02:54 -05001752 def test_socket_consistent_sock_type(self):
1753 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1754 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1755 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1756
1757 with socket.socket(socket.AF_INET, sock_type) as s:
1758 self.assertEqual(s.type, socket.SOCK_STREAM)
1759 s.settimeout(1)
1760 self.assertEqual(s.type, socket.SOCK_STREAM)
1761 s.settimeout(0)
1762 self.assertEqual(s.type, socket.SOCK_STREAM)
1763 s.setblocking(True)
1764 self.assertEqual(s.type, socket.SOCK_STREAM)
1765 s.setblocking(False)
1766 self.assertEqual(s.type, socket.SOCK_STREAM)
1767
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001768 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001769 # Test that when created with a family that's not one of the known
1770 # AF_*/SOCK_* constants, socket.family just returns the number.
1771 #
1772 # To do this we fool socket.socket into believing it already has an
1773 # open fd because on this path it doesn't actually verify the family and
1774 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001775 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1776 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001777 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1778
1779 unknown_type = max(
1780 kind
1781 for name, kind in socket.SocketKind.__members__.items()
1782 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1783 ) + 1
1784
1785 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001786 family=unknown_family, type=unknown_type, proto=23,
1787 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001788 self.assertEqual(s.family, unknown_family)
1789 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001790 # some OS like macOS ignore proto
1791 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001792
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001793 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1794 def test__sendfile_use_sendfile(self):
1795 class File:
1796 def __init__(self, fd):
1797 self.fd = fd
1798
1799 def fileno(self):
1800 return self.fd
1801 with socket.socket() as sock:
1802 fd = os.open(os.curdir, os.O_RDONLY)
1803 os.close(fd)
1804 with self.assertRaises(socket._GiveupOnSendfile):
1805 sock._sendfile_use_sendfile(File(fd))
1806 with self.assertRaises(OverflowError):
1807 sock._sendfile_use_sendfile(File(2**1000))
1808 with self.assertRaises(TypeError):
1809 sock._sendfile_use_sendfile(File(None))
1810
Christian Heimesb6e43af2018-01-29 22:37:58 +01001811 def _test_socket_fileno(self, s, family, stype):
1812 self.assertEqual(s.family, family)
1813 self.assertEqual(s.type, stype)
1814
1815 fd = s.fileno()
1816 s2 = socket.socket(fileno=fd)
1817 self.addCleanup(s2.close)
1818 # detach old fd to avoid double close
1819 s.detach()
1820 self.assertEqual(s2.family, family)
1821 self.assertEqual(s2.type, stype)
1822 self.assertEqual(s2.fileno(), fd)
1823
1824 def test_socket_fileno(self):
1825 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1826 self.addCleanup(s.close)
1827 s.bind((support.HOST, 0))
1828 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1829
1830 if hasattr(socket, "SOCK_DGRAM"):
1831 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1832 self.addCleanup(s.close)
1833 s.bind((support.HOST, 0))
1834 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1835
1836 if support.IPV6_ENABLED:
1837 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1838 self.addCleanup(s.close)
1839 s.bind((support.HOSTv6, 0, 0, 0))
1840 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1841
1842 if hasattr(socket, "AF_UNIX"):
1843 tmpdir = tempfile.mkdtemp()
1844 self.addCleanup(shutil.rmtree, tmpdir)
1845 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1846 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001847 try:
1848 s.bind(os.path.join(tmpdir, 'socket'))
1849 except PermissionError:
1850 pass
1851 else:
1852 self._test_socket_fileno(s, socket.AF_UNIX,
1853 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001854
Dima Tisneke9912702018-12-17 22:07:55 +09001855 def test_socket_fileno_rejects_float(self):
1856 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1857 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1858
1859 def test_socket_fileno_rejects_other_types(self):
1860 with self.assertRaisesRegex(TypeError, "integer is required"):
1861 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1862
1863 def test_socket_fileno_rejects_invalid_socket(self):
1864 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1865 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1866
1867 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1868 def test_socket_fileno_rejects_negative(self):
1869 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1870 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1871
1872 def test_socket_fileno_requires_valid_fd(self):
1873 WSAENOTSOCK = 10038
1874 with self.assertRaises(OSError) as cm:
1875 socket.socket(fileno=support.make_bad_fd())
1876 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1877
1878 with self.assertRaises(OSError) as cm:
1879 socket.socket(
1880 socket.AF_INET,
1881 socket.SOCK_STREAM,
1882 fileno=support.make_bad_fd())
1883 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1884
1885 def test_socket_fileno_requires_socket_fd(self):
1886 with tempfile.NamedTemporaryFile() as afile:
1887 with self.assertRaises(OSError):
1888 socket.socket(fileno=afile.fileno())
1889
1890 with self.assertRaises(OSError) as cm:
1891 socket.socket(
1892 socket.AF_INET,
1893 socket.SOCK_STREAM,
1894 fileno=afile.fileno())
1895 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1896
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001897
Charles-François Natali47413c12011-10-06 19:47:44 +02001898@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1899class BasicCANTest(unittest.TestCase):
1900
1901 def testCrucialConstants(self):
1902 socket.AF_CAN
1903 socket.PF_CAN
1904 socket.CAN_RAW
1905
Charles-François Natali773e42d2013-02-05 19:42:01 +01001906 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1907 'socket.CAN_BCM required for this test.')
1908 def testBCMConstants(self):
1909 socket.CAN_BCM
1910
1911 # opcodes
1912 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1913 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1914 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1915 socket.CAN_BCM_TX_SEND # send one CAN frame
1916 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1917 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1918 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1919 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1920 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1921 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1922 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1923 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1924
karl ding31c4fd22019-07-31 01:47:16 -07001925 # flags
1926 socket.CAN_BCM_SETTIMER
1927 socket.CAN_BCM_STARTTIMER
1928 socket.CAN_BCM_TX_COUNTEVT
1929 socket.CAN_BCM_TX_ANNOUNCE
1930 socket.CAN_BCM_TX_CP_CAN_ID
1931 socket.CAN_BCM_RX_FILTER_ID
1932 socket.CAN_BCM_RX_CHECK_DLC
1933 socket.CAN_BCM_RX_NO_AUTOTIMER
1934 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1935 socket.CAN_BCM_TX_RESET_MULTI_IDX
1936 socket.CAN_BCM_RX_RTR_FRAME
1937
Charles-François Natali47413c12011-10-06 19:47:44 +02001938 def testCreateSocket(self):
1939 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1940 pass
1941
Charles-François Natali773e42d2013-02-05 19:42:01 +01001942 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1943 'socket.CAN_BCM required for this test.')
1944 def testCreateBCMSocket(self):
1945 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1946 pass
1947
Charles-François Natali47413c12011-10-06 19:47:44 +02001948 def testBindAny(self):
1949 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001950 address = ('', )
1951 s.bind(address)
1952 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001953
1954 def testTooLongInterfaceName(self):
1955 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1956 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001957 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001958 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001959
1960 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1961 'socket.CAN_RAW_LOOPBACK required for this test.')
1962 def testLoopback(self):
1963 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1964 for loopback in (0, 1):
1965 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1966 loopback)
1967 self.assertEqual(loopback,
1968 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1969
1970 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1971 'socket.CAN_RAW_FILTER required for this test.')
1972 def testFilter(self):
1973 can_id, can_mask = 0x200, 0x700
1974 can_filter = struct.pack("=II", can_id, can_mask)
1975 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1976 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1977 self.assertEqual(can_filter,
1978 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001979 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001980
1981
1982@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001983class CANTest(ThreadedCANSocketTest):
1984
Charles-François Natali47413c12011-10-06 19:47:44 +02001985 def __init__(self, methodName='runTest'):
1986 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1987
1988 @classmethod
1989 def build_can_frame(cls, can_id, data):
1990 """Build a CAN frame."""
1991 can_dlc = len(data)
1992 data = data.ljust(8, b'\x00')
1993 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1994
1995 @classmethod
1996 def dissect_can_frame(cls, frame):
1997 """Dissect a CAN frame."""
1998 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1999 return (can_id, can_dlc, data[:can_dlc])
2000
2001 def testSendFrame(self):
2002 cf, addr = self.s.recvfrom(self.bufsize)
2003 self.assertEqual(self.cf, cf)
2004 self.assertEqual(addr[0], self.interface)
2005 self.assertEqual(addr[1], socket.AF_CAN)
2006
2007 def _testSendFrame(self):
2008 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2009 self.cli.send(self.cf)
2010
2011 def testSendMaxFrame(self):
2012 cf, addr = self.s.recvfrom(self.bufsize)
2013 self.assertEqual(self.cf, cf)
2014
2015 def _testSendMaxFrame(self):
2016 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2017 self.cli.send(self.cf)
2018
2019 def testSendMultiFrames(self):
2020 cf, addr = self.s.recvfrom(self.bufsize)
2021 self.assertEqual(self.cf1, cf)
2022
2023 cf, addr = self.s.recvfrom(self.bufsize)
2024 self.assertEqual(self.cf2, cf)
2025
2026 def _testSendMultiFrames(self):
2027 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2028 self.cli.send(self.cf1)
2029
2030 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2031 self.cli.send(self.cf2)
2032
Charles-François Natali773e42d2013-02-05 19:42:01 +01002033 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2034 'socket.CAN_BCM required for this test.')
2035 def _testBCM(self):
2036 cf, addr = self.cli.recvfrom(self.bufsize)
2037 self.assertEqual(self.cf, cf)
2038 can_id, can_dlc, data = self.dissect_can_frame(cf)
2039 self.assertEqual(self.can_id, can_id)
2040 self.assertEqual(self.data, data)
2041
2042 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2043 'socket.CAN_BCM required for this test.')
2044 def testBCM(self):
2045 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2046 self.addCleanup(bcm.close)
2047 bcm.connect((self.interface,))
2048 self.can_id = 0x123
2049 self.data = bytes([0xc0, 0xff, 0xee])
2050 self.cf = self.build_can_frame(self.can_id, self.data)
2051 opcode = socket.CAN_BCM_TX_SEND
2052 flags = 0
2053 count = 0
2054 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2055 bcm_can_id = 0x0222
2056 nframes = 1
2057 assert len(self.cf) == 16
2058 header = struct.pack(self.bcm_cmd_msg_fmt,
2059 opcode,
2060 flags,
2061 count,
2062 ival1_seconds,
2063 ival1_usec,
2064 ival2_seconds,
2065 ival2_usec,
2066 bcm_can_id,
2067 nframes,
2068 )
2069 header_plus_frame = header + self.cf
2070 bytes_sent = bcm.send(header_plus_frame)
2071 self.assertEqual(bytes_sent, len(header_plus_frame))
2072
Charles-François Natali47413c12011-10-06 19:47:44 +02002073
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002074@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2075class ISOTPTest(unittest.TestCase):
2076
2077 def __init__(self, *args, **kwargs):
2078 super().__init__(*args, **kwargs)
2079 self.interface = "vcan0"
2080
2081 def testCrucialConstants(self):
2082 socket.AF_CAN
2083 socket.PF_CAN
2084 socket.CAN_ISOTP
2085 socket.SOCK_DGRAM
2086
2087 def testCreateSocket(self):
2088 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2089 pass
2090
2091 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2092 'socket.CAN_ISOTP required for this test.')
2093 def testCreateISOTPSocket(self):
2094 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2095 pass
2096
2097 def testTooLongInterfaceName(self):
2098 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2099 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2100 with self.assertRaisesRegex(OSError, 'interface name too long'):
2101 s.bind(('x' * 1024, 1, 2))
2102
2103 def testBind(self):
2104 try:
2105 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2106 addr = self.interface, 0x123, 0x456
2107 s.bind(addr)
2108 self.assertEqual(s.getsockname(), addr)
2109 except OSError as e:
2110 if e.errno == errno.ENODEV:
2111 self.skipTest('network interface `%s` does not exist' %
2112 self.interface)
2113 else:
2114 raise
2115
2116
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002117@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2118class BasicRDSTest(unittest.TestCase):
2119
2120 def testCrucialConstants(self):
2121 socket.AF_RDS
2122 socket.PF_RDS
2123
2124 def testCreateSocket(self):
2125 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2126 pass
2127
2128 def testSocketBufferSize(self):
2129 bufsize = 16384
2130 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2131 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2132 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2133
2134
2135@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002136class RDSTest(ThreadedRDSSocketTest):
2137
2138 def __init__(self, methodName='runTest'):
2139 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2140
Charles-François Natali240c55f2011-11-10 20:33:36 +01002141 def setUp(self):
2142 super().setUp()
2143 self.evt = threading.Event()
2144
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002145 def testSendAndRecv(self):
2146 data, addr = self.serv.recvfrom(self.bufsize)
2147 self.assertEqual(self.data, data)
2148 self.assertEqual(self.cli_addr, addr)
2149
2150 def _testSendAndRecv(self):
2151 self.data = b'spam'
2152 self.cli.sendto(self.data, 0, (HOST, self.port))
2153
2154 def testPeek(self):
2155 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2156 self.assertEqual(self.data, data)
2157 data, addr = self.serv.recvfrom(self.bufsize)
2158 self.assertEqual(self.data, data)
2159
2160 def _testPeek(self):
2161 self.data = b'spam'
2162 self.cli.sendto(self.data, 0, (HOST, self.port))
2163
2164 @requireAttrs(socket.socket, 'recvmsg')
2165 def testSendAndRecvMsg(self):
2166 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2167 self.assertEqual(self.data, data)
2168
2169 @requireAttrs(socket.socket, 'sendmsg')
2170 def _testSendAndRecvMsg(self):
2171 self.data = b'hello ' * 10
2172 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2173
2174 def testSendAndRecvMulti(self):
2175 data, addr = self.serv.recvfrom(self.bufsize)
2176 self.assertEqual(self.data1, data)
2177
2178 data, addr = self.serv.recvfrom(self.bufsize)
2179 self.assertEqual(self.data2, data)
2180
2181 def _testSendAndRecvMulti(self):
2182 self.data1 = b'bacon'
2183 self.cli.sendto(self.data1, 0, (HOST, self.port))
2184
2185 self.data2 = b'egg'
2186 self.cli.sendto(self.data2, 0, (HOST, self.port))
2187
2188 def testSelect(self):
2189 r, w, x = select.select([self.serv], [], [], 3.0)
2190 self.assertIn(self.serv, r)
2191 data, addr = self.serv.recvfrom(self.bufsize)
2192 self.assertEqual(self.data, data)
2193
2194 def _testSelect(self):
2195 self.data = b'select'
2196 self.cli.sendto(self.data, 0, (HOST, self.port))
2197
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002198@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2199 'QIPCRTR sockets required for this test.')
2200class BasicQIPCRTRTest(unittest.TestCase):
2201
2202 def testCrucialConstants(self):
2203 socket.AF_QIPCRTR
2204
2205 def testCreateSocket(self):
2206 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2207 pass
2208
2209 def testUnbound(self):
2210 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2211 self.assertEqual(s.getsockname()[1], 0)
2212
2213 def testBindSock(self):
2214 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2215 support.bind_port(s, host=s.getsockname()[0])
2216 self.assertNotEqual(s.getsockname()[1], 0)
2217
2218 def testInvalidBindSock(self):
2219 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2220 self.assertRaises(OSError, support.bind_port, s, host=-2)
2221
2222 def testAutoBindSock(self):
2223 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2224 s.connect((123, 123))
2225 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002226
caaveryeffc12f2017-09-06 18:18:10 -04002227@unittest.skipIf(fcntl is None, "need fcntl")
2228@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2229 'VSOCK sockets required for this test.')
2230class BasicVSOCKTest(unittest.TestCase):
2231
2232 def testCrucialConstants(self):
2233 socket.AF_VSOCK
2234
2235 def testVSOCKConstants(self):
2236 socket.SO_VM_SOCKETS_BUFFER_SIZE
2237 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2238 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2239 socket.VMADDR_CID_ANY
2240 socket.VMADDR_PORT_ANY
2241 socket.VMADDR_CID_HOST
2242 socket.VM_SOCKETS_INVALID_VERSION
2243 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2244
2245 def testCreateSocket(self):
2246 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2247 pass
2248
2249 def testSocketBufferSize(self):
2250 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2251 orig_max = s.getsockopt(socket.AF_VSOCK,
2252 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2253 orig = s.getsockopt(socket.AF_VSOCK,
2254 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2255 orig_min = s.getsockopt(socket.AF_VSOCK,
2256 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2257
2258 s.setsockopt(socket.AF_VSOCK,
2259 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2260 s.setsockopt(socket.AF_VSOCK,
2261 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2262 s.setsockopt(socket.AF_VSOCK,
2263 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2264
2265 self.assertEqual(orig_max * 2,
2266 s.getsockopt(socket.AF_VSOCK,
2267 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2268 self.assertEqual(orig * 2,
2269 s.getsockopt(socket.AF_VSOCK,
2270 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2271 self.assertEqual(orig_min * 2,
2272 s.getsockopt(socket.AF_VSOCK,
2273 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2274
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002275
Greg Bowser8fbece12019-08-02 16:29:52 -04002276@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2277 'Bluetooth sockets required for this test.')
2278class BasicBluetoothTest(unittest.TestCase):
2279
2280 def testBluetoothConstants(self):
2281 socket.BDADDR_ANY
2282 socket.BDADDR_LOCAL
2283 socket.AF_BLUETOOTH
2284 socket.BTPROTO_RFCOMM
2285
2286 if sys.platform != "win32":
2287 socket.BTPROTO_HCI
2288 socket.SOL_HCI
2289 socket.BTPROTO_L2CAP
2290
2291 if not sys.platform.startswith("freebsd"):
2292 socket.BTPROTO_SCO
2293
2294 def testCreateRfcommSocket(self):
2295 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2296 pass
2297
2298 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2299 def testCreateL2capSocket(self):
2300 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2301 pass
2302
2303 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2304 def testCreateHciSocket(self):
2305 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2306 pass
2307
2308 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2309 "windows and freebsd do not support SCO sockets")
2310 def testCreateScoSocket(self):
2311 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2312 pass
2313
2314
Guido van Rossum24e4af82002-06-12 19:18:08 +00002315class BasicTCPTest(SocketConnectedTest):
2316
2317 def __init__(self, methodName='runTest'):
2318 SocketConnectedTest.__init__(self, methodName=methodName)
2319
2320 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002321 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002322 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002323 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002324
2325 def _testRecv(self):
2326 self.serv_conn.send(MSG)
2327
2328 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002329 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002330 seg1 = self.cli_conn.recv(len(MSG) - 3)
2331 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002332 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002333 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002334
2335 def _testOverFlowRecv(self):
2336 self.serv_conn.send(MSG)
2337
2338 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002339 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002340 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002341 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002342
2343 def _testRecvFrom(self):
2344 self.serv_conn.send(MSG)
2345
2346 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002347 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002348 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2349 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002350 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002351 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002352
2353 def _testOverFlowRecvFrom(self):
2354 self.serv_conn.send(MSG)
2355
2356 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002357 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002358 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002359 while 1:
2360 read = self.cli_conn.recv(1024)
2361 if not read:
2362 break
Guido van Rossume531e292002-08-08 20:28:34 +00002363 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002364 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002365
2366 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002367 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002368 self.serv_conn.sendall(big_chunk)
2369
2370 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002371 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002372 fd = self.cli_conn.fileno()
2373 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002374 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002375 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002376 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002377 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002378
2379 def _testFromFd(self):
2380 self.serv_conn.send(MSG)
2381
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002382 def testDup(self):
2383 # Testing dup()
2384 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002385 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002386 msg = sock.recv(1024)
2387 self.assertEqual(msg, MSG)
2388
2389 def _testDup(self):
2390 self.serv_conn.send(MSG)
2391
Guido van Rossum24e4af82002-06-12 19:18:08 +00002392 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002393 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002394 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002395 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002396 # wait for _testShutdown to finish: on OS X, when the server
2397 # closes the connection the client also becomes disconnected,
2398 # and the client's shutdown call will fail. (Issue #4397.)
2399 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002400
2401 def _testShutdown(self):
2402 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002403 self.serv_conn.shutdown(2)
2404
2405 testShutdown_overflow = support.cpython_only(testShutdown)
2406
2407 @support.cpython_only
2408 def _testShutdown_overflow(self):
2409 import _testcapi
2410 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002411 # Issue 15989
2412 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2413 _testcapi.INT_MAX + 1)
2414 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2415 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002416 self.serv_conn.shutdown(2)
2417
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002418 def testDetach(self):
2419 # Testing detach()
2420 fileno = self.cli_conn.fileno()
2421 f = self.cli_conn.detach()
2422 self.assertEqual(f, fileno)
2423 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002424 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002425 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002426 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002427 # ...but we can create another socket using the (still open)
2428 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002429 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002430 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002431 msg = sock.recv(1024)
2432 self.assertEqual(msg, MSG)
2433
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002434 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002435 self.serv_conn.send(MSG)
2436
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002437
Guido van Rossum24e4af82002-06-12 19:18:08 +00002438class BasicUDPTest(ThreadedUDPSocketTest):
2439
2440 def __init__(self, methodName='runTest'):
2441 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2442
2443 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002444 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002445 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002446 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002447
2448 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002449 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002450
Guido van Rossum1c938012002-06-12 21:17:20 +00002451 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002452 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002453 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002454 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002455
Guido van Rossum1c938012002-06-12 21:17:20 +00002456 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002457 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002458
Guido van Rossumd8faa362007-04-27 19:54:29 +00002459 def testRecvFromNegative(self):
2460 # Negative lengths passed to recvfrom should give ValueError.
2461 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2462
2463 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002464 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002465
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002466
2467@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2468 'UDPLITE sockets required for this test.')
2469class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2470
2471 def __init__(self, methodName='runTest'):
2472 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2473
2474 def testSendtoAndRecv(self):
2475 # Testing sendto() and Recv() over UDPLITE
2476 msg = self.serv.recv(len(MSG))
2477 self.assertEqual(msg, MSG)
2478
2479 def _testSendtoAndRecv(self):
2480 self.cli.sendto(MSG, 0, (HOST, self.port))
2481
2482 def testRecvFrom(self):
2483 # Testing recvfrom() over UDPLITE
2484 msg, addr = self.serv.recvfrom(len(MSG))
2485 self.assertEqual(msg, MSG)
2486
2487 def _testRecvFrom(self):
2488 self.cli.sendto(MSG, 0, (HOST, self.port))
2489
2490 def testRecvFromNegative(self):
2491 # Negative lengths passed to recvfrom should give ValueError.
2492 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2493
2494 def _testRecvFromNegative(self):
2495 self.cli.sendto(MSG, 0, (HOST, self.port))
2496
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002497# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2498# same test code is used with different families and types of socket
2499# (e.g. stream, datagram), and tests using recvmsg() are repeated
2500# using recvmsg_into().
2501#
2502# The generic test classes such as SendmsgTests and
2503# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2504# supplied with sockets cli_sock and serv_sock representing the
2505# client's and the server's end of the connection respectively, and
2506# attributes cli_addr and serv_addr holding their (numeric where
2507# appropriate) addresses.
2508#
2509# The final concrete test classes combine these with subclasses of
2510# SocketTestBase which set up client and server sockets of a specific
2511# type, and with subclasses of SendrecvmsgBase such as
2512# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2513# sockets to cli_sock and serv_sock and override the methods and
2514# attributes of SendrecvmsgBase to fill in destination addresses if
2515# needed when sending, check for specific flags in msg_flags, etc.
2516#
2517# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2518# recvmsg_into().
2519
2520# XXX: like the other datagram (UDP) tests in this module, the code
2521# here assumes that datagram delivery on the local machine will be
2522# reliable.
2523
2524class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2525 # Base class for sendmsg()/recvmsg() tests.
2526
2527 # Time in seconds to wait before considering a test failed, or
2528 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002529 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002530
2531 def setUp(self):
2532 self.misc_event = threading.Event()
2533 super().setUp()
2534
2535 def sendToServer(self, msg):
2536 # Send msg to the server.
2537 return self.cli_sock.send(msg)
2538
2539 # Tuple of alternative default arguments for sendmsg() when called
2540 # via sendmsgToServer() (e.g. to include a destination address).
2541 sendmsg_to_server_defaults = ()
2542
2543 def sendmsgToServer(self, *args):
2544 # Call sendmsg() on self.cli_sock with the given arguments,
2545 # filling in any arguments which are not supplied with the
2546 # corresponding items of self.sendmsg_to_server_defaults, if
2547 # any.
2548 return self.cli_sock.sendmsg(
2549 *(args + self.sendmsg_to_server_defaults[len(args):]))
2550
2551 def doRecvmsg(self, sock, bufsize, *args):
2552 # Call recvmsg() on sock with given arguments and return its
2553 # result. Should be used for tests which can use either
2554 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2555 # this method with one which emulates it using recvmsg_into(),
2556 # thus allowing the same test to be used for both methods.
2557 result = sock.recvmsg(bufsize, *args)
2558 self.registerRecvmsgResult(result)
2559 return result
2560
2561 def registerRecvmsgResult(self, result):
2562 # Called by doRecvmsg() with the return value of recvmsg() or
2563 # recvmsg_into(). Can be overridden to arrange cleanup based
2564 # on the returned ancillary data, for instance.
2565 pass
2566
2567 def checkRecvmsgAddress(self, addr1, addr2):
2568 # Called to compare the received address with the address of
2569 # the peer.
2570 self.assertEqual(addr1, addr2)
2571
2572 # Flags that are normally unset in msg_flags
2573 msg_flags_common_unset = 0
2574 for name in ("MSG_CTRUNC", "MSG_OOB"):
2575 msg_flags_common_unset |= getattr(socket, name, 0)
2576
2577 # Flags that are normally set
2578 msg_flags_common_set = 0
2579
2580 # Flags set when a complete record has been received (e.g. MSG_EOR
2581 # for SCTP)
2582 msg_flags_eor_indicator = 0
2583
2584 # Flags set when a complete record has not been received
2585 # (e.g. MSG_TRUNC for datagram sockets)
2586 msg_flags_non_eor_indicator = 0
2587
2588 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2589 # Method to check the value of msg_flags returned by recvmsg[_into]().
2590 #
2591 # Checks that all bits in msg_flags_common_set attribute are
2592 # set in "flags" and all bits in msg_flags_common_unset are
2593 # unset.
2594 #
2595 # The "eor" argument specifies whether the flags should
2596 # indicate that a full record (or datagram) has been received.
2597 # If "eor" is None, no checks are done; otherwise, checks
2598 # that:
2599 #
2600 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2601 # set and all bits in msg_flags_non_eor_indicator are unset
2602 #
2603 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2604 # are set and all bits in msg_flags_eor_indicator are unset
2605 #
2606 # If "checkset" and/or "checkunset" are supplied, they require
2607 # the given bits to be set or unset respectively, overriding
2608 # what the attributes require for those bits.
2609 #
2610 # If any bits are set in "ignore", they will not be checked,
2611 # regardless of the other inputs.
2612 #
2613 # Will raise Exception if the inputs require a bit to be both
2614 # set and unset, and it is not ignored.
2615
2616 defaultset = self.msg_flags_common_set
2617 defaultunset = self.msg_flags_common_unset
2618
2619 if eor:
2620 defaultset |= self.msg_flags_eor_indicator
2621 defaultunset |= self.msg_flags_non_eor_indicator
2622 elif eor is not None:
2623 defaultset |= self.msg_flags_non_eor_indicator
2624 defaultunset |= self.msg_flags_eor_indicator
2625
2626 # Function arguments override defaults
2627 defaultset &= ~checkunset
2628 defaultunset &= ~checkset
2629
2630 # Merge arguments with remaining defaults, and check for conflicts
2631 checkset |= defaultset
2632 checkunset |= defaultunset
2633 inboth = checkset & checkunset & ~ignore
2634 if inboth:
2635 raise Exception("contradictory set, unset requirements for flags "
2636 "{0:#x}".format(inboth))
2637
2638 # Compare with given msg_flags value
2639 mask = (checkset | checkunset) & ~ignore
2640 self.assertEqual(flags & mask, checkset & mask)
2641
2642
2643class RecvmsgIntoMixin(SendrecvmsgBase):
2644 # Mixin to implement doRecvmsg() using recvmsg_into().
2645
2646 def doRecvmsg(self, sock, bufsize, *args):
2647 buf = bytearray(bufsize)
2648 result = sock.recvmsg_into([buf], *args)
2649 self.registerRecvmsgResult(result)
2650 self.assertGreaterEqual(result[0], 0)
2651 self.assertLessEqual(result[0], bufsize)
2652 return (bytes(buf[:result[0]]),) + result[1:]
2653
2654
2655class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2656 # Defines flags to be checked in msg_flags for datagram sockets.
2657
2658 @property
2659 def msg_flags_non_eor_indicator(self):
2660 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2661
2662
2663class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2664 # Defines flags to be checked in msg_flags for SCTP sockets.
2665
2666 @property
2667 def msg_flags_eor_indicator(self):
2668 return super().msg_flags_eor_indicator | socket.MSG_EOR
2669
2670
2671class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2672 # Base class for tests on connectionless-mode sockets. Users must
2673 # supply sockets on attributes cli and serv to be mapped to
2674 # cli_sock and serv_sock respectively.
2675
2676 @property
2677 def serv_sock(self):
2678 return self.serv
2679
2680 @property
2681 def cli_sock(self):
2682 return self.cli
2683
2684 @property
2685 def sendmsg_to_server_defaults(self):
2686 return ([], [], 0, self.serv_addr)
2687
2688 def sendToServer(self, msg):
2689 return self.cli_sock.sendto(msg, self.serv_addr)
2690
2691
2692class SendrecvmsgConnectedBase(SendrecvmsgBase):
2693 # Base class for tests on connected sockets. Users must supply
2694 # sockets on attributes serv_conn and cli_conn (representing the
2695 # connections *to* the server and the client), to be mapped to
2696 # cli_sock and serv_sock respectively.
2697
2698 @property
2699 def serv_sock(self):
2700 return self.cli_conn
2701
2702 @property
2703 def cli_sock(self):
2704 return self.serv_conn
2705
2706 def checkRecvmsgAddress(self, addr1, addr2):
2707 # Address is currently "unspecified" for a connected socket,
2708 # so we don't examine it
2709 pass
2710
2711
2712class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2713 # Base class to set a timeout on server's socket.
2714
2715 def setUp(self):
2716 super().setUp()
2717 self.serv_sock.settimeout(self.fail_timeout)
2718
2719
2720class SendmsgTests(SendrecvmsgServerTimeoutBase):
2721 # Tests for sendmsg() which can use any socket type and do not
2722 # involve recvmsg() or recvmsg_into().
2723
2724 def testSendmsg(self):
2725 # Send a simple message with sendmsg().
2726 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2727
2728 def _testSendmsg(self):
2729 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2730
2731 def testSendmsgDataGenerator(self):
2732 # Send from buffer obtained from a generator (not a sequence).
2733 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2734
2735 def _testSendmsgDataGenerator(self):
2736 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2737 len(MSG))
2738
2739 def testSendmsgAncillaryGenerator(self):
2740 # Gather (empty) ancillary data from a generator.
2741 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2742
2743 def _testSendmsgAncillaryGenerator(self):
2744 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2745 len(MSG))
2746
2747 def testSendmsgArray(self):
2748 # Send data from an array instead of the usual bytes object.
2749 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2750
2751 def _testSendmsgArray(self):
2752 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2753 len(MSG))
2754
2755 def testSendmsgGather(self):
2756 # Send message data from more than one buffer (gather write).
2757 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2758
2759 def _testSendmsgGather(self):
2760 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2761
2762 def testSendmsgBadArgs(self):
2763 # Check that sendmsg() rejects invalid arguments.
2764 self.assertEqual(self.serv_sock.recv(1000), b"done")
2765
2766 def _testSendmsgBadArgs(self):
2767 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2768 self.assertRaises(TypeError, self.sendmsgToServer,
2769 b"not in an iterable")
2770 self.assertRaises(TypeError, self.sendmsgToServer,
2771 object())
2772 self.assertRaises(TypeError, self.sendmsgToServer,
2773 [object()])
2774 self.assertRaises(TypeError, self.sendmsgToServer,
2775 [MSG, 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], [], 0, object())
2782 self.sendToServer(b"done")
2783
2784 def testSendmsgBadCmsg(self):
2785 # Check that invalid ancillary data items are rejected.
2786 self.assertEqual(self.serv_sock.recv(1000), b"done")
2787
2788 def _testSendmsgBadCmsg(self):
2789 self.assertRaises(TypeError, self.sendmsgToServer,
2790 [MSG], [object()])
2791 self.assertRaises(TypeError, self.sendmsgToServer,
2792 [MSG], [(object(), 0, b"data")])
2793 self.assertRaises(TypeError, self.sendmsgToServer,
2794 [MSG], [(0, object(), b"data")])
2795 self.assertRaises(TypeError, self.sendmsgToServer,
2796 [MSG], [(0, 0, object())])
2797 self.assertRaises(TypeError, self.sendmsgToServer,
2798 [MSG], [(0, 0)])
2799 self.assertRaises(TypeError, self.sendmsgToServer,
2800 [MSG], [(0, 0, b"data", 42)])
2801 self.sendToServer(b"done")
2802
2803 @requireAttrs(socket, "CMSG_SPACE")
2804 def testSendmsgBadMultiCmsg(self):
2805 # Check that invalid ancillary data items are rejected when
2806 # more than one item is present.
2807 self.assertEqual(self.serv_sock.recv(1000), b"done")
2808
2809 @testSendmsgBadMultiCmsg.client_skip
2810 def _testSendmsgBadMultiCmsg(self):
2811 self.assertRaises(TypeError, self.sendmsgToServer,
2812 [MSG], [0, 0, b""])
2813 self.assertRaises(TypeError, self.sendmsgToServer,
2814 [MSG], [(0, 0, b""), object()])
2815 self.sendToServer(b"done")
2816
2817 def testSendmsgExcessCmsgReject(self):
2818 # Check that sendmsg() rejects excess ancillary data items
2819 # when the number that can be sent is limited.
2820 self.assertEqual(self.serv_sock.recv(1000), b"done")
2821
2822 def _testSendmsgExcessCmsgReject(self):
2823 if not hasattr(socket, "CMSG_SPACE"):
2824 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002825 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002826 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2827 self.assertIsNone(cm.exception.errno)
2828 self.sendToServer(b"done")
2829
2830 def testSendmsgAfterClose(self):
2831 # Check that sendmsg() fails on a closed socket.
2832 pass
2833
2834 def _testSendmsgAfterClose(self):
2835 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002836 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002837
2838
2839class SendmsgStreamTests(SendmsgTests):
2840 # Tests for sendmsg() which require a stream socket and do not
2841 # involve recvmsg() or recvmsg_into().
2842
2843 def testSendmsgExplicitNoneAddr(self):
2844 # Check that peer address can be specified as None.
2845 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2846
2847 def _testSendmsgExplicitNoneAddr(self):
2848 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2849
2850 def testSendmsgTimeout(self):
2851 # Check that timeout works with sendmsg().
2852 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2853 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2854
2855 def _testSendmsgTimeout(self):
2856 try:
2857 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002858 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002859 while True:
2860 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002861 except socket.timeout:
2862 pass
2863 except OSError as exc:
2864 if exc.errno != errno.ENOMEM:
2865 raise
2866 # bpo-33937 the test randomly fails on Travis CI with
2867 # "OSError: [Errno 12] Cannot allocate memory"
2868 else:
2869 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002870 finally:
2871 self.misc_event.set()
2872
2873 # XXX: would be nice to have more tests for sendmsg flags argument.
2874
2875 # Linux supports MSG_DONTWAIT when sending, but in general, it
2876 # only works when receiving. Could add other platforms if they
2877 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002878 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002879 "MSG_DONTWAIT not known to work on this platform when "
2880 "sending")
2881 def testSendmsgDontWait(self):
2882 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2883 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2884 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2885
2886 @testSendmsgDontWait.client_skip
2887 def _testSendmsgDontWait(self):
2888 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002889 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002890 while True:
2891 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002892 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2893 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002894 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002895 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896 finally:
2897 self.misc_event.set()
2898
2899
2900class SendmsgConnectionlessTests(SendmsgTests):
2901 # Tests for sendmsg() which require a connectionless-mode
2902 # (e.g. datagram) socket, and do not involve recvmsg() or
2903 # recvmsg_into().
2904
2905 def testSendmsgNoDestAddr(self):
2906 # Check that sendmsg() fails when no destination address is
2907 # given for unconnected socket.
2908 pass
2909
2910 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002911 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002912 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002913 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002914 [MSG], [], 0, None)
2915
2916
2917class RecvmsgGenericTests(SendrecvmsgBase):
2918 # Tests for recvmsg() which can also be emulated using
2919 # recvmsg_into(), and can use any socket type.
2920
2921 def testRecvmsg(self):
2922 # Receive a simple message with recvmsg[_into]().
2923 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2924 self.assertEqual(msg, MSG)
2925 self.checkRecvmsgAddress(addr, self.cli_addr)
2926 self.assertEqual(ancdata, [])
2927 self.checkFlags(flags, eor=True)
2928
2929 def _testRecvmsg(self):
2930 self.sendToServer(MSG)
2931
2932 def testRecvmsgExplicitDefaults(self):
2933 # Test recvmsg[_into]() with default arguments provided explicitly.
2934 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2935 len(MSG), 0, 0)
2936 self.assertEqual(msg, MSG)
2937 self.checkRecvmsgAddress(addr, self.cli_addr)
2938 self.assertEqual(ancdata, [])
2939 self.checkFlags(flags, eor=True)
2940
2941 def _testRecvmsgExplicitDefaults(self):
2942 self.sendToServer(MSG)
2943
2944 def testRecvmsgShorter(self):
2945 # Receive a message smaller than buffer.
2946 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2947 len(MSG) + 42)
2948 self.assertEqual(msg, MSG)
2949 self.checkRecvmsgAddress(addr, self.cli_addr)
2950 self.assertEqual(ancdata, [])
2951 self.checkFlags(flags, eor=True)
2952
2953 def _testRecvmsgShorter(self):
2954 self.sendToServer(MSG)
2955
2956 def testRecvmsgTrunc(self):
2957 # Receive part of message, check for truncation indicators.
2958 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2959 len(MSG) - 3)
2960 self.assertEqual(msg, MSG[:-3])
2961 self.checkRecvmsgAddress(addr, self.cli_addr)
2962 self.assertEqual(ancdata, [])
2963 self.checkFlags(flags, eor=False)
2964
2965 def _testRecvmsgTrunc(self):
2966 self.sendToServer(MSG)
2967
2968 def testRecvmsgShortAncillaryBuf(self):
2969 # Test ancillary data buffer too small to hold any ancillary data.
2970 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2971 len(MSG), 1)
2972 self.assertEqual(msg, MSG)
2973 self.checkRecvmsgAddress(addr, self.cli_addr)
2974 self.assertEqual(ancdata, [])
2975 self.checkFlags(flags, eor=True)
2976
2977 def _testRecvmsgShortAncillaryBuf(self):
2978 self.sendToServer(MSG)
2979
2980 def testRecvmsgLongAncillaryBuf(self):
2981 # Test large ancillary data buffer.
2982 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2983 len(MSG), 10240)
2984 self.assertEqual(msg, MSG)
2985 self.checkRecvmsgAddress(addr, self.cli_addr)
2986 self.assertEqual(ancdata, [])
2987 self.checkFlags(flags, eor=True)
2988
2989 def _testRecvmsgLongAncillaryBuf(self):
2990 self.sendToServer(MSG)
2991
2992 def testRecvmsgAfterClose(self):
2993 # Check that recvmsg[_into]() fails on a closed socket.
2994 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002995 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002996
2997 def _testRecvmsgAfterClose(self):
2998 pass
2999
3000 def testRecvmsgTimeout(self):
3001 # Check that timeout works.
3002 try:
3003 self.serv_sock.settimeout(0.03)
3004 self.assertRaises(socket.timeout,
3005 self.doRecvmsg, self.serv_sock, len(MSG))
3006 finally:
3007 self.misc_event.set()
3008
3009 def _testRecvmsgTimeout(self):
3010 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3011
3012 @requireAttrs(socket, "MSG_PEEK")
3013 def testRecvmsgPeek(self):
3014 # Check that MSG_PEEK in flags enables examination of pending
3015 # data without consuming it.
3016
3017 # Receive part of data with MSG_PEEK.
3018 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3019 len(MSG) - 3, 0,
3020 socket.MSG_PEEK)
3021 self.assertEqual(msg, MSG[:-3])
3022 self.checkRecvmsgAddress(addr, self.cli_addr)
3023 self.assertEqual(ancdata, [])
3024 # Ignoring MSG_TRUNC here (so this test is the same for stream
3025 # and datagram sockets). Some wording in POSIX seems to
3026 # suggest that it needn't be set when peeking, but that may
3027 # just be a slip.
3028 self.checkFlags(flags, eor=False,
3029 ignore=getattr(socket, "MSG_TRUNC", 0))
3030
3031 # Receive all data with MSG_PEEK.
3032 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3033 len(MSG), 0,
3034 socket.MSG_PEEK)
3035 self.assertEqual(msg, MSG)
3036 self.checkRecvmsgAddress(addr, self.cli_addr)
3037 self.assertEqual(ancdata, [])
3038 self.checkFlags(flags, eor=True)
3039
3040 # Check that the same data can still be received normally.
3041 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3042 self.assertEqual(msg, MSG)
3043 self.checkRecvmsgAddress(addr, self.cli_addr)
3044 self.assertEqual(ancdata, [])
3045 self.checkFlags(flags, eor=True)
3046
3047 @testRecvmsgPeek.client_skip
3048 def _testRecvmsgPeek(self):
3049 self.sendToServer(MSG)
3050
3051 @requireAttrs(socket.socket, "sendmsg")
3052 def testRecvmsgFromSendmsg(self):
3053 # Test receiving with recvmsg[_into]() when message is sent
3054 # using sendmsg().
3055 self.serv_sock.settimeout(self.fail_timeout)
3056 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3057 self.assertEqual(msg, MSG)
3058 self.checkRecvmsgAddress(addr, self.cli_addr)
3059 self.assertEqual(ancdata, [])
3060 self.checkFlags(flags, eor=True)
3061
3062 @testRecvmsgFromSendmsg.client_skip
3063 def _testRecvmsgFromSendmsg(self):
3064 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3065
3066
3067class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3068 # Tests which require a stream socket and can use either recvmsg()
3069 # or recvmsg_into().
3070
3071 def testRecvmsgEOF(self):
3072 # Receive end-of-stream indicator (b"", peer socket closed).
3073 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3074 self.assertEqual(msg, b"")
3075 self.checkRecvmsgAddress(addr, self.cli_addr)
3076 self.assertEqual(ancdata, [])
3077 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3078
3079 def _testRecvmsgEOF(self):
3080 self.cli_sock.close()
3081
3082 def testRecvmsgOverflow(self):
3083 # Receive a message in more than one chunk.
3084 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3085 len(MSG) - 3)
3086 self.checkRecvmsgAddress(addr, self.cli_addr)
3087 self.assertEqual(ancdata, [])
3088 self.checkFlags(flags, eor=False)
3089
3090 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3091 self.checkRecvmsgAddress(addr, self.cli_addr)
3092 self.assertEqual(ancdata, [])
3093 self.checkFlags(flags, eor=True)
3094
3095 msg = seg1 + seg2
3096 self.assertEqual(msg, MSG)
3097
3098 def _testRecvmsgOverflow(self):
3099 self.sendToServer(MSG)
3100
3101
3102class RecvmsgTests(RecvmsgGenericTests):
3103 # Tests for recvmsg() which can use any socket type.
3104
3105 def testRecvmsgBadArgs(self):
3106 # Check that recvmsg() rejects invalid arguments.
3107 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3108 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3109 -1, 0, 0)
3110 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3111 len(MSG), -1, 0)
3112 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3113 [bytearray(10)], 0, 0)
3114 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3115 object(), 0, 0)
3116 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3117 len(MSG), object(), 0)
3118 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3119 len(MSG), 0, object())
3120
3121 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3122 self.assertEqual(msg, MSG)
3123 self.checkRecvmsgAddress(addr, self.cli_addr)
3124 self.assertEqual(ancdata, [])
3125 self.checkFlags(flags, eor=True)
3126
3127 def _testRecvmsgBadArgs(self):
3128 self.sendToServer(MSG)
3129
3130
3131class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3132 # Tests for recvmsg_into() which can use any socket type.
3133
3134 def testRecvmsgIntoBadArgs(self):
3135 # Check that recvmsg_into() rejects invalid arguments.
3136 buf = bytearray(len(MSG))
3137 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3138 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3139 len(MSG), 0, 0)
3140 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3141 buf, 0, 0)
3142 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3143 [object()], 0, 0)
3144 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3145 [b"I'm not writable"], 0, 0)
3146 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3147 [buf, object()], 0, 0)
3148 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3149 [buf], -1, 0)
3150 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3151 [buf], object(), 0)
3152 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3153 [buf], 0, object())
3154
3155 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3156 self.assertEqual(nbytes, len(MSG))
3157 self.assertEqual(buf, bytearray(MSG))
3158 self.checkRecvmsgAddress(addr, self.cli_addr)
3159 self.assertEqual(ancdata, [])
3160 self.checkFlags(flags, eor=True)
3161
3162 def _testRecvmsgIntoBadArgs(self):
3163 self.sendToServer(MSG)
3164
3165 def testRecvmsgIntoGenerator(self):
3166 # Receive into buffer obtained from a generator (not a sequence).
3167 buf = bytearray(len(MSG))
3168 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3169 (o for o in [buf]))
3170 self.assertEqual(nbytes, len(MSG))
3171 self.assertEqual(buf, bytearray(MSG))
3172 self.checkRecvmsgAddress(addr, self.cli_addr)
3173 self.assertEqual(ancdata, [])
3174 self.checkFlags(flags, eor=True)
3175
3176 def _testRecvmsgIntoGenerator(self):
3177 self.sendToServer(MSG)
3178
3179 def testRecvmsgIntoArray(self):
3180 # Receive into an array rather than the usual bytearray.
3181 buf = array.array("B", [0] * len(MSG))
3182 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3183 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003184 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003185 self.checkRecvmsgAddress(addr, self.cli_addr)
3186 self.assertEqual(ancdata, [])
3187 self.checkFlags(flags, eor=True)
3188
3189 def _testRecvmsgIntoArray(self):
3190 self.sendToServer(MSG)
3191
3192 def testRecvmsgIntoScatter(self):
3193 # Receive into multiple buffers (scatter write).
3194 b1 = bytearray(b"----")
3195 b2 = bytearray(b"0123456789")
3196 b3 = bytearray(b"--------------")
3197 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3198 [b1, memoryview(b2)[2:9], b3])
3199 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3200 self.assertEqual(b1, bytearray(b"Mary"))
3201 self.assertEqual(b2, bytearray(b"01 had a 9"))
3202 self.assertEqual(b3, bytearray(b"little lamb---"))
3203 self.checkRecvmsgAddress(addr, self.cli_addr)
3204 self.assertEqual(ancdata, [])
3205 self.checkFlags(flags, eor=True)
3206
3207 def _testRecvmsgIntoScatter(self):
3208 self.sendToServer(b"Mary had a little lamb")
3209
3210
3211class CmsgMacroTests(unittest.TestCase):
3212 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3213 # assumptions used by sendmsg() and recvmsg[_into](), which share
3214 # code with these functions.
3215
3216 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003217 try:
3218 import _testcapi
3219 except ImportError:
3220 socklen_t_limit = 0x7fffffff
3221 else:
3222 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003223
3224 @requireAttrs(socket, "CMSG_LEN")
3225 def testCMSG_LEN(self):
3226 # Test CMSG_LEN() with various valid and invalid values,
3227 # checking the assumptions used by recvmsg() and sendmsg().
3228 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3229 values = list(range(257)) + list(range(toobig - 257, toobig))
3230
3231 # struct cmsghdr has at least three members, two of which are ints
3232 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3233 for n in values:
3234 ret = socket.CMSG_LEN(n)
3235 # This is how recvmsg() calculates the data size
3236 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3237 self.assertLessEqual(ret, self.socklen_t_limit)
3238
3239 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3240 # sendmsg() shares code with these functions, and requires
3241 # that it reject values over the limit.
3242 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3243 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3244
3245 @requireAttrs(socket, "CMSG_SPACE")
3246 def testCMSG_SPACE(self):
3247 # Test CMSG_SPACE() with various valid and invalid values,
3248 # checking the assumptions used by sendmsg().
3249 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3250 values = list(range(257)) + list(range(toobig - 257, toobig))
3251
3252 last = socket.CMSG_SPACE(0)
3253 # struct cmsghdr has at least three members, two of which are ints
3254 self.assertGreater(last, array.array("i").itemsize * 2)
3255 for n in values:
3256 ret = socket.CMSG_SPACE(n)
3257 self.assertGreaterEqual(ret, last)
3258 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3259 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3260 self.assertLessEqual(ret, self.socklen_t_limit)
3261 last = ret
3262
3263 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3264 # sendmsg() shares code with these functions, and requires
3265 # that it reject values over the limit.
3266 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3267 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3268
3269
3270class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3271 # Tests for file descriptor passing on Unix-domain sockets.
3272
3273 # Invalid file descriptor value that's unlikely to evaluate to a
3274 # real FD even if one of its bytes is replaced with a different
3275 # value (which shouldn't actually happen).
3276 badfd = -0x5555
3277
3278 def newFDs(self, n):
3279 # Return a list of n file descriptors for newly-created files
3280 # containing their list indices as ASCII numbers.
3281 fds = []
3282 for i in range(n):
3283 fd, path = tempfile.mkstemp()
3284 self.addCleanup(os.unlink, path)
3285 self.addCleanup(os.close, fd)
3286 os.write(fd, str(i).encode())
3287 fds.append(fd)
3288 return fds
3289
3290 def checkFDs(self, fds):
3291 # Check that the file descriptors in the given list contain
3292 # their correct list indices as ASCII numbers.
3293 for n, fd in enumerate(fds):
3294 os.lseek(fd, 0, os.SEEK_SET)
3295 self.assertEqual(os.read(fd, 1024), str(n).encode())
3296
3297 def registerRecvmsgResult(self, result):
3298 self.addCleanup(self.closeRecvmsgFDs, result)
3299
3300 def closeRecvmsgFDs(self, recvmsg_result):
3301 # Close all file descriptors specified in the ancillary data
3302 # of the given return value from recvmsg() or recvmsg_into().
3303 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3304 if (cmsg_level == socket.SOL_SOCKET and
3305 cmsg_type == socket.SCM_RIGHTS):
3306 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003307 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003308 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3309 for fd in fds:
3310 os.close(fd)
3311
3312 def createAndSendFDs(self, n):
3313 # Send n new file descriptors created by newFDs() to the
3314 # server, with the constant MSG as the non-ancillary data.
3315 self.assertEqual(
3316 self.sendmsgToServer([MSG],
3317 [(socket.SOL_SOCKET,
3318 socket.SCM_RIGHTS,
3319 array.array("i", self.newFDs(n)))]),
3320 len(MSG))
3321
3322 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3323 # Check that constant MSG was received with numfds file
3324 # descriptors in a maximum of maxcmsgs control messages (which
3325 # must contain only complete integers). By default, check
3326 # that MSG_CTRUNC is unset, but ignore any flags in
3327 # ignoreflags.
3328 msg, ancdata, flags, addr = result
3329 self.assertEqual(msg, MSG)
3330 self.checkRecvmsgAddress(addr, self.cli_addr)
3331 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3332 ignore=ignoreflags)
3333
3334 self.assertIsInstance(ancdata, list)
3335 self.assertLessEqual(len(ancdata), maxcmsgs)
3336 fds = array.array("i")
3337 for item in ancdata:
3338 self.assertIsInstance(item, tuple)
3339 cmsg_level, cmsg_type, cmsg_data = item
3340 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3341 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3342 self.assertIsInstance(cmsg_data, bytes)
3343 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003344 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003345
3346 self.assertEqual(len(fds), numfds)
3347 self.checkFDs(fds)
3348
3349 def testFDPassSimple(self):
3350 # Pass a single FD (array read from bytes object).
3351 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3352 len(MSG), 10240))
3353
3354 def _testFDPassSimple(self):
3355 self.assertEqual(
3356 self.sendmsgToServer(
3357 [MSG],
3358 [(socket.SOL_SOCKET,
3359 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003360 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003361 len(MSG))
3362
3363 def testMultipleFDPass(self):
3364 # Pass multiple FDs in a single array.
3365 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3366 len(MSG), 10240))
3367
3368 def _testMultipleFDPass(self):
3369 self.createAndSendFDs(4)
3370
3371 @requireAttrs(socket, "CMSG_SPACE")
3372 def testFDPassCMSG_SPACE(self):
3373 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3374 self.checkRecvmsgFDs(
3375 4, self.doRecvmsg(self.serv_sock, len(MSG),
3376 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3377
3378 @testFDPassCMSG_SPACE.client_skip
3379 def _testFDPassCMSG_SPACE(self):
3380 self.createAndSendFDs(4)
3381
3382 def testFDPassCMSG_LEN(self):
3383 # Test using CMSG_LEN() to calculate ancillary buffer size.
3384 self.checkRecvmsgFDs(1,
3385 self.doRecvmsg(self.serv_sock, len(MSG),
3386 socket.CMSG_LEN(4 * SIZEOF_INT)),
3387 # RFC 3542 says implementations may set
3388 # MSG_CTRUNC if there isn't enough space
3389 # for trailing padding.
3390 ignoreflags=socket.MSG_CTRUNC)
3391
3392 def _testFDPassCMSG_LEN(self):
3393 self.createAndSendFDs(1)
3394
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003395 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003396 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003397 @requireAttrs(socket, "CMSG_SPACE")
3398 def testFDPassSeparate(self):
3399 # Pass two FDs in two separate arrays. Arrays may be combined
3400 # into a single control message by the OS.
3401 self.checkRecvmsgFDs(2,
3402 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3403 maxcmsgs=2)
3404
3405 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003406 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003407 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003408 def _testFDPassSeparate(self):
3409 fd0, fd1 = self.newFDs(2)
3410 self.assertEqual(
3411 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3412 socket.SCM_RIGHTS,
3413 array.array("i", [fd0])),
3414 (socket.SOL_SOCKET,
3415 socket.SCM_RIGHTS,
3416 array.array("i", [fd1]))]),
3417 len(MSG))
3418
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003419 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003420 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003421 @requireAttrs(socket, "CMSG_SPACE")
3422 def testFDPassSeparateMinSpace(self):
3423 # Pass two FDs in two separate arrays, receiving them into the
3424 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003425 num_fds = 2
3426 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003427 self.doRecvmsg(self.serv_sock, len(MSG),
3428 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003429 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003430 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3431
3432 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003433 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003434 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003435 def _testFDPassSeparateMinSpace(self):
3436 fd0, fd1 = self.newFDs(2)
3437 self.assertEqual(
3438 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3439 socket.SCM_RIGHTS,
3440 array.array("i", [fd0])),
3441 (socket.SOL_SOCKET,
3442 socket.SCM_RIGHTS,
3443 array.array("i", [fd1]))]),
3444 len(MSG))
3445
3446 def sendAncillaryIfPossible(self, msg, ancdata):
3447 # Try to send msg and ancdata to server, but if the system
3448 # call fails, just send msg with no ancillary data.
3449 try:
3450 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003451 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 # Check that it was the system call that failed
3453 self.assertIsInstance(e.errno, int)
3454 nbytes = self.sendmsgToServer([msg])
3455 self.assertEqual(nbytes, len(msg))
3456
Brett Cannon3bbad122015-12-28 17:21:44 -08003457 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003458 def testFDPassEmpty(self):
3459 # Try to pass an empty FD array. Can receive either no array
3460 # or an empty array.
3461 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3462 len(MSG), 10240),
3463 ignoreflags=socket.MSG_CTRUNC)
3464
3465 def _testFDPassEmpty(self):
3466 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3467 socket.SCM_RIGHTS,
3468 b"")])
3469
3470 def testFDPassPartialInt(self):
3471 # Try to pass a truncated FD array.
3472 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3473 len(MSG), 10240)
3474 self.assertEqual(msg, MSG)
3475 self.checkRecvmsgAddress(addr, self.cli_addr)
3476 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3477 self.assertLessEqual(len(ancdata), 1)
3478 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3479 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3480 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3481 self.assertLess(len(cmsg_data), SIZEOF_INT)
3482
3483 def _testFDPassPartialInt(self):
3484 self.sendAncillaryIfPossible(
3485 MSG,
3486 [(socket.SOL_SOCKET,
3487 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003488 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003489
3490 @requireAttrs(socket, "CMSG_SPACE")
3491 def testFDPassPartialIntInMiddle(self):
3492 # Try to pass two FD arrays, the first of which is truncated.
3493 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3494 len(MSG), 10240)
3495 self.assertEqual(msg, MSG)
3496 self.checkRecvmsgAddress(addr, self.cli_addr)
3497 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3498 self.assertLessEqual(len(ancdata), 2)
3499 fds = array.array("i")
3500 # Arrays may have been combined in a single control message
3501 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3502 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3503 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003504 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3506 self.assertLessEqual(len(fds), 2)
3507 self.checkFDs(fds)
3508
3509 @testFDPassPartialIntInMiddle.client_skip
3510 def _testFDPassPartialIntInMiddle(self):
3511 fd0, fd1 = self.newFDs(2)
3512 self.sendAncillaryIfPossible(
3513 MSG,
3514 [(socket.SOL_SOCKET,
3515 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003516 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003517 (socket.SOL_SOCKET,
3518 socket.SCM_RIGHTS,
3519 array.array("i", [fd1]))])
3520
3521 def checkTruncatedHeader(self, result, ignoreflags=0):
3522 # Check that no ancillary data items are returned when data is
3523 # truncated inside the cmsghdr structure.
3524 msg, ancdata, flags, addr = result
3525 self.assertEqual(msg, MSG)
3526 self.checkRecvmsgAddress(addr, self.cli_addr)
3527 self.assertEqual(ancdata, [])
3528 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3529 ignore=ignoreflags)
3530
3531 def testCmsgTruncNoBufSize(self):
3532 # Check that no ancillary data is received when no buffer size
3533 # is specified.
3534 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3535 # BSD seems to set MSG_CTRUNC only
3536 # if an item has been partially
3537 # received.
3538 ignoreflags=socket.MSG_CTRUNC)
3539
3540 def _testCmsgTruncNoBufSize(self):
3541 self.createAndSendFDs(1)
3542
3543 def testCmsgTrunc0(self):
3544 # Check that no ancillary data is received when buffer size is 0.
3545 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3546 ignoreflags=socket.MSG_CTRUNC)
3547
3548 def _testCmsgTrunc0(self):
3549 self.createAndSendFDs(1)
3550
3551 # Check that no ancillary data is returned for various non-zero
3552 # (but still too small) buffer sizes.
3553
3554 def testCmsgTrunc1(self):
3555 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3556
3557 def _testCmsgTrunc1(self):
3558 self.createAndSendFDs(1)
3559
3560 def testCmsgTrunc2Int(self):
3561 # The cmsghdr structure has at least three members, two of
3562 # which are ints, so we still shouldn't see any ancillary
3563 # data.
3564 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3565 SIZEOF_INT * 2))
3566
3567 def _testCmsgTrunc2Int(self):
3568 self.createAndSendFDs(1)
3569
3570 def testCmsgTruncLen0Minus1(self):
3571 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3572 socket.CMSG_LEN(0) - 1))
3573
3574 def _testCmsgTruncLen0Minus1(self):
3575 self.createAndSendFDs(1)
3576
3577 # The following tests try to truncate the control message in the
3578 # middle of the FD array.
3579
3580 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3581 # Check that file descriptor data is truncated to between
3582 # mindata and maxdata bytes when received with buffer size
3583 # ancbuf, and that any complete file descriptor numbers are
3584 # valid.
3585 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3586 len(MSG), ancbuf)
3587 self.assertEqual(msg, MSG)
3588 self.checkRecvmsgAddress(addr, self.cli_addr)
3589 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3590
3591 if mindata == 0 and ancdata == []:
3592 return
3593 self.assertEqual(len(ancdata), 1)
3594 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3595 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3596 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3597 self.assertGreaterEqual(len(cmsg_data), mindata)
3598 self.assertLessEqual(len(cmsg_data), maxdata)
3599 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003600 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003601 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3602 self.checkFDs(fds)
3603
3604 def testCmsgTruncLen0(self):
3605 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3606
3607 def _testCmsgTruncLen0(self):
3608 self.createAndSendFDs(1)
3609
3610 def testCmsgTruncLen0Plus1(self):
3611 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3612
3613 def _testCmsgTruncLen0Plus1(self):
3614 self.createAndSendFDs(2)
3615
3616 def testCmsgTruncLen1(self):
3617 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3618 maxdata=SIZEOF_INT)
3619
3620 def _testCmsgTruncLen1(self):
3621 self.createAndSendFDs(2)
3622
3623 def testCmsgTruncLen2Minus1(self):
3624 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3625 maxdata=(2 * SIZEOF_INT) - 1)
3626
3627 def _testCmsgTruncLen2Minus1(self):
3628 self.createAndSendFDs(2)
3629
3630
3631class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3632 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3633 # features of the RFC 3542 Advanced Sockets API for IPv6.
3634 # Currently we can only handle certain data items (e.g. traffic
3635 # class, hop limit, MTU discovery and fragmentation settings)
3636 # without resorting to unportable means such as the struct module,
3637 # but the tests here are aimed at testing the ancillary data
3638 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3639 # itself.
3640
3641 # Test value to use when setting hop limit of packet
3642 hop_limit = 2
3643
3644 # Test value to use when setting traffic class of packet.
3645 # -1 means "use kernel default".
3646 traffic_class = -1
3647
3648 def ancillaryMapping(self, ancdata):
3649 # Given ancillary data list ancdata, return a mapping from
3650 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3651 # Check that no (level, type) pair appears more than once.
3652 d = {}
3653 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3654 self.assertNotIn((cmsg_level, cmsg_type), d)
3655 d[(cmsg_level, cmsg_type)] = cmsg_data
3656 return d
3657
3658 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3659 # Receive hop limit into ancbufsize bytes of ancillary data
3660 # space. Check that data is MSG, ancillary data is not
3661 # truncated (but ignore any flags in ignoreflags), and hop
3662 # limit is between 0 and maxhop inclusive.
3663 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3664 socket.IPV6_RECVHOPLIMIT, 1)
3665 self.misc_event.set()
3666 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3667 len(MSG), ancbufsize)
3668
3669 self.assertEqual(msg, MSG)
3670 self.checkRecvmsgAddress(addr, self.cli_addr)
3671 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3672 ignore=ignoreflags)
3673
3674 self.assertEqual(len(ancdata), 1)
3675 self.assertIsInstance(ancdata[0], tuple)
3676 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3677 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3678 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3679 self.assertIsInstance(cmsg_data, bytes)
3680 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3681 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003682 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003683 self.assertGreaterEqual(a[0], 0)
3684 self.assertLessEqual(a[0], maxhop)
3685
3686 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3687 def testRecvHopLimit(self):
3688 # Test receiving the packet hop limit as ancillary data.
3689 self.checkHopLimit(ancbufsize=10240)
3690
3691 @testRecvHopLimit.client_skip
3692 def _testRecvHopLimit(self):
3693 # Need to wait until server has asked to receive ancillary
3694 # data, as implementations are not required to buffer it
3695 # otherwise.
3696 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3697 self.sendToServer(MSG)
3698
3699 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3700 def testRecvHopLimitCMSG_SPACE(self):
3701 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3702 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3703
3704 @testRecvHopLimitCMSG_SPACE.client_skip
3705 def _testRecvHopLimitCMSG_SPACE(self):
3706 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3707 self.sendToServer(MSG)
3708
3709 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3710 # 3542 says portable applications must provide space for trailing
3711 # padding. Implementations may set MSG_CTRUNC if there isn't
3712 # enough space for the padding.
3713
3714 @requireAttrs(socket.socket, "sendmsg")
3715 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3716 def testSetHopLimit(self):
3717 # Test setting hop limit on outgoing packet and receiving it
3718 # at the other end.
3719 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3720
3721 @testSetHopLimit.client_skip
3722 def _testSetHopLimit(self):
3723 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3724 self.assertEqual(
3725 self.sendmsgToServer([MSG],
3726 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3727 array.array("i", [self.hop_limit]))]),
3728 len(MSG))
3729
3730 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3731 ignoreflags=0):
3732 # Receive traffic class and hop limit into ancbufsize bytes of
3733 # ancillary data space. Check that data is MSG, ancillary
3734 # data is not truncated (but ignore any flags in ignoreflags),
3735 # and traffic class and hop limit are in range (hop limit no
3736 # more than maxhop).
3737 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3738 socket.IPV6_RECVHOPLIMIT, 1)
3739 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3740 socket.IPV6_RECVTCLASS, 1)
3741 self.misc_event.set()
3742 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3743 len(MSG), ancbufsize)
3744
3745 self.assertEqual(msg, MSG)
3746 self.checkRecvmsgAddress(addr, self.cli_addr)
3747 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3748 ignore=ignoreflags)
3749 self.assertEqual(len(ancdata), 2)
3750 ancmap = self.ancillaryMapping(ancdata)
3751
3752 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3753 self.assertEqual(len(tcdata), SIZEOF_INT)
3754 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003755 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003756 self.assertGreaterEqual(a[0], 0)
3757 self.assertLessEqual(a[0], 255)
3758
3759 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3760 self.assertEqual(len(hldata), SIZEOF_INT)
3761 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003762 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003763 self.assertGreaterEqual(a[0], 0)
3764 self.assertLessEqual(a[0], maxhop)
3765
3766 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3767 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3768 def testRecvTrafficClassAndHopLimit(self):
3769 # Test receiving traffic class and hop limit as ancillary data.
3770 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3771
3772 @testRecvTrafficClassAndHopLimit.client_skip
3773 def _testRecvTrafficClassAndHopLimit(self):
3774 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3775 self.sendToServer(MSG)
3776
3777 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3778 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3779 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3780 # Test receiving traffic class and hop limit, using
3781 # CMSG_SPACE() to calculate buffer size.
3782 self.checkTrafficClassAndHopLimit(
3783 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3784
3785 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3786 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3787 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3788 self.sendToServer(MSG)
3789
3790 @requireAttrs(socket.socket, "sendmsg")
3791 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3792 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3793 def testSetTrafficClassAndHopLimit(self):
3794 # Test setting traffic class and hop limit on outgoing packet,
3795 # and receiving them at the other end.
3796 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3797 maxhop=self.hop_limit)
3798
3799 @testSetTrafficClassAndHopLimit.client_skip
3800 def _testSetTrafficClassAndHopLimit(self):
3801 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3802 self.assertEqual(
3803 self.sendmsgToServer([MSG],
3804 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3805 array.array("i", [self.traffic_class])),
3806 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3807 array.array("i", [self.hop_limit]))]),
3808 len(MSG))
3809
3810 @requireAttrs(socket.socket, "sendmsg")
3811 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3812 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3813 def testOddCmsgSize(self):
3814 # Try to send ancillary data with first item one byte too
3815 # long. Fall back to sending with correct size if this fails,
3816 # and check that second item was handled correctly.
3817 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3818 maxhop=self.hop_limit)
3819
3820 @testOddCmsgSize.client_skip
3821 def _testOddCmsgSize(self):
3822 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3823 try:
3824 nbytes = self.sendmsgToServer(
3825 [MSG],
3826 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003827 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003828 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3829 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003830 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003831 self.assertIsInstance(e.errno, int)
3832 nbytes = self.sendmsgToServer(
3833 [MSG],
3834 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3835 array.array("i", [self.traffic_class])),
3836 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3837 array.array("i", [self.hop_limit]))])
3838 self.assertEqual(nbytes, len(MSG))
3839
3840 # Tests for proper handling of truncated ancillary data
3841
3842 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3843 # Receive hop limit into ancbufsize bytes of ancillary data
3844 # space, which should be too small to contain the ancillary
3845 # data header (if ancbufsize is None, pass no second argument
3846 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3847 # (unless included in ignoreflags), and no ancillary data is
3848 # returned.
3849 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3850 socket.IPV6_RECVHOPLIMIT, 1)
3851 self.misc_event.set()
3852 args = () if ancbufsize is None else (ancbufsize,)
3853 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3854 len(MSG), *args)
3855
3856 self.assertEqual(msg, MSG)
3857 self.checkRecvmsgAddress(addr, self.cli_addr)
3858 self.assertEqual(ancdata, [])
3859 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3860 ignore=ignoreflags)
3861
3862 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3863 def testCmsgTruncNoBufSize(self):
3864 # Check that no ancillary data is received when no ancillary
3865 # buffer size is provided.
3866 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3867 # BSD seems to set
3868 # MSG_CTRUNC only if an item
3869 # has been partially
3870 # received.
3871 ignoreflags=socket.MSG_CTRUNC)
3872
3873 @testCmsgTruncNoBufSize.client_skip
3874 def _testCmsgTruncNoBufSize(self):
3875 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3876 self.sendToServer(MSG)
3877
3878 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3879 def testSingleCmsgTrunc0(self):
3880 # Check that no ancillary data is received when ancillary
3881 # buffer size is zero.
3882 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3883 ignoreflags=socket.MSG_CTRUNC)
3884
3885 @testSingleCmsgTrunc0.client_skip
3886 def _testSingleCmsgTrunc0(self):
3887 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3888 self.sendToServer(MSG)
3889
3890 # Check that no ancillary data is returned for various non-zero
3891 # (but still too small) buffer sizes.
3892
3893 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3894 def testSingleCmsgTrunc1(self):
3895 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3896
3897 @testSingleCmsgTrunc1.client_skip
3898 def _testSingleCmsgTrunc1(self):
3899 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3900 self.sendToServer(MSG)
3901
3902 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3903 def testSingleCmsgTrunc2Int(self):
3904 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3905
3906 @testSingleCmsgTrunc2Int.client_skip
3907 def _testSingleCmsgTrunc2Int(self):
3908 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3909 self.sendToServer(MSG)
3910
3911 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3912 def testSingleCmsgTruncLen0Minus1(self):
3913 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3914
3915 @testSingleCmsgTruncLen0Minus1.client_skip
3916 def _testSingleCmsgTruncLen0Minus1(self):
3917 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3918 self.sendToServer(MSG)
3919
3920 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3921 def testSingleCmsgTruncInData(self):
3922 # Test truncation of a control message inside its associated
3923 # data. The message may be returned with its data truncated,
3924 # or not returned at all.
3925 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3926 socket.IPV6_RECVHOPLIMIT, 1)
3927 self.misc_event.set()
3928 msg, ancdata, flags, addr = self.doRecvmsg(
3929 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3930
3931 self.assertEqual(msg, MSG)
3932 self.checkRecvmsgAddress(addr, self.cli_addr)
3933 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3934
3935 self.assertLessEqual(len(ancdata), 1)
3936 if ancdata:
3937 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3938 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3939 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3940 self.assertLess(len(cmsg_data), SIZEOF_INT)
3941
3942 @testSingleCmsgTruncInData.client_skip
3943 def _testSingleCmsgTruncInData(self):
3944 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3945 self.sendToServer(MSG)
3946
3947 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3948 # Receive traffic class and hop limit into ancbufsize bytes of
3949 # ancillary data space, which should be large enough to
3950 # contain the first item, but too small to contain the header
3951 # of the second. Check that data is MSG, MSG_CTRUNC is set
3952 # (unless included in ignoreflags), and only one ancillary
3953 # data item is returned.
3954 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3955 socket.IPV6_RECVHOPLIMIT, 1)
3956 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3957 socket.IPV6_RECVTCLASS, 1)
3958 self.misc_event.set()
3959 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3960 len(MSG), ancbufsize)
3961
3962 self.assertEqual(msg, MSG)
3963 self.checkRecvmsgAddress(addr, self.cli_addr)
3964 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3965 ignore=ignoreflags)
3966
3967 self.assertEqual(len(ancdata), 1)
3968 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3969 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3970 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3971 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3972 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003973 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974 self.assertGreaterEqual(a[0], 0)
3975 self.assertLessEqual(a[0], 255)
3976
3977 # Try the above test with various buffer sizes.
3978
3979 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3980 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3981 def testSecondCmsgTrunc0(self):
3982 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3983 ignoreflags=socket.MSG_CTRUNC)
3984
3985 @testSecondCmsgTrunc0.client_skip
3986 def _testSecondCmsgTrunc0(self):
3987 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3988 self.sendToServer(MSG)
3989
3990 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3991 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3992 def testSecondCmsgTrunc1(self):
3993 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3994
3995 @testSecondCmsgTrunc1.client_skip
3996 def _testSecondCmsgTrunc1(self):
3997 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3998 self.sendToServer(MSG)
3999
4000 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4001 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4002 def testSecondCmsgTrunc2Int(self):
4003 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4004 2 * SIZEOF_INT)
4005
4006 @testSecondCmsgTrunc2Int.client_skip
4007 def _testSecondCmsgTrunc2Int(self):
4008 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4009 self.sendToServer(MSG)
4010
4011 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4012 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4013 def testSecondCmsgTruncLen0Minus1(self):
4014 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4015 socket.CMSG_LEN(0) - 1)
4016
4017 @testSecondCmsgTruncLen0Minus1.client_skip
4018 def _testSecondCmsgTruncLen0Minus1(self):
4019 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4020 self.sendToServer(MSG)
4021
4022 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4023 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4024 def testSecomdCmsgTruncInData(self):
4025 # Test truncation of the second of two control messages inside
4026 # its associated data.
4027 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4028 socket.IPV6_RECVHOPLIMIT, 1)
4029 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4030 socket.IPV6_RECVTCLASS, 1)
4031 self.misc_event.set()
4032 msg, ancdata, flags, addr = self.doRecvmsg(
4033 self.serv_sock, len(MSG),
4034 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4035
4036 self.assertEqual(msg, MSG)
4037 self.checkRecvmsgAddress(addr, self.cli_addr)
4038 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4039
4040 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4041
4042 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4043 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4044 cmsg_types.remove(cmsg_type)
4045 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4046 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004047 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004048 self.assertGreaterEqual(a[0], 0)
4049 self.assertLessEqual(a[0], 255)
4050
4051 if ancdata:
4052 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4053 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4054 cmsg_types.remove(cmsg_type)
4055 self.assertLess(len(cmsg_data), SIZEOF_INT)
4056
4057 self.assertEqual(ancdata, [])
4058
4059 @testSecomdCmsgTruncInData.client_skip
4060 def _testSecomdCmsgTruncInData(self):
4061 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4062 self.sendToServer(MSG)
4063
4064
4065# Derive concrete test classes for different socket types.
4066
4067class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4068 SendrecvmsgConnectionlessBase,
4069 ThreadedSocketTestMixin, UDPTestBase):
4070 pass
4071
4072@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004073class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4074 pass
4075
4076@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004077class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4078 pass
4079
4080@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004081class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4082 pass
4083
4084
4085class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4086 SendrecvmsgConnectionlessBase,
4087 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004088
4089 def checkRecvmsgAddress(self, addr1, addr2):
4090 # Called to compare the received address with the address of
4091 # the peer, ignoring scope ID
4092 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004093
4094@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004095@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004096@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4098 pass
4099
4100@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004101@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004103class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4104 pass
4105
4106@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004107@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004108@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004109class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4110 pass
4111
4112@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004113@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004114@requireAttrs(socket, "IPPROTO_IPV6")
4115@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4117 SendrecvmsgUDP6TestBase):
4118 pass
4119
4120@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004121@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004122@requireAttrs(socket, "IPPROTO_IPV6")
4123@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004124class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4125 RFC3542AncillaryTest,
4126 SendrecvmsgUDP6TestBase):
4127 pass
4128
4129
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004130@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4131 'UDPLITE sockets required for this test.')
4132class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4133 SendrecvmsgConnectionlessBase,
4134 ThreadedSocketTestMixin, UDPLITETestBase):
4135 pass
4136
4137@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4138 'UDPLITE sockets required for this test.')
4139@requireAttrs(socket.socket, "sendmsg")
4140class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4141 pass
4142
4143@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4144 'UDPLITE sockets required for this test.')
4145@requireAttrs(socket.socket, "recvmsg")
4146class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4147 pass
4148
4149@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4150 'UDPLITE sockets required for this test.')
4151@requireAttrs(socket.socket, "recvmsg_into")
4152class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4153 pass
4154
4155
4156@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4157 'UDPLITE sockets required for this test.')
4158class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4159 SendrecvmsgConnectionlessBase,
4160 ThreadedSocketTestMixin, UDPLITE6TestBase):
4161
4162 def checkRecvmsgAddress(self, addr1, addr2):
4163 # Called to compare the received address with the address of
4164 # the peer, ignoring scope ID
4165 self.assertEqual(addr1[:-1], addr2[:-1])
4166
4167@requireAttrs(socket.socket, "sendmsg")
4168@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4169@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4170 'UDPLITE sockets required for this test.')
4171@requireSocket("AF_INET6", "SOCK_DGRAM")
4172class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4173 pass
4174
4175@requireAttrs(socket.socket, "recvmsg")
4176@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4177@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4178 'UDPLITE sockets required for this test.')
4179@requireSocket("AF_INET6", "SOCK_DGRAM")
4180class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4181 pass
4182
4183@requireAttrs(socket.socket, "recvmsg_into")
4184@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4185@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4186 'UDPLITE sockets required for this test.')
4187@requireSocket("AF_INET6", "SOCK_DGRAM")
4188class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4189 pass
4190
4191@requireAttrs(socket.socket, "recvmsg")
4192@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4193@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4194 'UDPLITE sockets required for this test.')
4195@requireAttrs(socket, "IPPROTO_IPV6")
4196@requireSocket("AF_INET6", "SOCK_DGRAM")
4197class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4198 SendrecvmsgUDPLITE6TestBase):
4199 pass
4200
4201@requireAttrs(socket.socket, "recvmsg_into")
4202@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4203@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4204 'UDPLITE sockets required for this test.')
4205@requireAttrs(socket, "IPPROTO_IPV6")
4206@requireSocket("AF_INET6", "SOCK_DGRAM")
4207class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4208 RFC3542AncillaryTest,
4209 SendrecvmsgUDPLITE6TestBase):
4210 pass
4211
4212
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004213class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4214 ConnectedStreamTestMixin, TCPTestBase):
4215 pass
4216
4217@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004218class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4219 pass
4220
4221@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004222class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4223 SendrecvmsgTCPTestBase):
4224 pass
4225
4226@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004227class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4228 SendrecvmsgTCPTestBase):
4229 pass
4230
4231
4232class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4233 SendrecvmsgConnectedBase,
4234 ConnectedStreamTestMixin, SCTPStreamBase):
4235 pass
4236
4237@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004238@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004239@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004240class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4241 pass
4242
4243@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004244@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004245@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004246class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4247 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004248
4249 def testRecvmsgEOF(self):
4250 try:
4251 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4252 except OSError as e:
4253 if e.errno != errno.ENOTCONN:
4254 raise
4255 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004256
4257@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004258@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004259@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004260class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4261 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004262
4263 def testRecvmsgEOF(self):
4264 try:
4265 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4266 except OSError as e:
4267 if e.errno != errno.ENOTCONN:
4268 raise
4269 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004270
4271
4272class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4273 ConnectedStreamTestMixin, UnixStreamBase):
4274 pass
4275
4276@requireAttrs(socket.socket, "sendmsg")
4277@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004278class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4279 pass
4280
4281@requireAttrs(socket.socket, "recvmsg")
4282@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004283class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4284 SendrecvmsgUnixStreamTestBase):
4285 pass
4286
4287@requireAttrs(socket.socket, "recvmsg_into")
4288@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004289class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4290 SendrecvmsgUnixStreamTestBase):
4291 pass
4292
4293@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4294@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004295class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4296 pass
4297
4298@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4299@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004300class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4301 SendrecvmsgUnixStreamTestBase):
4302 pass
4303
4304
4305# Test interrupting the interruptible send/receive methods with a
4306# signal when a timeout is set. These tests avoid having multiple
4307# threads alive during the test so that the OS cannot deliver the
4308# signal to the wrong one.
4309
4310class InterruptedTimeoutBase(unittest.TestCase):
4311 # Base class for interrupted send/receive tests. Installs an
4312 # empty handler for SIGALRM and removes it on teardown, along with
4313 # any scheduled alarms.
4314
4315 def setUp(self):
4316 super().setUp()
4317 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004318 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004319 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004320
4321 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004322 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004323
4324 # Provide setAlarm() method to schedule delivery of SIGALRM after
4325 # given number of seconds, or cancel it if zero, and an
4326 # appropriate time value to use. Use setitimer() if available.
4327 if hasattr(signal, "setitimer"):
4328 alarm_time = 0.05
4329
4330 def setAlarm(self, seconds):
4331 signal.setitimer(signal.ITIMER_REAL, seconds)
4332 else:
4333 # Old systems may deliver the alarm up to one second early
4334 alarm_time = 2
4335
4336 def setAlarm(self, seconds):
4337 signal.alarm(seconds)
4338
4339
4340# Require siginterrupt() in order to ensure that system calls are
4341# interrupted by default.
4342@requireAttrs(signal, "siginterrupt")
4343@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4344 "Don't have signal.alarm or signal.setitimer")
4345class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4346 # Test interrupting the recv*() methods with signals when a
4347 # timeout is set.
4348
4349 def setUp(self):
4350 super().setUp()
4351 self.serv.settimeout(self.timeout)
4352
4353 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004354 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004355 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004356 try:
4357 self.setAlarm(self.alarm_time)
4358 with self.assertRaises(ZeroDivisionError) as cm:
4359 func(*args, **kwargs)
4360 finally:
4361 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004362
4363 def testInterruptedRecvTimeout(self):
4364 self.checkInterruptedRecv(self.serv.recv, 1024)
4365
4366 def testInterruptedRecvIntoTimeout(self):
4367 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4368
4369 def testInterruptedRecvfromTimeout(self):
4370 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4371
4372 def testInterruptedRecvfromIntoTimeout(self):
4373 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4374
4375 @requireAttrs(socket.socket, "recvmsg")
4376 def testInterruptedRecvmsgTimeout(self):
4377 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4378
4379 @requireAttrs(socket.socket, "recvmsg_into")
4380 def testInterruptedRecvmsgIntoTimeout(self):
4381 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4382
4383
4384# Require siginterrupt() in order to ensure that system calls are
4385# interrupted by default.
4386@requireAttrs(signal, "siginterrupt")
4387@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4388 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004389class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4390 ThreadSafeCleanupTestCase,
4391 SocketListeningTestMixin, TCPTestBase):
4392 # Test interrupting the interruptible send*() methods with signals
4393 # when a timeout is set.
4394
4395 def setUp(self):
4396 super().setUp()
4397 self.serv_conn = self.newSocket()
4398 self.addCleanup(self.serv_conn.close)
4399 # Use a thread to complete the connection, but wait for it to
4400 # terminate before running the test, so that there is only one
4401 # thread to accept the signal.
4402 cli_thread = threading.Thread(target=self.doConnect)
4403 cli_thread.start()
4404 self.cli_conn, addr = self.serv.accept()
4405 self.addCleanup(self.cli_conn.close)
4406 cli_thread.join()
4407 self.serv_conn.settimeout(self.timeout)
4408
4409 def doConnect(self):
4410 self.serv_conn.connect(self.serv_addr)
4411
4412 def checkInterruptedSend(self, func, *args, **kwargs):
4413 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004414 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004415 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004416 try:
4417 with self.assertRaises(ZeroDivisionError) as cm:
4418 while True:
4419 self.setAlarm(self.alarm_time)
4420 func(*args, **kwargs)
4421 finally:
4422 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004423
Ned Deilyc5640382014-02-03 13:58:31 -08004424 # Issue #12958: The following tests have problems on OS X prior to 10.7
4425 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004426 def testInterruptedSendTimeout(self):
4427 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4428
Ned Deilyc5640382014-02-03 13:58:31 -08004429 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004430 def testInterruptedSendtoTimeout(self):
4431 # Passing an actual address here as Python's wrapper for
4432 # sendto() doesn't allow passing a zero-length one; POSIX
4433 # requires that the address is ignored since the socket is
4434 # connection-mode, however.
4435 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4436 self.serv_addr)
4437
Ned Deilyc5640382014-02-03 13:58:31 -08004438 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004439 @requireAttrs(socket.socket, "sendmsg")
4440 def testInterruptedSendmsgTimeout(self):
4441 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4442
4443
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004444class TCPCloserTest(ThreadedTCPSocketTest):
4445
4446 def testClose(self):
4447 conn, addr = self.serv.accept()
4448 conn.close()
4449
4450 sd = self.cli
4451 read, write, err = select.select([sd], [], [], 1.0)
4452 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004453 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004454
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004455 # Calling close() many times should be safe.
4456 conn.close()
4457 conn.close()
4458
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004459 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004460 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004461 time.sleep(1.0)
4462
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004463
Dave Cole331708b2004-08-09 04:51:41 +00004464class BasicSocketPairTest(SocketPairTest):
4465
4466 def __init__(self, methodName='runTest'):
4467 SocketPairTest.__init__(self, methodName=methodName)
4468
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004469 def _check_defaults(self, sock):
4470 self.assertIsInstance(sock, socket.socket)
4471 if hasattr(socket, 'AF_UNIX'):
4472 self.assertEqual(sock.family, socket.AF_UNIX)
4473 else:
4474 self.assertEqual(sock.family, socket.AF_INET)
4475 self.assertEqual(sock.type, socket.SOCK_STREAM)
4476 self.assertEqual(sock.proto, 0)
4477
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004478 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004479 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004480
4481 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004482 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004483
Dave Cole331708b2004-08-09 04:51:41 +00004484 def testRecv(self):
4485 msg = self.serv.recv(1024)
4486 self.assertEqual(msg, MSG)
4487
4488 def _testRecv(self):
4489 self.cli.send(MSG)
4490
4491 def testSend(self):
4492 self.serv.send(MSG)
4493
4494 def _testSend(self):
4495 msg = self.cli.recv(1024)
4496 self.assertEqual(msg, MSG)
4497
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004498
Guido van Rossum24e4af82002-06-12 19:18:08 +00004499class NonBlockingTCPTests(ThreadedTCPSocketTest):
4500
4501 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004502 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004503 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4504
Victor Stinner304315d2018-11-30 13:22:44 +01004505 def assert_sock_timeout(self, sock, timeout):
4506 self.assertEqual(self.serv.gettimeout(), timeout)
4507
4508 blocking = (timeout != 0.0)
4509 self.assertEqual(sock.getblocking(), blocking)
4510
4511 if fcntl is not None:
4512 # When a Python socket has a non-zero timeout, it's switched
4513 # internally to a non-blocking mode. Later, sock.sendall(),
4514 # sock.recv(), and other socket operations use a select() call and
4515 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4516 # timeouts are enforced.
4517 fd_blocking = (timeout is None)
4518
4519 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4520 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4521
Guido van Rossum24e4af82002-06-12 19:18:08 +00004522 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004523 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004524 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004525 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004526
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004527 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004528 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004529
4530 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004531 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004532
4533 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004534 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004535
4536 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004537 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004538
4539 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004540 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004541
4542 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004543 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004544
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004545 @support.cpython_only
4546 def testSetBlocking_overflow(self):
4547 # Issue 15989
4548 import _testcapi
4549 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4550 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004551
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004552 self.serv.setblocking(False)
4553 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004554
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004555 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4556 self.assertIsNone(self.serv.gettimeout())
4557
4558 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4559
Serhiy Storchaka43767632013-11-03 21:31:38 +02004560 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4561 'test needs socket.SOCK_NONBLOCK')
4562 @support.requires_linux_version(2, 6, 28)
4563 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004564 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004565 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004566 self.serv = socket.socket(socket.AF_INET,
4567 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4568 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004569
4570 def _testInitNonBlocking(self):
4571 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004572
Victor Stinner304315d2018-11-30 13:22:44 +01004573 def testInheritFlagsBlocking(self):
4574 # bpo-7995: accept() on a listening socket with a timeout and the
4575 # default timeout is None, the resulting socket must be blocking.
4576 with socket_setdefaulttimeout(None):
4577 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004578 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004579 self.addCleanup(conn.close)
4580 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004581
Victor Stinner304315d2018-11-30 13:22:44 +01004582 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004583 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004584
4585 def testInheritFlagsTimeout(self):
4586 # bpo-7995: accept() on a listening socket with a timeout and the
4587 # default timeout is None, the resulting socket must inherit
4588 # the default timeout.
4589 default_timeout = 20.0
4590 with socket_setdefaulttimeout(default_timeout):
4591 self.serv.settimeout(10)
4592 conn, addr = self.serv.accept()
4593 self.addCleanup(conn.close)
4594 self.assertEqual(conn.gettimeout(), default_timeout)
4595
4596 def _testInheritFlagsTimeout(self):
4597 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004598
Guido van Rossum24e4af82002-06-12 19:18:08 +00004599 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004600 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004601 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004602
4603 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004604 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004605 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004606 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004607 dt = time.monotonic() - start_time
4608 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004609
4610 self.event.set()
4611
Victor Stinner24c62582019-10-30 12:41:43 +01004612 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004613 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004614 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004615
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004616 # connect() completed: non-blocking accept() doesn't block
4617 conn, addr = self.serv.accept()
4618 self.addCleanup(conn.close)
4619 self.assertIsNone(conn.gettimeout())
4620
Guido van Rossum24e4af82002-06-12 19:18:08 +00004621 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004622 # don't connect before event is set to check
4623 # that non-blocking accept() raises BlockingIOError
4624 self.event.wait()
4625
Christian Heimes5e696852008-04-09 08:37:03 +00004626 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004627
Guido van Rossum24e4af82002-06-12 19:18:08 +00004628 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004629 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004630 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004631 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004632 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004633
4634 # the server didn't send data yet: non-blocking recv() fails
4635 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004636 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004637
4638 self.event.set()
4639
Victor Stinner24c62582019-10-30 12:41:43 +01004640 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004641 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004642 self.fail("Error during select call to non-blocking socket.")
4643
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004644 # the server sent data yet: non-blocking recv() doesn't block
4645 msg = conn.recv(len(MSG))
4646 self.assertEqual(msg, MSG)
4647
Guido van Rossum24e4af82002-06-12 19:18:08 +00004648 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004649 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004650
4651 # don't send anything before event is set to check
4652 # that non-blocking recv() raises BlockingIOError
4653 self.event.wait()
4654
4655 # send data: recv() will no longer block
4656 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004657
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004658
Guido van Rossum24e4af82002-06-12 19:18:08 +00004659class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004660 """Unit tests for the object returned by socket.makefile()
4661
Antoine Pitrou834bd812010-10-13 16:17:14 +00004662 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004663 the client connection. You can read from this file to
4664 get output from the server.
4665
Antoine Pitrou834bd812010-10-13 16:17:14 +00004666 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004667 server connection. You can write to this file to send output
4668 to the client.
4669 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004670
Guido van Rossume9f66142002-08-07 15:46:19 +00004671 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004672 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004673 errors = 'strict'
4674 newline = None
4675
4676 read_mode = 'rb'
4677 read_msg = MSG
4678 write_mode = 'wb'
4679 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004680
Guido van Rossum24e4af82002-06-12 19:18:08 +00004681 def __init__(self, methodName='runTest'):
4682 SocketConnectedTest.__init__(self, methodName=methodName)
4683
4684 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004685 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4686 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004687 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004688 self.read_file = self.cli_conn.makefile(
4689 self.read_mode, self.bufsize,
4690 encoding = self.encoding,
4691 errors = self.errors,
4692 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004693
4694 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004695 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004696 self.read_file.close()
4697 self.assertTrue(self.read_file.closed)
4698 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004699 SocketConnectedTest.tearDown(self)
4700
4701 def clientSetUp(self):
4702 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004703 self.write_file = self.serv_conn.makefile(
4704 self.write_mode, self.bufsize,
4705 encoding = self.encoding,
4706 errors = self.errors,
4707 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004708
4709 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004710 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004711 self.write_file.close()
4712 self.assertTrue(self.write_file.closed)
4713 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004714 SocketConnectedTest.clientTearDown(self)
4715
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004716 def testReadAfterTimeout(self):
4717 # Issue #7322: A file object must disallow further reads
4718 # after a timeout has occurred.
4719 self.cli_conn.settimeout(1)
4720 self.read_file.read(3)
4721 # First read raises a timeout
4722 self.assertRaises(socket.timeout, self.read_file.read, 1)
4723 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004724 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004725 self.read_file.read(1)
4726 self.assertIn("cannot read from timed out object", str(ctx.exception))
4727
4728 def _testReadAfterTimeout(self):
4729 self.write_file.write(self.write_msg[0:3])
4730 self.write_file.flush()
4731 self.serv_finished.wait()
4732
Guido van Rossum24e4af82002-06-12 19:18:08 +00004733 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004734 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004735 first_seg = self.read_file.read(len(self.read_msg)-3)
4736 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004737 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004738 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004739
4740 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004741 self.write_file.write(self.write_msg)
4742 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004743
Guido van Rossum8c943832002-08-08 01:00:28 +00004744 def testFullRead(self):
4745 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004746 msg = self.read_file.read()
4747 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004748
4749 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004750 self.write_file.write(self.write_msg)
4751 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004752
Guido van Rossum24e4af82002-06-12 19:18:08 +00004753 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004754 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004755 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004756 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004757 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004758 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004759 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004760 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004761 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004762
4763 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004764 self.write_file.write(self.write_msg)
4765 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004766
4767 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004768 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004769 line = self.read_file.readline()
4770 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004771
4772 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004773 self.write_file.write(self.write_msg)
4774 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004775
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004776 def testCloseAfterMakefile(self):
4777 # The file returned by makefile should keep the socket open.
4778 self.cli_conn.close()
4779 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004780 msg = self.read_file.read()
4781 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004782
4783 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004784 self.write_file.write(self.write_msg)
4785 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004786
4787 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004788 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004789 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004790 if isinstance(self.read_msg, str):
4791 msg = msg.decode()
4792 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004793
4794 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004795 self.write_file.write(self.write_msg)
4796 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004797
Tim Peters116d83c2004-03-28 02:20:45 +00004798 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004799 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004800
4801 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004802 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004803
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004804 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004805 self.assertEqual(self.read_file.mode, self.read_mode)
4806 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004807
4808 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004809 self.assertEqual(self.write_file.mode, self.write_mode)
4810 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004811
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004812 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004813 self.read_file.close()
4814 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004815 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004816 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004817
4818 def _testRealClose(self):
4819 pass
4820
4821
Guido van Rossume9f66142002-08-07 15:46:19 +00004822class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4823
4824 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004825
Guido van Rossume9f66142002-08-07 15:46:19 +00004826 In this case (and in this case only), it should be possible to
4827 create a file object, read a line from it, create another file
4828 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004829 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004830 when reading multiple requests from the same socket."""
4831
4832 bufsize = 0 # Use unbuffered mode
4833
4834 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004835 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004836 line = self.read_file.readline() # first line
4837 self.assertEqual(line, b"A. " + self.write_msg) # first line
4838 self.read_file = self.cli_conn.makefile('rb', 0)
4839 line = self.read_file.readline() # second line
4840 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004841
4842 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004843 self.write_file.write(b"A. " + self.write_msg)
4844 self.write_file.write(b"B. " + self.write_msg)
4845 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004846
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004847 def testMakefileClose(self):
4848 # The file returned by makefile should keep the socket open...
4849 self.cli_conn.close()
4850 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004851 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004852 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004853 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004854 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004855
4856 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004857 self.write_file.write(self.write_msg)
4858 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004859
4860 def testMakefileCloseSocketDestroy(self):
4861 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004862 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004863 refcount_after = sys.getrefcount(self.cli_conn)
4864 self.assertEqual(refcount_before - 1, refcount_after)
4865
4866 def _testMakefileCloseSocketDestroy(self):
4867 pass
4868
Antoine Pitrou98b46702010-09-18 22:59:00 +00004869 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004870 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004871 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4872
4873 def testSmallReadNonBlocking(self):
4874 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004875 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4876 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004877 self.evt1.set()
4878 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004879 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004880 if first_seg is None:
4881 # Data not arrived (can happen under Windows), wait a bit
4882 time.sleep(0.5)
4883 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004884 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004885 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004886 self.assertEqual(n, 3)
4887 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004888 self.assertEqual(msg, self.read_msg)
4889 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4890 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004891
4892 def _testSmallReadNonBlocking(self):
4893 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004894 self.write_file.write(self.write_msg)
4895 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004896 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004897 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004898 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4899 self.serv_finished.wait(5.0)
4900
4901 def testWriteNonBlocking(self):
4902 self.cli_finished.wait(5.0)
4903 # The client thread can't skip directly - the SkipTest exception
4904 # would appear as a failure.
4905 if self.serv_skipped:
4906 self.skipTest(self.serv_skipped)
4907
4908 def _testWriteNonBlocking(self):
4909 self.serv_skipped = None
4910 self.serv_conn.setblocking(False)
4911 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004912 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004913 LIMIT = 10
4914 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004915 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004916 self.assertGreater(n, 0)
4917 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004918 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004919 if n is None:
4920 # Succeeded
4921 break
4922 self.assertGreater(n, 0)
4923 else:
4924 # Let us know that this test didn't manage to establish
4925 # the expected conditions. This is not a failure in itself but,
4926 # if it happens repeatedly, the test should be fixed.
4927 self.serv_skipped = "failed to saturate the socket buffer"
4928
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004929
Guido van Rossum8c943832002-08-08 01:00:28 +00004930class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4931
4932 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4933
4934
4935class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4936
4937 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004938
Thomas Woutersb2137042007-02-01 18:02:27 +00004939
Antoine Pitrou834bd812010-10-13 16:17:14 +00004940class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4941 """Tests for socket.makefile() in text mode (rather than binary)"""
4942
4943 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004944 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004945 write_mode = 'wb'
4946 write_msg = MSG
4947 newline = ''
4948
4949
4950class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4951 """Tests for socket.makefile() in text mode (rather than binary)"""
4952
4953 read_mode = 'rb'
4954 read_msg = MSG
4955 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004956 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004957 newline = ''
4958
4959
4960class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4961 """Tests for socket.makefile() in text mode (rather than binary)"""
4962
4963 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004964 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004965 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004966 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004967 newline = ''
4968
4969
Guido van Rossumd8faa362007-04-27 19:54:29 +00004970class NetworkConnectionTest(object):
4971 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004972
Guido van Rossumd8faa362007-04-27 19:54:29 +00004973 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004974 # We're inherited below by BasicTCPTest2, which also inherits
4975 # BasicTCPTest, which defines self.port referenced below.
4976 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004977 self.serv_conn = self.cli
4978
4979class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4980 """Tests that NetworkConnection does not break existing TCP functionality.
4981 """
4982
4983class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004984
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004985 class MockSocket(socket.socket):
4986 def connect(self, *args):
4987 raise socket.timeout('timed out')
4988
4989 @contextlib.contextmanager
4990 def mocked_socket_module(self):
4991 """Return a socket which times out on connect"""
4992 old_socket = socket.socket
4993 socket.socket = self.MockSocket
4994 try:
4995 yield
4996 finally:
4997 socket.socket = old_socket
4998
4999 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005000 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005001 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005002 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005003 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005004 cli.connect((HOST, port))
5005 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5006
5007 def test_create_connection(self):
5008 # Issue #9792: errors raised by create_connection() should have
5009 # a proper errno attribute.
5010 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005011 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005012 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005013
5014 # Issue #16257: create_connection() calls getaddrinfo() against
5015 # 'localhost'. This may result in an IPV6 addr being returned
5016 # as well as an IPV4 one:
5017 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5018 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5019 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5020 #
5021 # create_connection() enumerates through all the addresses returned
5022 # and if it doesn't successfully bind to any of them, it propagates
5023 # the last exception it encountered.
5024 #
5025 # On Solaris, ENETUNREACH is returned in this circumstance instead
5026 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5027 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02005028 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005029 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005030
5031 def test_create_connection_timeout(self):
5032 # Issue #9792: create_connection() should not recast timeout errors
5033 # as generic socket errors.
5034 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005035 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005036 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005037 except socket.timeout:
5038 pass
5039 except OSError as exc:
5040 if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
5041 raise
5042 else:
5043 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005044
Guido van Rossumd8faa362007-04-27 19:54:29 +00005045
5046class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5047
5048 def __init__(self, methodName='runTest'):
5049 SocketTCPTest.__init__(self, methodName=methodName)
5050 ThreadableTest.__init__(self)
5051
5052 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00005053 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005054
5055 def clientTearDown(self):
5056 self.cli.close()
5057 self.cli = None
5058 ThreadableTest.clientTearDown(self)
5059
5060 def _justAccept(self):
5061 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005062 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005063
5064 testFamily = _justAccept
5065 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005066 self.cli = socket.create_connection((HOST, self.port),
5067 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005068 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005069 self.assertEqual(self.cli.family, 2)
5070
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005071 testSourceAddress = _justAccept
5072 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005073 self.cli = socket.create_connection((HOST, self.port),
5074 timeout=support.LOOPBACK_TIMEOUT,
5075 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005076 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005077 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005078 # The port number being used is sufficient to show that the bind()
5079 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005080
Guido van Rossumd8faa362007-04-27 19:54:29 +00005081 testTimeoutDefault = _justAccept
5082 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005083 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005084 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005085 socket.setdefaulttimeout(42)
5086 try:
5087 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005088 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005089 finally:
5090 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005091 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005092
5093 testTimeoutNone = _justAccept
5094 def _testTimeoutNone(self):
5095 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005096 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005097 socket.setdefaulttimeout(30)
5098 try:
5099 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005100 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005101 finally:
5102 socket.setdefaulttimeout(None)
5103 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005104
5105 testTimeoutValueNamed = _justAccept
5106 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005107 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005108 self.assertEqual(self.cli.gettimeout(), 30)
5109
5110 testTimeoutValueNonamed = _justAccept
5111 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005112 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005113 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005114 self.assertEqual(self.cli.gettimeout(), 30)
5115
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005116
Guido van Rossumd8faa362007-04-27 19:54:29 +00005117class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5118
5119 def __init__(self, methodName='runTest'):
5120 SocketTCPTest.__init__(self, methodName=methodName)
5121 ThreadableTest.__init__(self)
5122
5123 def clientSetUp(self):
5124 pass
5125
5126 def clientTearDown(self):
5127 self.cli.close()
5128 self.cli = None
5129 ThreadableTest.clientTearDown(self)
5130
5131 def testInsideTimeout(self):
5132 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005133 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005134 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005135 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005136 testOutsideTimeout = testInsideTimeout
5137
5138 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005139 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005140 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005141 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005142
5143 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005144 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005145 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005146
5147
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005148class TCPTimeoutTest(SocketTCPTest):
5149
5150 def testTCPTimeout(self):
5151 def raise_timeout(*args, **kwargs):
5152 self.serv.settimeout(1.0)
5153 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005154 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005155 "Error generating a timeout exception (TCP)")
5156
5157 def testTimeoutZero(self):
5158 ok = False
5159 try:
5160 self.serv.settimeout(0.0)
5161 foo = self.serv.accept()
5162 except socket.timeout:
5163 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005164 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005165 ok = True
5166 except:
5167 self.fail("caught unexpected exception (TCP)")
5168 if not ok:
5169 self.fail("accept() returned success when we did not expect it")
5170
Serhiy Storchaka43767632013-11-03 21:31:38 +02005171 @unittest.skipUnless(hasattr(signal, 'alarm'),
5172 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005173 def testInterruptedTimeout(self):
5174 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005175 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005176 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005177 self.serv.settimeout(5.0) # must be longer than alarm
5178 class Alarm(Exception):
5179 pass
5180 def alarm_handler(signal, frame):
5181 raise Alarm
5182 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5183 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005184 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005185 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005186 foo = self.serv.accept()
5187 except socket.timeout:
5188 self.fail("caught timeout instead of Alarm")
5189 except Alarm:
5190 pass
5191 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005192 self.fail("caught other exception instead of Alarm:"
5193 " %s(%s):\n%s" %
5194 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005195 else:
5196 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005197 finally:
5198 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005199 except Alarm:
5200 self.fail("got Alarm in wrong place")
5201 finally:
5202 # no alarm can be pending. Safe to restore old handler.
5203 signal.signal(signal.SIGALRM, old_alarm)
5204
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005205class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005206
5207 def testUDPTimeout(self):
5208 def raise_timeout(*args, **kwargs):
5209 self.serv.settimeout(1.0)
5210 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005211 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005212 "Error generating a timeout exception (UDP)")
5213
5214 def testTimeoutZero(self):
5215 ok = False
5216 try:
5217 self.serv.settimeout(0.0)
5218 foo = self.serv.recv(1024)
5219 except socket.timeout:
5220 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005221 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005222 ok = True
5223 except:
5224 self.fail("caught unexpected exception (UDP)")
5225 if not ok:
5226 self.fail("recv() returned success when we did not expect it")
5227
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005228@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5229 'UDPLITE sockets required for this test.')
5230class UDPLITETimeoutTest(SocketUDPLITETest):
5231
5232 def testUDPLITETimeout(self):
5233 def raise_timeout(*args, **kwargs):
5234 self.serv.settimeout(1.0)
5235 self.serv.recv(1024)
5236 self.assertRaises(socket.timeout, raise_timeout,
5237 "Error generating a timeout exception (UDPLITE)")
5238
5239 def testTimeoutZero(self):
5240 ok = False
5241 try:
5242 self.serv.settimeout(0.0)
5243 foo = self.serv.recv(1024)
5244 except socket.timeout:
5245 self.fail("caught timeout instead of error (UDPLITE)")
5246 except OSError:
5247 ok = True
5248 except:
5249 self.fail("caught unexpected exception (UDPLITE)")
5250 if not ok:
5251 self.fail("recv() returned success when we did not expect it")
5252
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005253class TestExceptions(unittest.TestCase):
5254
5255 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005256 self.assertTrue(issubclass(OSError, Exception))
5257 self.assertTrue(issubclass(socket.herror, OSError))
5258 self.assertTrue(issubclass(socket.gaierror, OSError))
5259 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005260
Yury Selivanovfa22b292016-10-18 16:03:52 -04005261 def test_setblocking_invalidfd(self):
5262 # Regression test for issue #28471
5263
5264 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5265 sock = socket.socket(
5266 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5267 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005268 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005269
5270 with self.assertRaises(OSError):
5271 sock.setblocking(False)
5272
5273
Serhiy Storchaka43767632013-11-03 21:31:38 +02005274@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005275class TestLinuxAbstractNamespace(unittest.TestCase):
5276
5277 UNIX_PATH_MAX = 108
5278
5279 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005280 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005281 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5282 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005283 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005284 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5285 s2.connect(s1.getsockname())
5286 with s1.accept()[0] as s3:
5287 self.assertEqual(s1.getsockname(), address)
5288 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005289
5290 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005291 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005292 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5293 s.bind(address)
5294 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005295
5296 def testNameOverflow(self):
5297 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005298 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005299 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005300
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005301 def testStrName(self):
5302 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005303 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5304 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005305 s.bind("\x00python\x00test\x00")
5306 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005307 finally:
5308 s.close()
5309
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005310 def testBytearrayName(self):
5311 # Check that an abstract name can be passed as a bytearray.
5312 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5313 s.bind(bytearray(b"\x00python\x00test\x00"))
5314 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5315
Serhiy Storchaka43767632013-11-03 21:31:38 +02005316@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005317class TestUnixDomain(unittest.TestCase):
5318
5319 def setUp(self):
5320 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5321
5322 def tearDown(self):
5323 self.sock.close()
5324
5325 def encoded(self, path):
5326 # Return the given path encoded in the file system encoding,
5327 # or skip the test if this is not possible.
5328 try:
5329 return os.fsencode(path)
5330 except UnicodeEncodeError:
5331 self.skipTest(
5332 "Pathname {0!a} cannot be represented in file "
5333 "system encoding {1!r}".format(
5334 path, sys.getfilesystemencoding()))
5335
Antoine Pitrou16374872011-12-16 15:04:12 +01005336 def bind(self, sock, path):
5337 # Bind the socket
5338 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005339 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005340 except OSError as e:
5341 if str(e) == "AF_UNIX path too long":
5342 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005343 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005344 .format(path))
5345 else:
5346 raise
5347
Antoine Pitrou495b5022017-05-02 17:20:00 +02005348 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005349 # Issue #30205 (note getsockname() can return None on OS X)
5350 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005351
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005352 def testStrAddr(self):
5353 # Test binding to and retrieving a normal string pathname.
5354 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005355 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005356 self.addCleanup(support.unlink, path)
5357 self.assertEqual(self.sock.getsockname(), path)
5358
5359 def testBytesAddr(self):
5360 # Test binding to a bytes pathname.
5361 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005362 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005363 self.addCleanup(support.unlink, path)
5364 self.assertEqual(self.sock.getsockname(), path)
5365
5366 def testSurrogateescapeBind(self):
5367 # Test binding to a valid non-ASCII pathname, with the
5368 # non-ASCII bytes supplied using surrogateescape encoding.
5369 path = os.path.abspath(support.TESTFN_UNICODE)
5370 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005371 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005372 self.addCleanup(support.unlink, path)
5373 self.assertEqual(self.sock.getsockname(), path)
5374
5375 def testUnencodableAddr(self):
5376 # Test binding to a pathname that cannot be encoded in the
5377 # file system encoding.
5378 if support.TESTFN_UNENCODABLE is None:
5379 self.skipTest("No unencodable filename available")
5380 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005381 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005382 self.addCleanup(support.unlink, path)
5383 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005384
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005385
Thomas Wouters477c8d52006-05-27 19:21:47 +00005386class BufferIOTest(SocketConnectedTest):
5387 """
5388 Test the buffer versions of socket.recv() and socket.send().
5389 """
5390 def __init__(self, methodName='runTest'):
5391 SocketConnectedTest.__init__(self, methodName=methodName)
5392
Antoine Pitrou25480782010-03-17 22:50:28 +00005393 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005394 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005395 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005396 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005397 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005398 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005399 self.assertEqual(msg, MSG)
5400
Antoine Pitrou25480782010-03-17 22:50:28 +00005401 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005402 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005403 self.serv_conn.send(buf)
5404
Antoine Pitrou25480782010-03-17 22:50:28 +00005405 def testRecvIntoBytearray(self):
5406 buf = bytearray(1024)
5407 nbytes = self.cli_conn.recv_into(buf)
5408 self.assertEqual(nbytes, len(MSG))
5409 msg = buf[:len(MSG)]
5410 self.assertEqual(msg, MSG)
5411
5412 _testRecvIntoBytearray = _testRecvIntoArray
5413
5414 def testRecvIntoMemoryview(self):
5415 buf = bytearray(1024)
5416 nbytes = self.cli_conn.recv_into(memoryview(buf))
5417 self.assertEqual(nbytes, len(MSG))
5418 msg = buf[:len(MSG)]
5419 self.assertEqual(msg, MSG)
5420
5421 _testRecvIntoMemoryview = _testRecvIntoArray
5422
5423 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005424 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005425 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005426 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005427 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005428 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005429 self.assertEqual(msg, MSG)
5430
Antoine Pitrou25480782010-03-17 22:50:28 +00005431 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005432 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005433 self.serv_conn.send(buf)
5434
Antoine Pitrou25480782010-03-17 22:50:28 +00005435 def testRecvFromIntoBytearray(self):
5436 buf = bytearray(1024)
5437 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5438 self.assertEqual(nbytes, len(MSG))
5439 msg = buf[:len(MSG)]
5440 self.assertEqual(msg, MSG)
5441
5442 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5443
5444 def testRecvFromIntoMemoryview(self):
5445 buf = bytearray(1024)
5446 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5447 self.assertEqual(nbytes, len(MSG))
5448 msg = buf[:len(MSG)]
5449 self.assertEqual(msg, MSG)
5450
5451 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5452
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005453 def testRecvFromIntoSmallBuffer(self):
5454 # See issue #20246.
5455 buf = bytearray(8)
5456 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5457
5458 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005459 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005460
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005461 def testRecvFromIntoEmptyBuffer(self):
5462 buf = bytearray()
5463 self.cli_conn.recvfrom_into(buf)
5464 self.cli_conn.recvfrom_into(buf, 0)
5465
5466 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5467
Christian Heimes043d6f62008-01-07 17:19:16 +00005468
5469TIPC_STYPE = 2000
5470TIPC_LOWER = 200
5471TIPC_UPPER = 210
5472
5473def isTipcAvailable():
5474 """Check if the TIPC module is loaded
5475
5476 The TIPC module is not loaded automatically on Ubuntu and probably
5477 other Linux distros.
5478 """
5479 if not hasattr(socket, "AF_TIPC"):
5480 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005481 try:
5482 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005483 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005484 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005485 # have not the permission to read it.
5486 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005487 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005488 for line in f:
5489 if line.startswith("tipc "):
5490 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005491 return False
5492
Serhiy Storchaka43767632013-11-03 21:31:38 +02005493@unittest.skipUnless(isTipcAvailable(),
5494 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005495class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005496 def testRDM(self):
5497 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5498 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005499 self.addCleanup(srv.close)
5500 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005501
5502 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5503 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5504 TIPC_LOWER, TIPC_UPPER)
5505 srv.bind(srvaddr)
5506
5507 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5508 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5509 cli.sendto(MSG, sendaddr)
5510
5511 msg, recvaddr = srv.recvfrom(1024)
5512
5513 self.assertEqual(cli.getsockname(), recvaddr)
5514 self.assertEqual(msg, MSG)
5515
5516
Serhiy Storchaka43767632013-11-03 21:31:38 +02005517@unittest.skipUnless(isTipcAvailable(),
5518 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005519class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005520 def __init__(self, methodName = 'runTest'):
5521 unittest.TestCase.__init__(self, methodName = methodName)
5522 ThreadableTest.__init__(self)
5523
5524 def setUp(self):
5525 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005526 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005527 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5528 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5529 TIPC_LOWER, TIPC_UPPER)
5530 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005531 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005532 self.serverExplicitReady()
5533 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005534 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005535
5536 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005537 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005538 # accept() call; sleep a little while to avoid it, otherwise
5539 # we could get an exception
5540 time.sleep(0.1)
5541 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005542 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005543 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5544 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5545 self.cli.connect(addr)
5546 self.cliaddr = self.cli.getsockname()
5547
5548 def testStream(self):
5549 msg = self.conn.recv(1024)
5550 self.assertEqual(msg, MSG)
5551 self.assertEqual(self.cliaddr, self.connaddr)
5552
5553 def _testStream(self):
5554 self.cli.send(MSG)
5555 self.cli.close()
5556
5557
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005558class ContextManagersTest(ThreadedTCPSocketTest):
5559
5560 def _testSocketClass(self):
5561 # base test
5562 with socket.socket() as sock:
5563 self.assertFalse(sock._closed)
5564 self.assertTrue(sock._closed)
5565 # close inside with block
5566 with socket.socket() as sock:
5567 sock.close()
5568 self.assertTrue(sock._closed)
5569 # exception inside with block
5570 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005571 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005572 self.assertTrue(sock._closed)
5573
5574 def testCreateConnectionBase(self):
5575 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005576 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005577 data = conn.recv(1024)
5578 conn.sendall(data)
5579
5580 def _testCreateConnectionBase(self):
5581 address = self.serv.getsockname()
5582 with socket.create_connection(address) as sock:
5583 self.assertFalse(sock._closed)
5584 sock.sendall(b'foo')
5585 self.assertEqual(sock.recv(1024), b'foo')
5586 self.assertTrue(sock._closed)
5587
5588 def testCreateConnectionClose(self):
5589 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005590 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005591 data = conn.recv(1024)
5592 conn.sendall(data)
5593
5594 def _testCreateConnectionClose(self):
5595 address = self.serv.getsockname()
5596 with socket.create_connection(address) as sock:
5597 sock.close()
5598 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005599 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005600
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005601
Victor Stinnerdaf45552013-08-28 00:53:59 +02005602class InheritanceTest(unittest.TestCase):
5603 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5604 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005605 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005606 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005607 with socket.socket(socket.AF_INET,
5608 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005609 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005610 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005611
5612 def test_default_inheritable(self):
5613 sock = socket.socket()
5614 with sock:
5615 self.assertEqual(sock.get_inheritable(), False)
5616
5617 def test_dup(self):
5618 sock = socket.socket()
5619 with sock:
5620 newsock = sock.dup()
5621 sock.close()
5622 with newsock:
5623 self.assertEqual(newsock.get_inheritable(), False)
5624
5625 def test_set_inheritable(self):
5626 sock = socket.socket()
5627 with sock:
5628 sock.set_inheritable(True)
5629 self.assertEqual(sock.get_inheritable(), True)
5630
5631 sock.set_inheritable(False)
5632 self.assertEqual(sock.get_inheritable(), False)
5633
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005634 @unittest.skipIf(fcntl is None, "need fcntl")
5635 def test_get_inheritable_cloexec(self):
5636 sock = socket.socket()
5637 with sock:
5638 fd = sock.fileno()
5639 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005640
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005641 # clear FD_CLOEXEC flag
5642 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5643 flags &= ~fcntl.FD_CLOEXEC
5644 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005645
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005646 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005647
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005648 @unittest.skipIf(fcntl is None, "need fcntl")
5649 def test_set_inheritable_cloexec(self):
5650 sock = socket.socket()
5651 with sock:
5652 fd = sock.fileno()
5653 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5654 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005655
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005656 sock.set_inheritable(True)
5657 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5658 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005659
5660
Victor Stinnerdaf45552013-08-28 00:53:59 +02005661 def test_socketpair(self):
5662 s1, s2 = socket.socketpair()
5663 self.addCleanup(s1.close)
5664 self.addCleanup(s2.close)
5665 self.assertEqual(s1.get_inheritable(), False)
5666 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005667
5668
5669@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5670 "SOCK_NONBLOCK not defined")
5671class NonblockConstantTest(unittest.TestCase):
5672 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5673 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005674 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005675 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005676 self.assertTrue(
5677 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005678 if timeout == 0:
5679 # timeout == 0: means that getblocking() must be False.
5680 self.assertFalse(s.getblocking())
5681 else:
5682 # If timeout > 0, the socket will be in a "blocking" mode
5683 # from the standpoint of the Python API. For Python socket
5684 # object, "blocking" means that operations like 'sock.recv()'
5685 # will block. Internally, file descriptors for
5686 # "blocking" Python sockets *with timeouts* are in a
5687 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5688 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5689 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005690 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005691 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005692 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005693 self.assertFalse(
5694 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005695 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005696
Charles-François Natali239bb962011-06-03 12:55:15 +02005697 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005698 def test_SOCK_NONBLOCK(self):
5699 # a lot of it seems silly and redundant, but I wanted to test that
5700 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005701 with socket.socket(socket.AF_INET,
5702 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5703 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005704 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005705 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005706 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005707 self.checkNonblock(s)
5708 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005709 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005710 s.settimeout(2.0)
5711 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005712 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005713 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005714 # defaulttimeout
5715 t = socket.getdefaulttimeout()
5716 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005717 with socket.socket() as s:
5718 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005719 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005720 with socket.socket() as s:
5721 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005722 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005723 with socket.socket() as s:
5724 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005725 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005726 with socket.socket() as s:
5727 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005728 socket.setdefaulttimeout(t)
5729
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005730
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005731@unittest.skipUnless(os.name == "nt", "Windows specific")
5732@unittest.skipUnless(multiprocessing, "need multiprocessing")
5733class TestSocketSharing(SocketTCPTest):
5734 # This must be classmethod and not staticmethod or multiprocessing
5735 # won't be able to bootstrap it.
5736 @classmethod
5737 def remoteProcessServer(cls, q):
5738 # Recreate socket from shared data
5739 sdata = q.get()
5740 message = q.get()
5741
5742 s = socket.fromshare(sdata)
5743 s2, c = s.accept()
5744
5745 # Send the message
5746 s2.sendall(message)
5747 s2.close()
5748 s.close()
5749
5750 def testShare(self):
5751 # Transfer the listening server socket to another process
5752 # and service it from there.
5753
5754 # Create process:
5755 q = multiprocessing.Queue()
5756 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5757 p.start()
5758
5759 # Get the shared socket data
5760 data = self.serv.share(p.pid)
5761
5762 # Pass the shared socket to the other process
5763 addr = self.serv.getsockname()
5764 self.serv.close()
5765 q.put(data)
5766
5767 # The data that the server will send us
5768 message = b"slapmahfro"
5769 q.put(message)
5770
5771 # Connect
5772 s = socket.create_connection(addr)
5773 # listen for the data
5774 m = []
5775 while True:
5776 data = s.recv(100)
5777 if not data:
5778 break
5779 m.append(data)
5780 s.close()
5781 received = b"".join(m)
5782 self.assertEqual(received, message)
5783 p.join()
5784
5785 def testShareLength(self):
5786 data = self.serv.share(os.getpid())
5787 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5788 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5789
5790 def compareSockets(self, org, other):
5791 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005792 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005793 self.assertEqual(org.gettimeout(), None)
5794 self.assertEqual(org.gettimeout(), other.gettimeout())
5795
5796 self.assertEqual(org.family, other.family)
5797 self.assertEqual(org.type, other.type)
5798 # If the user specified "0" for proto, then
5799 # internally windows will have picked the correct value.
5800 # Python introspection on the socket however will still return
5801 # 0. For the shared socket, the python value is recreated
5802 # from the actual value, so it may not compare correctly.
5803 if org.proto != 0:
5804 self.assertEqual(org.proto, other.proto)
5805
5806 def testShareLocal(self):
5807 data = self.serv.share(os.getpid())
5808 s = socket.fromshare(data)
5809 try:
5810 self.compareSockets(self.serv, s)
5811 finally:
5812 s.close()
5813
5814 def testTypes(self):
5815 families = [socket.AF_INET, socket.AF_INET6]
5816 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5817 for f in families:
5818 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005819 try:
5820 source = socket.socket(f, t)
5821 except OSError:
5822 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005823 try:
5824 data = source.share(os.getpid())
5825 shared = socket.fromshare(data)
5826 try:
5827 self.compareSockets(source, shared)
5828 finally:
5829 shared.close()
5830 finally:
5831 source.close()
5832
5833
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005834class SendfileUsingSendTest(ThreadedTCPSocketTest):
5835 """
5836 Test the send() implementation of socket.sendfile().
5837 """
5838
Victor Stinner8c663fd2017-11-08 14:44:44 -08005839 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005840 BUFSIZE = 8192
5841 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005842 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005843
5844 @classmethod
5845 def setUpClass(cls):
5846 def chunks(total, step):
5847 assert total >= step
5848 while total > step:
5849 yield step
5850 total -= step
5851 if total:
5852 yield total
5853
5854 chunk = b"".join([random.choice(string.ascii_letters).encode()
5855 for i in range(cls.BUFSIZE)])
5856 with open(support.TESTFN, 'wb') as f:
5857 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5858 f.write(chunk)
5859 with open(support.TESTFN, 'rb') as f:
5860 cls.FILEDATA = f.read()
5861 assert len(cls.FILEDATA) == cls.FILESIZE
5862
5863 @classmethod
5864 def tearDownClass(cls):
5865 support.unlink(support.TESTFN)
5866
5867 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005868 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005869 conn, addr = self.serv.accept()
5870 conn.settimeout(self.TIMEOUT)
5871 self.addCleanup(conn.close)
5872 return conn
5873
5874 def recv_data(self, conn):
5875 received = []
5876 while True:
5877 chunk = conn.recv(self.BUFSIZE)
5878 if not chunk:
5879 break
5880 received.append(chunk)
5881 return b''.join(received)
5882
5883 def meth_from_sock(self, sock):
5884 # Depending on the mixin class being run return either send()
5885 # or sendfile() method implementation.
5886 return getattr(sock, "_sendfile_use_send")
5887
5888 # regular file
5889
5890 def _testRegularFile(self):
5891 address = self.serv.getsockname()
5892 file = open(support.TESTFN, 'rb')
5893 with socket.create_connection(address) as sock, file as file:
5894 meth = self.meth_from_sock(sock)
5895 sent = meth(file)
5896 self.assertEqual(sent, self.FILESIZE)
5897 self.assertEqual(file.tell(), self.FILESIZE)
5898
5899 def testRegularFile(self):
5900 conn = self.accept_conn()
5901 data = self.recv_data(conn)
5902 self.assertEqual(len(data), self.FILESIZE)
5903 self.assertEqual(data, self.FILEDATA)
5904
5905 # non regular file
5906
5907 def _testNonRegularFile(self):
5908 address = self.serv.getsockname()
5909 file = io.BytesIO(self.FILEDATA)
5910 with socket.create_connection(address) as sock, file as file:
5911 sent = sock.sendfile(file)
5912 self.assertEqual(sent, self.FILESIZE)
5913 self.assertEqual(file.tell(), self.FILESIZE)
5914 self.assertRaises(socket._GiveupOnSendfile,
5915 sock._sendfile_use_sendfile, file)
5916
5917 def testNonRegularFile(self):
5918 conn = self.accept_conn()
5919 data = self.recv_data(conn)
5920 self.assertEqual(len(data), self.FILESIZE)
5921 self.assertEqual(data, self.FILEDATA)
5922
5923 # empty file
5924
5925 def _testEmptyFileSend(self):
5926 address = self.serv.getsockname()
5927 filename = support.TESTFN + "2"
5928 with open(filename, 'wb'):
5929 self.addCleanup(support.unlink, filename)
5930 file = open(filename, 'rb')
5931 with socket.create_connection(address) as sock, file as file:
5932 meth = self.meth_from_sock(sock)
5933 sent = meth(file)
5934 self.assertEqual(sent, 0)
5935 self.assertEqual(file.tell(), 0)
5936
5937 def testEmptyFileSend(self):
5938 conn = self.accept_conn()
5939 data = self.recv_data(conn)
5940 self.assertEqual(data, b"")
5941
5942 # offset
5943
5944 def _testOffset(self):
5945 address = self.serv.getsockname()
5946 file = open(support.TESTFN, 'rb')
5947 with socket.create_connection(address) as sock, file as file:
5948 meth = self.meth_from_sock(sock)
5949 sent = meth(file, offset=5000)
5950 self.assertEqual(sent, self.FILESIZE - 5000)
5951 self.assertEqual(file.tell(), self.FILESIZE)
5952
5953 def testOffset(self):
5954 conn = self.accept_conn()
5955 data = self.recv_data(conn)
5956 self.assertEqual(len(data), self.FILESIZE - 5000)
5957 self.assertEqual(data, self.FILEDATA[5000:])
5958
5959 # count
5960
5961 def _testCount(self):
5962 address = self.serv.getsockname()
5963 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01005964 sock = socket.create_connection(address,
5965 timeout=support.LOOPBACK_TIMEOUT)
5966 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005967 count = 5000007
5968 meth = self.meth_from_sock(sock)
5969 sent = meth(file, count=count)
5970 self.assertEqual(sent, count)
5971 self.assertEqual(file.tell(), count)
5972
5973 def testCount(self):
5974 count = 5000007
5975 conn = self.accept_conn()
5976 data = self.recv_data(conn)
5977 self.assertEqual(len(data), count)
5978 self.assertEqual(data, self.FILEDATA[:count])
5979
5980 # count small
5981
5982 def _testCountSmall(self):
5983 address = self.serv.getsockname()
5984 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01005985 sock = socket.create_connection(address,
5986 timeout=support.LOOPBACK_TIMEOUT)
5987 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005988 count = 1
5989 meth = self.meth_from_sock(sock)
5990 sent = meth(file, count=count)
5991 self.assertEqual(sent, count)
5992 self.assertEqual(file.tell(), count)
5993
5994 def testCountSmall(self):
5995 count = 1
5996 conn = self.accept_conn()
5997 data = self.recv_data(conn)
5998 self.assertEqual(len(data), count)
5999 self.assertEqual(data, self.FILEDATA[:count])
6000
6001 # count + offset
6002
6003 def _testCountWithOffset(self):
6004 address = self.serv.getsockname()
6005 file = open(support.TESTFN, 'rb')
6006 with socket.create_connection(address, timeout=2) as sock, file as file:
6007 count = 100007
6008 meth = self.meth_from_sock(sock)
6009 sent = meth(file, offset=2007, count=count)
6010 self.assertEqual(sent, count)
6011 self.assertEqual(file.tell(), count + 2007)
6012
6013 def testCountWithOffset(self):
6014 count = 100007
6015 conn = self.accept_conn()
6016 data = self.recv_data(conn)
6017 self.assertEqual(len(data), count)
6018 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6019
6020 # non blocking sockets are not supposed to work
6021
6022 def _testNonBlocking(self):
6023 address = self.serv.getsockname()
6024 file = open(support.TESTFN, 'rb')
6025 with socket.create_connection(address) as sock, file as file:
6026 sock.setblocking(False)
6027 meth = self.meth_from_sock(sock)
6028 self.assertRaises(ValueError, meth, file)
6029 self.assertRaises(ValueError, sock.sendfile, file)
6030
6031 def testNonBlocking(self):
6032 conn = self.accept_conn()
6033 if conn.recv(8192):
6034 self.fail('was not supposed to receive any data')
6035
6036 # timeout (non-triggered)
6037
6038 def _testWithTimeout(self):
6039 address = self.serv.getsockname()
6040 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006041 sock = socket.create_connection(address,
6042 timeout=support.LOOPBACK_TIMEOUT)
6043 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006044 meth = self.meth_from_sock(sock)
6045 sent = meth(file)
6046 self.assertEqual(sent, self.FILESIZE)
6047
6048 def testWithTimeout(self):
6049 conn = self.accept_conn()
6050 data = self.recv_data(conn)
6051 self.assertEqual(len(data), self.FILESIZE)
6052 self.assertEqual(data, self.FILEDATA)
6053
6054 # timeout (triggered)
6055
6056 def _testWithTimeoutTriggeredSend(self):
6057 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006058 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006059 with socket.create_connection(address) as sock:
6060 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006061 meth = self.meth_from_sock(sock)
6062 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006063
6064 def testWithTimeoutTriggeredSend(self):
6065 conn = self.accept_conn()
6066 conn.recv(88192)
6067
6068 # errors
6069
6070 def _test_errors(self):
6071 pass
6072
6073 def test_errors(self):
6074 with open(support.TESTFN, 'rb') as file:
6075 with socket.socket(type=socket.SOCK_DGRAM) as s:
6076 meth = self.meth_from_sock(s)
6077 self.assertRaisesRegex(
6078 ValueError, "SOCK_STREAM", meth, file)
6079 with open(support.TESTFN, 'rt') as file:
6080 with socket.socket() as s:
6081 meth = self.meth_from_sock(s)
6082 self.assertRaisesRegex(
6083 ValueError, "binary mode", meth, file)
6084 with open(support.TESTFN, 'rb') as file:
6085 with socket.socket() as s:
6086 meth = self.meth_from_sock(s)
6087 self.assertRaisesRegex(TypeError, "positive integer",
6088 meth, file, count='2')
6089 self.assertRaisesRegex(TypeError, "positive integer",
6090 meth, file, count=0.1)
6091 self.assertRaisesRegex(ValueError, "positive integer",
6092 meth, file, count=0)
6093 self.assertRaisesRegex(ValueError, "positive integer",
6094 meth, file, count=-1)
6095
6096
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006097@unittest.skipUnless(hasattr(os, "sendfile"),
6098 'os.sendfile() required for this test.')
6099class SendfileUsingSendfileTest(SendfileUsingSendTest):
6100 """
6101 Test the sendfile() implementation of socket.sendfile().
6102 """
6103 def meth_from_sock(self, sock):
6104 return getattr(sock, "_sendfile_use_sendfile")
6105
Christian Heimes48371412016-09-06 00:37:46 +02006106
6107@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006108class LinuxKernelCryptoAPI(unittest.TestCase):
6109 # tests for AF_ALG
6110 def create_alg(self, typ, name):
6111 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006112 try:
6113 sock.bind((typ, name))
6114 except FileNotFoundError as e:
6115 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006116 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006117 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006118 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006119 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006120
Victor Stinner86afc1f2017-11-30 13:58:43 +01006121 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6122 # at least on ppc64le architecture
6123 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006124 def test_sha256(self):
6125 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6126 "177a9cb410ff61f20015ad")
6127 with self.create_alg('hash', 'sha256') as algo:
6128 op, _ = algo.accept()
6129 with op:
6130 op.sendall(b"abc")
6131 self.assertEqual(op.recv(512), expected)
6132
6133 op, _ = algo.accept()
6134 with op:
6135 op.send(b'a', socket.MSG_MORE)
6136 op.send(b'b', socket.MSG_MORE)
6137 op.send(b'c', socket.MSG_MORE)
6138 op.send(b'')
6139 self.assertEqual(op.recv(512), expected)
6140
6141 def test_hmac_sha1(self):
6142 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6143 with self.create_alg('hash', 'hmac(sha1)') as algo:
6144 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6145 op, _ = algo.accept()
6146 with op:
6147 op.sendall(b"what do ya want for nothing?")
6148 self.assertEqual(op.recv(512), expected)
6149
Christian Heimese084f842016-09-11 20:11:30 +02006150 # Although it should work with 3.19 and newer the test blocks on
6151 # Ubuntu 15.10 with Kernel 4.2.0-19.
6152 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006153 def test_aes_cbc(self):
6154 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6155 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6156 msg = b"Single block msg"
6157 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6158 msglen = len(msg)
6159 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6160 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6161 op, _ = algo.accept()
6162 with op:
6163 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6164 flags=socket.MSG_MORE)
6165 op.sendall(msg)
6166 self.assertEqual(op.recv(msglen), ciphertext)
6167
6168 op, _ = algo.accept()
6169 with op:
6170 op.sendmsg_afalg([ciphertext],
6171 op=socket.ALG_OP_DECRYPT, iv=iv)
6172 self.assertEqual(op.recv(msglen), msg)
6173
6174 # long message
6175 multiplier = 1024
6176 longmsg = [msg] * multiplier
6177 op, _ = algo.accept()
6178 with op:
6179 op.sendmsg_afalg(longmsg,
6180 op=socket.ALG_OP_ENCRYPT, iv=iv)
6181 enc = op.recv(msglen * multiplier)
6182 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006183 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006184
6185 op, _ = algo.accept()
6186 with op:
6187 op.sendmsg_afalg([enc],
6188 op=socket.ALG_OP_DECRYPT, iv=iv)
6189 dec = op.recv(msglen * multiplier)
6190 self.assertEqual(len(dec), msglen * multiplier)
6191 self.assertEqual(dec, msg * multiplier)
6192
matejcik9764c152017-02-16 14:41:31 +01006193 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006194 def test_aead_aes_gcm(self):
6195 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6196 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6197 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6198 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6199 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6200 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6201
6202 taglen = len(expected_tag)
6203 assoclen = len(assoc)
6204
6205 with self.create_alg('aead', 'gcm(aes)') as algo:
6206 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6207 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6208 None, taglen)
6209
6210 # send assoc, plain and tag buffer in separate steps
6211 op, _ = algo.accept()
6212 with op:
6213 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6214 assoclen=assoclen, flags=socket.MSG_MORE)
6215 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006216 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006217 res = op.recv(assoclen + len(plain) + taglen)
6218 self.assertEqual(expected_ct, res[assoclen:-taglen])
6219 self.assertEqual(expected_tag, res[-taglen:])
6220
6221 # now with msg
6222 op, _ = algo.accept()
6223 with op:
matejcik9764c152017-02-16 14:41:31 +01006224 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006225 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6226 assoclen=assoclen)
6227 res = op.recv(assoclen + len(plain) + taglen)
6228 self.assertEqual(expected_ct, res[assoclen:-taglen])
6229 self.assertEqual(expected_tag, res[-taglen:])
6230
6231 # create anc data manually
6232 pack_uint32 = struct.Struct('I').pack
6233 op, _ = algo.accept()
6234 with op:
matejcik9764c152017-02-16 14:41:31 +01006235 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006236 op.sendmsg(
6237 [msg],
6238 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6239 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6240 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6241 )
6242 )
matejcik9764c152017-02-16 14:41:31 +01006243 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006244 self.assertEqual(expected_ct, res[assoclen:-taglen])
6245 self.assertEqual(expected_tag, res[-taglen:])
6246
6247 # decrypt and verify
6248 op, _ = algo.accept()
6249 with op:
6250 msg = assoc + expected_ct + expected_tag
6251 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6252 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006253 res = op.recv(len(msg) - taglen)
6254 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006255
Christian Heimese084f842016-09-11 20:11:30 +02006256 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006257 def test_drbg_pr_sha256(self):
6258 # deterministic random bit generator, prediction resistance, sha256
6259 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6260 extra_seed = os.urandom(32)
6261 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6262 op, _ = algo.accept()
6263 with op:
6264 rn = op.recv(32)
6265 self.assertEqual(len(rn), 32)
6266
6267 def test_sendmsg_afalg_args(self):
6268 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006269 with sock:
6270 with self.assertRaises(TypeError):
6271 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006272
Christian Heimes02b30352016-09-11 19:49:56 +02006273 with self.assertRaises(TypeError):
6274 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006275
Christian Heimes02b30352016-09-11 19:49:56 +02006276 with self.assertRaises(TypeError):
6277 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006278
Christian Heimes02b30352016-09-11 19:49:56 +02006279 with self.assertRaises(TypeError):
6280 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006281
Christian Heimes02b30352016-09-11 19:49:56 +02006282 with self.assertRaises(TypeError):
6283 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6284
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006285 def test_length_restriction(self):
6286 # bpo-35050, off-by-one error in length check
6287 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6288 self.addCleanup(sock.close)
6289
6290 # salg_type[14]
6291 with self.assertRaises(FileNotFoundError):
6292 sock.bind(("t" * 13, "name"))
6293 with self.assertRaisesRegex(ValueError, "type too long"):
6294 sock.bind(("t" * 14, "name"))
6295
6296 # salg_name[64]
6297 with self.assertRaises(FileNotFoundError):
6298 sock.bind(("type", "n" * 63))
6299 with self.assertRaisesRegex(ValueError, "name too long"):
6300 sock.bind(("type", "n" * 64))
6301
6302
animalize19e7d482018-02-27 02:10:36 +08006303@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6304class TestMSWindowsTCPFlags(unittest.TestCase):
6305 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006306 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006307 'TCP_MAXSEG',
6308 'TCP_NODELAY',
6309 # available starting with Windows 10 1607
6310 'TCP_FASTOPEN',
6311 # available starting with Windows 10 1703
6312 'TCP_KEEPCNT',
6313 # available starting with Windows 10 1709
6314 'TCP_KEEPIDLE',
6315 'TCP_KEEPINTVL'
6316 }
6317
6318 def test_new_tcp_flags(self):
6319 provided = [s for s in dir(socket) if s.startswith('TCP')]
6320 unknown = [s for s in provided if s not in self.knownTCPFlags]
6321
6322 self.assertEqual([], unknown,
6323 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006324
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006325
6326class CreateServerTest(unittest.TestCase):
6327
6328 def test_address(self):
6329 port = support.find_unused_port()
6330 with socket.create_server(("127.0.0.1", port)) as sock:
6331 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6332 self.assertEqual(sock.getsockname()[1], port)
6333 if support.IPV6_ENABLED:
6334 with socket.create_server(("::1", port),
6335 family=socket.AF_INET6) as sock:
6336 self.assertEqual(sock.getsockname()[0], "::1")
6337 self.assertEqual(sock.getsockname()[1], port)
6338
6339 def test_family_and_type(self):
6340 with socket.create_server(("127.0.0.1", 0)) as sock:
6341 self.assertEqual(sock.family, socket.AF_INET)
6342 self.assertEqual(sock.type, socket.SOCK_STREAM)
6343 if support.IPV6_ENABLED:
6344 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6345 self.assertEqual(s.family, socket.AF_INET6)
6346 self.assertEqual(sock.type, socket.SOCK_STREAM)
6347
6348 def test_reuse_port(self):
6349 if not hasattr(socket, "SO_REUSEPORT"):
6350 with self.assertRaises(ValueError):
6351 socket.create_server(("localhost", 0), reuse_port=True)
6352 else:
6353 with socket.create_server(("localhost", 0)) as sock:
6354 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6355 self.assertEqual(opt, 0)
6356 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6357 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6358 self.assertNotEqual(opt, 0)
6359
6360 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6361 not hasattr(_socket, 'IPV6_V6ONLY'),
6362 "IPV6_V6ONLY option not supported")
6363 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6364 def test_ipv6_only_default(self):
6365 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6366 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6367
6368 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6369 "dualstack_ipv6 not supported")
6370 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6371 def test_dualstack_ipv6_family(self):
6372 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6373 dualstack_ipv6=True) as sock:
6374 self.assertEqual(sock.family, socket.AF_INET6)
6375
6376
6377class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006378 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006379
6380 def setUp(self):
6381 self.thread = None
6382
6383 def tearDown(self):
6384 if self.thread is not None:
6385 self.thread.join(self.timeout)
6386
6387 def echo_server(self, sock):
6388 def run(sock):
6389 with sock:
6390 conn, _ = sock.accept()
6391 with conn:
6392 event.wait(self.timeout)
6393 msg = conn.recv(1024)
6394 if not msg:
6395 return
6396 conn.sendall(msg)
6397
6398 event = threading.Event()
6399 sock.settimeout(self.timeout)
6400 self.thread = threading.Thread(target=run, args=(sock, ))
6401 self.thread.start()
6402 event.set()
6403
6404 def echo_client(self, addr, family):
6405 with socket.socket(family=family) as sock:
6406 sock.settimeout(self.timeout)
6407 sock.connect(addr)
6408 sock.sendall(b'foo')
6409 self.assertEqual(sock.recv(1024), b'foo')
6410
6411 def test_tcp4(self):
6412 port = support.find_unused_port()
6413 with socket.create_server(("", port)) as sock:
6414 self.echo_server(sock)
6415 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6416
6417 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6418 def test_tcp6(self):
6419 port = support.find_unused_port()
6420 with socket.create_server(("", port),
6421 family=socket.AF_INET6) as sock:
6422 self.echo_server(sock)
6423 self.echo_client(("::1", port), socket.AF_INET6)
6424
6425 # --- dual stack tests
6426
6427 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6428 "dualstack_ipv6 not supported")
6429 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6430 def test_dual_stack_client_v4(self):
6431 port = support.find_unused_port()
6432 with socket.create_server(("", port), family=socket.AF_INET6,
6433 dualstack_ipv6=True) as sock:
6434 self.echo_server(sock)
6435 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6436
6437 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6438 "dualstack_ipv6 not supported")
6439 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6440 def test_dual_stack_client_v6(self):
6441 port = support.find_unused_port()
6442 with socket.create_server(("", port), family=socket.AF_INET6,
6443 dualstack_ipv6=True) as sock:
6444 self.echo_server(sock)
6445 self.echo_client(("::1", port), socket.AF_INET6)
6446
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006447@requireAttrs(socket, "send_fds")
6448@requireAttrs(socket, "recv_fds")
6449@requireAttrs(socket, "AF_UNIX")
6450class SendRecvFdsTests(unittest.TestCase):
6451 def testSendAndRecvFds(self):
6452 def close_pipes(pipes):
6453 for fd1, fd2 in pipes:
6454 os.close(fd1)
6455 os.close(fd2)
6456
6457 def close_fds(fds):
6458 for fd in fds:
6459 os.close(fd)
6460
6461 # send 10 file descriptors
6462 pipes = [os.pipe() for _ in range(10)]
6463 self.addCleanup(close_pipes, pipes)
6464 fds = [rfd for rfd, wfd in pipes]
6465
6466 # use a UNIX socket pair to exchange file descriptors locally
6467 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6468 with sock1, sock2:
6469 socket.send_fds(sock1, [MSG], fds)
6470 # request more data and file descriptors than expected
6471 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6472 self.addCleanup(close_fds, fds2)
6473
6474 self.assertEqual(msg, MSG)
6475 self.assertEqual(len(fds2), len(fds))
6476 self.assertEqual(flags, 0)
6477 # don't test addr
6478
6479 # test that file descriptors are connected
6480 for index, fds in enumerate(pipes):
6481 rfd, wfd = fds
6482 os.write(wfd, str(index).encode())
6483
6484 for index, rfd in enumerate(fds2):
6485 data = os.read(rfd, 100)
6486 self.assertEqual(data, str(index).encode())
6487
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006488
Guido van Rossumb995eb72002-07-31 16:08:40 +00006489def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006490 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006491 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006492 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6493 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006494
6495 tests.extend([
6496 NonBlockingTCPTests,
6497 FileObjectClassTestCase,
6498 UnbufferedFileObjectClassTestCase,
6499 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006500 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006501 UnicodeReadFileObjectClassTestCase,
6502 UnicodeWriteFileObjectClassTestCase,
6503 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006504 NetworkConnectionNoServer,
6505 NetworkConnectionAttributesTest,
6506 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006507 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006508 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006509 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006510 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006511 tests.append(BasicSocketPairTest)
6512 tests.append(TestUnixDomain)
6513 tests.append(TestLinuxAbstractNamespace)
6514 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006515 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006516 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006517 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006518 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006519 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006520 BasicVSOCKTest,
6521 ThreadedVSOCKSocketStreamTest,
6522 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006523 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006524 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006525 CmsgMacroTests,
6526 SendmsgUDPTest,
6527 RecvmsgUDPTest,
6528 RecvmsgIntoUDPTest,
6529 SendmsgUDP6Test,
6530 RecvmsgUDP6Test,
6531 RecvmsgRFC3542AncillaryUDP6Test,
6532 RecvmsgIntoRFC3542AncillaryUDP6Test,
6533 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006534 SendmsgUDPLITETest,
6535 RecvmsgUDPLITETest,
6536 RecvmsgIntoUDPLITETest,
6537 SendmsgUDPLITE6Test,
6538 RecvmsgUDPLITE6Test,
6539 RecvmsgRFC3542AncillaryUDPLITE6Test,
6540 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6541 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006542 SendmsgTCPTest,
6543 RecvmsgTCPTest,
6544 RecvmsgIntoTCPTest,
6545 SendmsgSCTPStreamTest,
6546 RecvmsgSCTPStreamTest,
6547 RecvmsgIntoSCTPStreamTest,
6548 SendmsgUnixStreamTest,
6549 RecvmsgUnixStreamTest,
6550 RecvmsgIntoUnixStreamTest,
6551 RecvmsgSCMRightsStreamTest,
6552 RecvmsgIntoSCMRightsStreamTest,
6553 # These are slow when setitimer() is not available
6554 InterruptedRecvTimeoutTest,
6555 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006556 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006557 SendfileUsingSendTest,
6558 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006559 ])
animalize19e7d482018-02-27 02:10:36 +08006560 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006561
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006562 thread_info = support.threading_setup()
6563 support.run_unittest(*tests)
6564 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006565
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006566
Guido van Rossum24e4af82002-06-12 19:18:08 +00006567if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006568 test_main()