blob: 4a436cf3c143a97aae4163e76b7888ecbc159c30 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Serhiy Storchaka16994912020-04-25 10:06:29 +03003from test.support import socket_helper
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004
Christian Heimes5e696852008-04-09 08:37:03 +00005import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00006import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01007import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000011import time
12import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000013import queue
Jack Jansen522e7692002-09-06 21:57:50 +000014import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000015import os
Michael Felt56614592018-12-26 04:34:37 +010016import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000017import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000018import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000019from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000020import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000021import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010022import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020023import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020024import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010025import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020026import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020027import _thread as thread
28import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000029try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000030 import multiprocessing
31except ImportError:
32 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020033try:
34 import fcntl
35except ImportError:
36 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Serhiy Storchaka16994912020-04-25 10:06:29 +030038HOST = socket_helper.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010039# test unicode string and carriage return
40MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Barry Warsawcf3d4b51997-01-03 20:03:32 +000041
caaveryeffc12f2017-09-06 18:18:10 -040042VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010043AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040044
Victor Stinner45df8202010-04-28 22:31:17 +000045try:
Victor Stinnere254e532014-07-26 14:36:55 +020046 import _socket
47except ImportError:
48 _socket = None
49
caaveryeffc12f2017-09-06 18:18:10 -040050def get_cid():
51 if fcntl is None:
52 return None
Pablo Galindo6eb96192020-04-01 01:48:37 +010053 if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
54 return None
caaveryeffc12f2017-09-06 18:18:10 -040055 try:
56 with open("/dev/vsock", "rb") as f:
57 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
58 except OSError:
59 return None
60 else:
61 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000062
Charles-François Natali47413c12011-10-06 19:47:44 +020063def _have_socket_can():
64 """Check whether CAN sockets are supported on this host."""
65 try:
66 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020067 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020068 return False
69 else:
70 s.close()
71 return True
72
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040073def _have_socket_can_isotp():
74 """Check whether CAN ISOTP sockets are supported on this host."""
75 try:
76 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
77 except (AttributeError, OSError):
78 return False
79 else:
80 s.close()
81 return True
82
karl ding360371f2020-04-29 15:31:19 -070083def _have_socket_can_j1939():
84 """Check whether CAN J1939 sockets are supported on this host."""
85 try:
86 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
87 except (AttributeError, OSError):
88 return False
89 else:
90 s.close()
91 return True
92
Charles-François Natali10b8cf42011-11-10 19:21:37 +010093def _have_socket_rds():
94 """Check whether RDS sockets are supported on this host."""
95 try:
96 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
97 except (AttributeError, OSError):
98 return False
99 else:
100 s.close()
101 return True
102
Christian Heimes48371412016-09-06 00:37:46 +0200103def _have_socket_alg():
104 """Check whether AF_ALG sockets are supported on this host."""
105 try:
106 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
107 except (AttributeError, OSError):
108 return False
109 else:
110 s.close()
111 return True
112
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700113def _have_socket_qipcrtr():
114 """Check whether AF_QIPCRTR sockets are supported on this host."""
115 try:
116 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
117 except (AttributeError, OSError):
118 return False
119 else:
120 s.close()
121 return True
122
caaveryeffc12f2017-09-06 18:18:10 -0400123def _have_socket_vsock():
124 """Check whether AF_VSOCK sockets are supported on this host."""
125 ret = get_cid() is not None
126 return ret
127
Yury Selivanovf11b4602018-01-28 17:27:38 -0500128
Greg Bowser8fbece12019-08-02 16:29:52 -0400129def _have_socket_bluetooth():
130 """Check whether AF_BLUETOOTH sockets are supported on this host."""
131 try:
132 # RFCOMM is supported by all platforms with bluetooth support. Windows
133 # does not support omitting the protocol.
134 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
135 except (AttributeError, OSError):
136 return False
137 else:
138 s.close()
139 return True
140
141
Victor Stinner304315d2018-11-30 13:22:44 +0100142@contextlib.contextmanager
143def socket_setdefaulttimeout(timeout):
144 old_timeout = socket.getdefaulttimeout()
145 try:
146 socket.setdefaulttimeout(timeout)
147 yield
148 finally:
149 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500150
151
Charles-François Natali47413c12011-10-06 19:47:44 +0200152HAVE_SOCKET_CAN = _have_socket_can()
153
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400154HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
155
karl ding360371f2020-04-29 15:31:19 -0700156HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939()
157
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100158HAVE_SOCKET_RDS = _have_socket_rds()
159
Christian Heimes48371412016-09-06 00:37:46 +0200160HAVE_SOCKET_ALG = _have_socket_alg()
161
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700162HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
163
caaveryeffc12f2017-09-06 18:18:10 -0400164HAVE_SOCKET_VSOCK = _have_socket_vsock()
165
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700166HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
167
Greg Bowser8fbece12019-08-02 16:29:52 -0400168HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
169
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000170# Size in bytes of the int type
171SIZEOF_INT = array.array("i").itemsize
172
Guido van Rossum24e4af82002-06-12 19:18:08 +0000173class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000174
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175 def setUp(self):
176 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300177 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100178 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000179
Guido van Rossum24e4af82002-06-12 19:18:08 +0000180 def tearDown(self):
181 self.serv.close()
182 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000183
Guido van Rossum24e4af82002-06-12 19:18:08 +0000184class SocketUDPTest(unittest.TestCase):
185
186 def setUp(self):
187 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300188 self.port = socket_helper.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000189
190 def tearDown(self):
191 self.serv.close()
192 self.serv = None
193
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700194class SocketUDPLITETest(SocketUDPTest):
195
196 def setUp(self):
197 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300198 self.port = socket_helper.bind_port(self.serv)
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700199
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000200class ThreadSafeCleanupTestCase(unittest.TestCase):
201 """Subclass of unittest.TestCase with thread-safe cleanup methods.
202
203 This subclass protects the addCleanup() and doCleanups() methods
204 with a recursive lock.
205 """
206
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200207 def __init__(self, *args, **kwargs):
208 super().__init__(*args, **kwargs)
209 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000210
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200211 def addCleanup(self, *args, **kwargs):
212 with self._cleanup_lock:
213 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000214
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200215 def doCleanups(self, *args, **kwargs):
216 with self._cleanup_lock:
217 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000218
Charles-François Natali47413c12011-10-06 19:47:44 +0200219class SocketCANTest(unittest.TestCase):
220
221 """To be able to run this test, a `vcan0` CAN interface can be created with
222 the following commands:
223 # modprobe vcan
224 # ip link add dev vcan0 type vcan
225 # ifconfig vcan0 up
226 """
227 interface = 'vcan0'
228 bufsize = 128
229
Charles-François Natali773e42d2013-02-05 19:42:01 +0100230 """The CAN frame structure is defined in <linux/can.h>:
231
232 struct can_frame {
233 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
234 __u8 can_dlc; /* data length code: 0 .. 8 */
235 __u8 data[8] __attribute__((aligned(8)));
236 };
237 """
238 can_frame_fmt = "=IB3x8s"
239 can_frame_size = struct.calcsize(can_frame_fmt)
240
241 """The Broadcast Management Command frame structure is defined
242 in <linux/can/bcm.h>:
243
244 struct bcm_msg_head {
245 __u32 opcode;
246 __u32 flags;
247 __u32 count;
248 struct timeval ival1, ival2;
249 canid_t can_id;
250 __u32 nframes;
251 struct can_frame frames[0];
252 }
253
254 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
255 `struct can_frame` definition). Must use native not standard types for packing.
256 """
257 bcm_cmd_msg_fmt = "@3I4l2I"
258 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
259
Charles-François Natali47413c12011-10-06 19:47:44 +0200260 def setUp(self):
261 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200262 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200263 try:
264 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200265 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200266 self.skipTest('network interface `%s` does not exist' %
267 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200268
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100269
270class SocketRDSTest(unittest.TestCase):
271
272 """To be able to run this test, the `rds` kernel module must be loaded:
273 # modprobe rds
274 """
275 bufsize = 8192
276
277 def setUp(self):
278 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
279 self.addCleanup(self.serv.close)
280 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +0300281 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100282 except OSError:
283 self.skipTest('unable to bind RDS socket')
284
285
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000287 """Threadable Test class
288
289 The ThreadableTest class makes it easy to create a threaded
290 client/server pair from an existing unit test. To create a
291 new threaded class from an existing unit test, use multiple
292 inheritance:
293
294 class NewClass (OldClass, ThreadableTest):
295 pass
296
297 This class defines two new fixture functions with obvious
298 purposes for overriding:
299
300 clientSetUp ()
301 clientTearDown ()
302
303 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000304 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000305 '_' to indicate the client portion of the test. Ex:
306
307 def testFoo(self):
308 # Server portion
309
310 def _testFoo(self):
311 # Client portion
312
313 Any exceptions raised by the clients during their tests
314 are caught and transferred to the main thread to alert
315 the testing framework.
316
317 Note, the server setup function cannot call any blocking
318 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000319 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000320 the blocking call (such as in setting up a client/server
321 connection and performing the accept() in setUp().
322 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000323
324 def __init__(self):
325 # Swap the true setup function
326 self.__setUp = self.setUp
327 self.__tearDown = self.tearDown
328 self.setUp = self._setUp
329 self.tearDown = self._tearDown
330
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000331 def serverExplicitReady(self):
332 """This method allows the server to explicitly indicate that
333 it wants the client thread to proceed. This is useful if the
334 server is about to execute a blocking routine that is
335 dependent upon the client thread during its setup routine."""
336 self.server_ready.set()
337
Guido van Rossum24e4af82002-06-12 19:18:08 +0000338 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700339 self.wait_threads = support.wait_threads_exit()
340 self.wait_threads.__enter__()
341
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000342 self.server_ready = threading.Event()
343 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000344 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000345 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200346 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000347
348 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000349 methodname = self.id()
350 i = methodname.rfind('.')
351 methodname = methodname[i+1:]
352 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000353 self.client_thread = thread.start_new_thread(
354 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000355
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200356 try:
357 self.__setUp()
358 except:
359 self.server_crashed = True
360 raise
361 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000362 self.server_ready.set()
363 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000364
365 def _tearDown(self):
366 self.__tearDown()
367 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700368 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000369
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000370 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000371 exc = self.queue.get()
372 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000373
374 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000375 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100376 try:
377 self.clientSetUp()
378 except BaseException as e:
379 self.queue.put(e)
380 self.clientTearDown()
381 return
382 finally:
383 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200384 if self.server_crashed:
385 self.clientTearDown()
386 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000387 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000388 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000389 try:
390 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000391 except BaseException as e:
392 self.queue.put(e)
393 finally:
394 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000395
396 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000397 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398
399 def clientTearDown(self):
400 self.done.set()
401 thread.exit()
402
403class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
404
405 def __init__(self, methodName='runTest'):
406 SocketTCPTest.__init__(self, methodName=methodName)
407 ThreadableTest.__init__(self)
408
409 def clientSetUp(self):
410 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
411
412 def clientTearDown(self):
413 self.cli.close()
414 self.cli = None
415 ThreadableTest.clientTearDown(self)
416
417class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
418
419 def __init__(self, methodName='runTest'):
420 SocketUDPTest.__init__(self, methodName=methodName)
421 ThreadableTest.__init__(self)
422
423 def clientSetUp(self):
424 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
425
Brian Curtin3beb38f2010-11-04 03:41:43 +0000426 def clientTearDown(self):
427 self.cli.close()
428 self.cli = None
429 ThreadableTest.clientTearDown(self)
430
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700431@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
432 'UDPLITE sockets required for this test.')
433class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
434
435 def __init__(self, methodName='runTest'):
436 SocketUDPLITETest.__init__(self, methodName=methodName)
437 ThreadableTest.__init__(self)
438
439 def clientSetUp(self):
440 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
441
442 def clientTearDown(self):
443 self.cli.close()
444 self.cli = None
445 ThreadableTest.clientTearDown(self)
446
Charles-François Natali47413c12011-10-06 19:47:44 +0200447class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
448
449 def __init__(self, methodName='runTest'):
450 SocketCANTest.__init__(self, methodName=methodName)
451 ThreadableTest.__init__(self)
452
453 def clientSetUp(self):
454 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
455 try:
456 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200457 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200458 # skipTest should not be called here, and will be called in the
459 # server instead
460 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200461
462 def clientTearDown(self):
463 self.cli.close()
464 self.cli = None
465 ThreadableTest.clientTearDown(self)
466
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100467class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
468
469 def __init__(self, methodName='runTest'):
470 SocketRDSTest.__init__(self, methodName=methodName)
471 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100472
473 def clientSetUp(self):
474 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
475 try:
476 # RDS sockets must be bound explicitly to send or receive data
477 self.cli.bind((HOST, 0))
478 self.cli_addr = self.cli.getsockname()
479 except OSError:
480 # skipTest should not be called here, and will be called in the
481 # server instead
482 pass
483
484 def clientTearDown(self):
485 self.cli.close()
486 self.cli = None
487 ThreadableTest.clientTearDown(self)
488
caaveryeffc12f2017-09-06 18:18:10 -0400489@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400490@unittest.skipUnless(HAVE_SOCKET_VSOCK,
491 'VSOCK sockets required for this test.')
492@unittest.skipUnless(get_cid() != 2,
493 "This test can only be run on a virtual guest.")
494class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
495
496 def __init__(self, methodName='runTest'):
497 unittest.TestCase.__init__(self, methodName=methodName)
498 ThreadableTest.__init__(self)
499
500 def setUp(self):
501 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
502 self.addCleanup(self.serv.close)
503 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
504 self.serv.listen()
505 self.serverExplicitReady()
506 self.conn, self.connaddr = self.serv.accept()
507 self.addCleanup(self.conn.close)
508
509 def clientSetUp(self):
510 time.sleep(0.1)
511 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
512 self.addCleanup(self.cli.close)
513 cid = get_cid()
514 self.cli.connect((cid, VSOCKPORT))
515
516 def testStream(self):
517 msg = self.conn.recv(1024)
518 self.assertEqual(msg, MSG)
519
520 def _testStream(self):
521 self.cli.send(MSG)
522 self.cli.close()
523
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000525 """Socket tests for client-server connection.
526
527 self.cli_conn is a client socket connected to the server. The
528 setUp() method guarantees that it is connected to the server.
529 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530
531 def __init__(self, methodName='runTest'):
532 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
533
534 def setUp(self):
535 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000536 # Indicate explicitly we're ready for the client thread to
537 # proceed and then perform the blocking call to accept
538 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539 conn, addr = self.serv.accept()
540 self.cli_conn = conn
541
542 def tearDown(self):
543 self.cli_conn.close()
544 self.cli_conn = None
545 ThreadedTCPSocketTest.tearDown(self)
546
547 def clientSetUp(self):
548 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000549 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550 self.serv_conn = self.cli
551
552 def clientTearDown(self):
553 self.serv_conn.close()
554 self.serv_conn = None
555 ThreadedTCPSocketTest.clientTearDown(self)
556
Dave Cole331708b2004-08-09 04:51:41 +0000557class SocketPairTest(unittest.TestCase, ThreadableTest):
558
559 def __init__(self, methodName='runTest'):
560 unittest.TestCase.__init__(self, methodName=methodName)
561 ThreadableTest.__init__(self)
562
563 def setUp(self):
564 self.serv, self.cli = socket.socketpair()
565
566 def tearDown(self):
567 self.serv.close()
568 self.serv = None
569
570 def clientSetUp(self):
571 pass
572
573 def clientTearDown(self):
574 self.cli.close()
575 self.cli = None
576 ThreadableTest.clientTearDown(self)
577
Tim Peters494aaee2004-08-09 18:54:11 +0000578
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000579# The following classes are used by the sendmsg()/recvmsg() tests.
580# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
581# gives a drop-in replacement for SocketConnectedTest, but different
582# address families can be used, and the attributes serv_addr and
583# cli_addr will be set to the addresses of the endpoints.
584
585class SocketTestBase(unittest.TestCase):
586 """A base class for socket tests.
587
588 Subclasses must provide methods newSocket() to return a new socket
589 and bindSock(sock) to bind it to an unused address.
590
591 Creates a socket self.serv and sets self.serv_addr to its address.
592 """
593
594 def setUp(self):
595 self.serv = self.newSocket()
596 self.bindServer()
597
598 def bindServer(self):
599 """Bind server socket and set self.serv_addr to its address."""
600 self.bindSock(self.serv)
601 self.serv_addr = self.serv.getsockname()
602
603 def tearDown(self):
604 self.serv.close()
605 self.serv = None
606
607
608class SocketListeningTestMixin(SocketTestBase):
609 """Mixin to listen on the server socket."""
610
611 def setUp(self):
612 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100613 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000614
615
616class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
617 ThreadableTest):
618 """Mixin to add client socket and allow client/server tests.
619
620 Client socket is self.cli and its address is self.cli_addr. See
621 ThreadableTest for usage information.
622 """
623
624 def __init__(self, *args, **kwargs):
625 super().__init__(*args, **kwargs)
626 ThreadableTest.__init__(self)
627
628 def clientSetUp(self):
629 self.cli = self.newClientSocket()
630 self.bindClient()
631
632 def newClientSocket(self):
633 """Return a new socket for use as client."""
634 return self.newSocket()
635
636 def bindClient(self):
637 """Bind client socket and set self.cli_addr to its address."""
638 self.bindSock(self.cli)
639 self.cli_addr = self.cli.getsockname()
640
641 def clientTearDown(self):
642 self.cli.close()
643 self.cli = None
644 ThreadableTest.clientTearDown(self)
645
646
647class ConnectedStreamTestMixin(SocketListeningTestMixin,
648 ThreadedSocketTestMixin):
649 """Mixin to allow client/server stream tests with connected client.
650
651 Server's socket representing connection to client is self.cli_conn
652 and client's connection to server is self.serv_conn. (Based on
653 SocketConnectedTest.)
654 """
655
656 def setUp(self):
657 super().setUp()
658 # Indicate explicitly we're ready for the client thread to
659 # proceed and then perform the blocking call to accept
660 self.serverExplicitReady()
661 conn, addr = self.serv.accept()
662 self.cli_conn = conn
663
664 def tearDown(self):
665 self.cli_conn.close()
666 self.cli_conn = None
667 super().tearDown()
668
669 def clientSetUp(self):
670 super().clientSetUp()
671 self.cli.connect(self.serv_addr)
672 self.serv_conn = self.cli
673
674 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100675 try:
676 self.serv_conn.close()
677 self.serv_conn = None
678 except AttributeError:
679 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000680 super().clientTearDown()
681
682
683class UnixSocketTestBase(SocketTestBase):
684 """Base class for Unix-domain socket tests."""
685
686 # This class is used for file descriptor passing tests, so we
687 # create the sockets in a private directory so that other users
688 # can't send anything that might be problematic for a privileged
689 # user running the tests.
690
691 def setUp(self):
692 self.dir_path = tempfile.mkdtemp()
693 self.addCleanup(os.rmdir, self.dir_path)
694 super().setUp()
695
696 def bindSock(self, sock):
697 path = tempfile.mktemp(dir=self.dir_path)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300698 socket_helper.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000699 self.addCleanup(support.unlink, path)
700
701class UnixStreamBase(UnixSocketTestBase):
702 """Base class for Unix-domain SOCK_STREAM tests."""
703
704 def newSocket(self):
705 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
706
707
708class InetTestBase(SocketTestBase):
709 """Base class for IPv4 socket tests."""
710
711 host = HOST
712
713 def setUp(self):
714 super().setUp()
715 self.port = self.serv_addr[1]
716
717 def bindSock(self, sock):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300718 socket_helper.bind_port(sock, host=self.host)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000719
720class TCPTestBase(InetTestBase):
721 """Base class for TCP-over-IPv4 tests."""
722
723 def newSocket(self):
724 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
725
726class UDPTestBase(InetTestBase):
727 """Base class for UDP-over-IPv4 tests."""
728
729 def newSocket(self):
730 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
731
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700732class UDPLITETestBase(InetTestBase):
733 """Base class for UDPLITE-over-IPv4 tests."""
734
735 def newSocket(self):
736 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
737
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000738class SCTPStreamBase(InetTestBase):
739 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
740
741 def newSocket(self):
742 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
743 socket.IPPROTO_SCTP)
744
745
746class Inet6TestBase(InetTestBase):
747 """Base class for IPv6 socket tests."""
748
Serhiy Storchaka16994912020-04-25 10:06:29 +0300749 host = socket_helper.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000750
751class UDP6TestBase(Inet6TestBase):
752 """Base class for UDP-over-IPv6 tests."""
753
754 def newSocket(self):
755 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
756
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700757class UDPLITE6TestBase(Inet6TestBase):
758 """Base class for UDPLITE-over-IPv6 tests."""
759
760 def newSocket(self):
761 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
762
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000763
764# Test-skipping decorators for use with ThreadableTest.
765
766def skipWithClientIf(condition, reason):
767 """Skip decorated test if condition is true, add client_skip decorator.
768
769 If the decorated object is not a class, sets its attribute
770 "client_skip" to a decorator which will return an empty function
771 if the test is to be skipped, or the original function if it is
772 not. This can be used to avoid running the client part of a
773 skipped test when using ThreadableTest.
774 """
775 def client_pass(*args, **kwargs):
776 pass
777 def skipdec(obj):
778 retval = unittest.skip(reason)(obj)
779 if not isinstance(obj, type):
780 retval.client_skip = lambda f: client_pass
781 return retval
782 def noskipdec(obj):
783 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
784 obj.client_skip = lambda f: f
785 return obj
786 return skipdec if condition else noskipdec
787
788
789def requireAttrs(obj, *attributes):
790 """Skip decorated test if obj is missing any of the given attributes.
791
792 Sets client_skip attribute as skipWithClientIf() does.
793 """
794 missing = [name for name in attributes if not hasattr(obj, name)]
795 return skipWithClientIf(
796 missing, "don't have " + ", ".join(name for name in missing))
797
798
799def requireSocket(*args):
800 """Skip decorated test if a socket cannot be created with given arguments.
801
802 When an argument is given as a string, will use the value of that
803 attribute of the socket module, or skip the test if it doesn't
804 exist. Sets client_skip attribute as skipWithClientIf() does.
805 """
806 err = None
807 missing = [obj for obj in args if
808 isinstance(obj, str) and not hasattr(socket, obj)]
809 if missing:
810 err = "don't have " + ", ".join(name for name in missing)
811 else:
812 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
813 for obj in args]
814 try:
815 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200816 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000817 # XXX: check errno?
818 err = str(e)
819 else:
820 s.close()
821 return skipWithClientIf(
822 err is not None,
823 "can't create socket({0}): {1}".format(
824 ", ".join(str(o) for o in args), err))
825
826
Guido van Rossum24e4af82002-06-12 19:18:08 +0000827#######################################################################
828## Begin Tests
829
830class GeneralModuleTests(unittest.TestCase):
831
Ethan Furman7184bac2014-10-14 18:56:53 -0700832 def test_SocketType_is_socketobject(self):
833 import _socket
834 self.assertTrue(socket.SocketType is _socket.socket)
835 s = socket.socket()
836 self.assertIsInstance(s, socket.SocketType)
837 s.close()
838
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000839 def test_repr(self):
840 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200841 with s:
842 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000843 self.assertIn('family=%s' % socket.AF_INET, repr(s))
844 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200845 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200846 self.assertNotIn('raddr', repr(s))
847 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200848 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200849 self.assertIn(str(s.getsockname()), repr(s))
850 self.assertIn('[closed]', repr(s))
851 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000852
Victor Stinnere254e532014-07-26 14:36:55 +0200853 @unittest.skipUnless(_socket is not None, 'need _socket module')
854 def test_csocket_repr(self):
855 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
856 try:
857 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
858 % (s.fileno(), s.family, s.type, s.proto))
859 self.assertEqual(repr(s), expected)
860 finally:
861 s.close()
862 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
863 % (s.family, s.type, s.proto))
864 self.assertEqual(repr(s), expected)
865
Raymond Hettinger027bb632004-05-31 03:09:25 +0000866 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200867 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
868 p = proxy(s)
869 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000870 s = None
871 try:
872 p.fileno()
873 except ReferenceError:
874 pass
875 else:
876 self.fail('Socket proxy still exists')
877
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000879 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300880 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200881 with self.assertRaises(OSError, msg=msg % 'OSError'):
882 raise OSError
883 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200885 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887
Ezio Melotti63e42302011-05-07 19:47:48 +0300888 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000889 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300890 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
891 self.addCleanup(s.close)
892 s.bind(('', 0))
893 sockname = s.getsockname()
894 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300895 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300896 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300897 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400898 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300899 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300900 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300901 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400902 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300903 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300904 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300905 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300906 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300907 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300908 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300909 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400910 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300911 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300912 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300913 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400914 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300915 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300916 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300917 self.assertIn('not NoneType', str(cm.exception))
918 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300919 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300920 self.assertIn('an integer is required', str(cm.exception))
921 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300922 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300923 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300924 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300925 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300926 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300927 self.assertIn('(1 given)', str(cm.exception))
928 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300929 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300930 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300931
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100935 if socket.has_ipv6:
936 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 socket.SOCK_STREAM
938 socket.SOCK_DGRAM
939 socket.SOCK_RAW
940 socket.SOCK_RDM
941 socket.SOCK_SEQPACKET
942 socket.SOL_SOCKET
943 socket.SO_REUSEADDR
944
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100945 def testCrucialIpProtoConstants(self):
946 socket.IPPROTO_TCP
947 socket.IPPROTO_UDP
948 if socket.has_ipv6:
949 socket.IPPROTO_IPV6
950
951 @unittest.skipUnless(os.name == "nt", "Windows specific")
952 def testWindowsSpecificConstants(self):
953 socket.IPPROTO_ICLFXBM
954 socket.IPPROTO_ST
955 socket.IPPROTO_CBT
956 socket.IPPROTO_IGP
957 socket.IPPROTO_RDP
958 socket.IPPROTO_PGM
959 socket.IPPROTO_L2TP
960 socket.IPPROTO_SCTP
961
Guido van Rossum654c11e2002-06-13 20:24:17 +0000962 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000963 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000964 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000965 try:
966 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200967 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000968 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600969 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000970 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000971 try:
972 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200973 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000974 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600975 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000976 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000977 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000978 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000979 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000980
Charles-François Natali0cc86852013-09-13 19:53:08 +0200981 def test_host_resolution(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300982 for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200983 self.assertEqual(socket.gethostbyname(addr), addr)
984
Serhiy Storchaka16994912020-04-25 10:06:29 +0300985 # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have
Charles-François Natali0cc86852013-09-13 19:53:08 +0200986 # a matching name entry (e.g. 'ip6-localhost')
Serhiy Storchaka16994912020-04-25 10:06:29 +0300987 for host in [socket_helper.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200988 self.assertIn(host, socket.gethostbyaddr(host)[2])
989
Xiang Zhangd36a7162017-03-07 11:06:09 +0800990 def test_host_resolution_bad_address(self):
991 # These are all malformed IP addresses and expected not to resolve to
992 # any result. But some ISPs, e.g. AWS, may successfully resolve these
993 # IPs.
994 explanation = (
995 "resolving an invalid IP address did not raise OSError; "
996 "can be caused by a broken DNS server"
997 )
998 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
999 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -04001000 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +08001001 socket.gethostbyname(addr)
1002 with self.assertRaises(OSError, msg=explanation):
1003 socket.gethostbyaddr(addr)
1004
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001005 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
1006 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
1007 def test_sethostname(self):
1008 oldhn = socket.gethostname()
1009 try:
1010 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001011 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001012 if e.errno == errno.EPERM:
1013 self.skipTest("test should be run as root")
1014 else:
1015 raise
1016 try:
1017 # running test as root!
1018 self.assertEqual(socket.gethostname(), 'new')
1019 # Should work with bytes objects too
1020 socket.sethostname(b'bar')
1021 self.assertEqual(socket.gethostname(), 'bar')
1022 finally:
1023 socket.sethostname(oldhn)
1024
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001025 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1026 'socket.if_nameindex() not available.')
1027 def testInterfaceNameIndex(self):
1028 interfaces = socket.if_nameindex()
1029 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001030 self.assertIsInstance(index, int)
1031 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001032 # interface indices are non-zero integers
1033 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001034 _index = socket.if_nametoindex(name)
1035 self.assertIsInstance(_index, int)
1036 self.assertEqual(index, _index)
1037 _name = socket.if_indextoname(index)
1038 self.assertIsInstance(_name, str)
1039 self.assertEqual(name, _name)
1040
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001041 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1042 'socket.if_indextoname() not available.')
1043 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001044 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001045 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001046
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001047 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1048 'socket.if_nametoindex() not available.')
1049 def testInvalidInterfaceNameToIndex(self):
1050 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1051 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1052
Serhiy Storchaka43767632013-11-03 21:31:38 +02001053 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1054 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001055 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001056 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001057 try:
1058 # On some versions, this loses a reference
1059 orig = sys.getrefcount(__name__)
1060 socket.getnameinfo(__name__,0)
1061 except TypeError:
1062 if sys.getrefcount(__name__) != orig:
1063 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001064
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001066 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067 try:
1068 # On some versions, this crashes the interpreter.
1069 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001070 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001071 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001072
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001073 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001074 # This just checks that htons etc. are their own inverse,
1075 # when looking at the lower 16 or 32 bits.
1076 sizes = {socket.htonl: 32, socket.ntohl: 32,
1077 socket.htons: 16, socket.ntohs: 16}
1078 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001079 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001080 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1081 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001082
Guido van Rossuma2627af2002-09-14 00:58:46 +00001083 swapped = func(mask)
1084 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001085 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001086
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001087 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001088 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001089 import _testcapi
1090 s_good_values = [0, 1, 2, 0xffff]
1091 l_good_values = s_good_values + [0xffffffff]
1092 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1093 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1094 _testcapi.INT_MAX + 1]
1095 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1096 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001097 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001098 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001099 for k in l_good_values:
1100 socket.ntohl(k)
1101 socket.htonl(k)
1102 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001103 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001104 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001105 for k in l_bad_values:
1106 self.assertRaises(OverflowError, socket.ntohl, k)
1107 self.assertRaises(OverflowError, socket.htonl, k)
1108 for k in s_deprecated_values:
1109 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1110 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001111
Barry Warsaw11b91a02004-06-28 00:50:43 +00001112 def testGetServBy(self):
1113 eq = self.assertEqual
1114 # Find one service that exists, then check all the related interfaces.
1115 # I've ordered this by protocols that have both a tcp and udp
1116 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001117 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001118 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001119 # avoid the 'echo' service on this platform, as there is an
1120 # assumption breaking non-standard port/protocol entry
1121 services = ('daytime', 'qotd', 'domain')
1122 else:
1123 services = ('echo', 'daytime', 'domain')
1124 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001125 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001126 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001127 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001128 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001129 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001130 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001131 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001132 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001133 # Issue #26936: Android getservbyname() was broken before API 23.
1134 if (not hasattr(sys, 'getandroidapilevel') or
1135 sys.getandroidapilevel() >= 23):
1136 port2 = socket.getservbyname(service)
1137 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001138 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001139 try:
1140 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001141 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001142 udpport = None
1143 else:
1144 eq(udpport, port)
1145 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001146 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001147 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001148 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001149 eq(socket.getservbyport(port, 'tcp'), service)
1150 if udpport is not None:
1151 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001152 # Make sure getservbyport does not accept out of range ports.
1153 self.assertRaises(OverflowError, socket.getservbyport, -1)
1154 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001156 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001157 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001158 # The default timeout should initially be None
1159 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001160 with socket.socket() as s:
1161 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001162
1163 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001164 with socket_setdefaulttimeout(10):
1165 self.assertEqual(socket.getdefaulttimeout(), 10)
1166 with socket.socket() as sock:
1167 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001168
Victor Stinner304315d2018-11-30 13:22:44 +01001169 # Reset the default timeout to None, and see if it propagates
1170 socket.setdefaulttimeout(None)
1171 self.assertEqual(socket.getdefaulttimeout(), None)
1172 with socket.socket() as sock:
1173 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001174
1175 # Check that setting it to an invalid value raises ValueError
1176 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1177
1178 # Check that setting it to an invalid type raises TypeError
1179 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1180
Serhiy Storchaka43767632013-11-03 21:31:38 +02001181 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1182 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001183 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001184 # Test that issue1008086 and issue767150 are fixed.
1185 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001186 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1187 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001188
Serhiy Storchaka43767632013-11-03 21:31:38 +02001189 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1190 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001191 def testIPv4toString(self):
1192 from socket import inet_aton as f, inet_pton, AF_INET
1193 g = lambda a: inet_pton(AF_INET, a)
1194
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001195 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001196 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001197 )
1198
Ezio Melottib3aedd42010-11-20 19:04:17 +00001199 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1200 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1201 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1202 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1203 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001204 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001205 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001206 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001207 assertInvalid(f, '300.0.0.0')
1208 assertInvalid(f, 'a.0.0.0')
1209 assertInvalid(f, '1.2.3.4.5')
1210 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001211
Ezio Melottib3aedd42010-11-20 19:04:17 +00001212 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1213 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1214 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1215 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001216 assertInvalid(g, '0.0.0.')
1217 assertInvalid(g, '300.0.0.0')
1218 assertInvalid(g, 'a.0.0.0')
1219 assertInvalid(g, '1.2.3.4.5')
1220 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001221
Serhiy Storchaka43767632013-11-03 21:31:38 +02001222 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1223 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001224 def testIPv6toString(self):
1225 try:
1226 from socket import inet_pton, AF_INET6, has_ipv6
1227 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001228 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001229 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001230 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001231
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001232 if sys.platform == "win32":
1233 try:
1234 inet_pton(AF_INET6, '::')
1235 except OSError as e:
1236 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001237 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001238
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001239 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001240 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001241 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001242 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001243
Ezio Melottib3aedd42010-11-20 19:04:17 +00001244 self.assertEqual(b'\x00' * 16, f('::'))
1245 self.assertEqual(b'\x00' * 16, f('0::0'))
1246 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1247 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001248 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 +00001249 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1250 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001251 self.assertEqual(
1252 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1253 f('ad42:abc::127:0:254:2')
1254 )
1255 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1256 assertInvalid('0x20::')
1257 assertInvalid(':::')
1258 assertInvalid('::0::')
1259 assertInvalid('1::abc::')
1260 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001261 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001262 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001263 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001264 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001265 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001266 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001267
1268 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1269 f('::254.42.23.64')
1270 )
1271 self.assertEqual(
1272 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1273 f('42::a29b:254.42.23.64')
1274 )
1275 self.assertEqual(
1276 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1277 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1278 )
1279 assertInvalid('255.254.253.252')
1280 assertInvalid('1::260.2.3.0')
1281 assertInvalid('1::0.be.e.0')
1282 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1283 assertInvalid('::1.2.3.4:0')
1284 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001285
Serhiy Storchaka43767632013-11-03 21:31:38 +02001286 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1287 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001288 def testStringToIPv4(self):
1289 from socket import inet_ntoa as f, inet_ntop, AF_INET
1290 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001291 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001292 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001293 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001294
Ezio Melottib3aedd42010-11-20 19:04:17 +00001295 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1296 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1297 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1298 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001299 assertInvalid(f, b'\x00' * 3)
1300 assertInvalid(f, b'\x00' * 5)
1301 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001302 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001303
Ezio Melottib3aedd42010-11-20 19:04:17 +00001304 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1305 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1306 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001307 assertInvalid(g, b'\x00' * 3)
1308 assertInvalid(g, b'\x00' * 5)
1309 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001310 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001311
Serhiy Storchaka43767632013-11-03 21:31:38 +02001312 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1313 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001314 def testStringToIPv6(self):
1315 try:
1316 from socket import inet_ntop, AF_INET6, has_ipv6
1317 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001318 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001319 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001320 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001321
1322 if sys.platform == "win32":
1323 try:
1324 inet_ntop(AF_INET6, b'\x00' * 16)
1325 except OSError as e:
1326 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001327 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001328
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001329 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001330 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001331 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001332 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001333
Ezio Melottib3aedd42010-11-20 19:04:17 +00001334 self.assertEqual('::', f(b'\x00' * 16))
1335 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1336 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001337 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001338 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 +00001339 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001340 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001341
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001342 assertInvalid(b'\x12' * 15)
1343 assertInvalid(b'\x12' * 17)
1344 assertInvalid(b'\x12' * 4)
1345
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001346 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001347
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001348 def testSockName(self):
1349 # Testing getsockname()
Serhiy Storchaka16994912020-04-25 10:06:29 +03001350 port = socket_helper.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001351 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001352 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001353 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001354 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001355 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1356 # it reasonable to get the host's addr in addition to 0.0.0.0.
1357 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001358 try:
1359 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001360 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001361 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001362 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001363 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001364 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001365
1366 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001367 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001368 # We know a socket should start without reuse==0
1369 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001370 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001371 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001372 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001373
1374 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001375 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001376 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001377 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001378 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1379 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001380 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001381
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001382 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001383 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001384 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1385 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001386 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001387
Martin Panter50ab1a32016-04-11 00:38:12 +00001388 def testCloseException(self):
1389 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001390 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001391 socket.socket(fileno=sock.fileno()).close()
1392 try:
1393 sock.close()
1394 except OSError as err:
1395 # Winsock apparently raises ENOTSOCK
1396 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1397 else:
1398 self.fail("close() should raise EBADF/ENOTSOCK")
1399
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001400 def testNewAttributes(self):
1401 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001402
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001403 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1404 self.assertEqual(sock.family, socket.AF_INET)
1405 if hasattr(socket, 'SOCK_CLOEXEC'):
1406 self.assertIn(sock.type,
1407 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1408 socket.SOCK_STREAM))
1409 else:
1410 self.assertEqual(sock.type, socket.SOCK_STREAM)
1411 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001412
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001413 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001414 sock = socket.socket()
1415 self.addCleanup(sock.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001416 port = socket_helper.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001417 big_port = port + 65536
1418 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001419 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1420 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1421 # Since find_unused_port() is inherently subject to race conditions, we
1422 # call it a couple times if necessary.
1423 for i in itertools.count():
Serhiy Storchaka16994912020-04-25 10:06:29 +03001424 port = socket_helper.find_unused_port()
Charles-François Natali65708cf2014-07-25 18:44:30 +01001425 try:
1426 sock.bind((HOST, port))
1427 except OSError as e:
1428 if e.errno != errno.EADDRINUSE or i == 5:
1429 raise
1430 else:
1431 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001432
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001433 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001434 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001435 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1436 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1437 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1438 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001439 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1440 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001441 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001442 self.assertRaises(ValueError, s.ioctl, -1, None)
1443 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001444
Steve Dowerea93ac02016-06-17 12:52:18 -07001445 @unittest.skipUnless(os.name == "nt", "Windows specific")
1446 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1447 'Loopback fast path support required for this test')
1448 def test_sio_loopback_fast_path(self):
1449 s = socket.socket()
1450 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001451 try:
1452 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1453 except OSError as exc:
1454 WSAEOPNOTSUPP = 10045
1455 if exc.winerror == WSAEOPNOTSUPP:
1456 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1457 "doesn't implemented in this Windows version")
1458 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001459 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1460
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001461 def testGetaddrinfo(self):
1462 try:
1463 socket.getaddrinfo('localhost', 80)
1464 except socket.gaierror as err:
1465 if err.errno == socket.EAI_SERVICE:
1466 # see http://bugs.python.org/issue1282647
1467 self.skipTest("buggy libc version")
1468 raise
1469 # len of every sequence is supposed to be == 5
1470 for info in socket.getaddrinfo(HOST, None):
1471 self.assertEqual(len(info), 5)
1472 # host can be a domain name, a string representation of an
1473 # IPv4/v6 address or None
1474 socket.getaddrinfo('localhost', 80)
1475 socket.getaddrinfo('127.0.0.1', 80)
1476 socket.getaddrinfo(None, 80)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001477 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001478 socket.getaddrinfo('::1', 80)
1479 # port can be a string service name such as "http", a numeric
1480 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001481 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1482 if (not hasattr(sys, 'getandroidapilevel') or
1483 sys.getandroidapilevel() >= 23):
1484 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001485 socket.getaddrinfo(HOST, 80)
1486 socket.getaddrinfo(HOST, None)
1487 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001488 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1489 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001490 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001491 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1492 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001493 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001494 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1495 for _, socktype, _, _, _ in infos:
1496 self.assertEqual(socktype, socket.SOCK_STREAM)
1497 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001498 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001499 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1500 # a server willing to support both IPv4 and IPv6 will
1501 # usually do this
1502 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1503 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001504 # test keyword arguments
1505 a = socket.getaddrinfo(HOST, None)
1506 b = socket.getaddrinfo(host=HOST, port=None)
1507 self.assertEqual(a, b)
1508 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1509 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1510 self.assertEqual(a, b)
1511 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1512 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1513 self.assertEqual(a, b)
1514 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1515 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1516 self.assertEqual(a, b)
1517 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1518 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1519 self.assertEqual(a, b)
1520 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1521 socket.AI_PASSIVE)
1522 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1523 type=socket.SOCK_STREAM, proto=0,
1524 flags=socket.AI_PASSIVE)
1525 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001526 # Issue #6697.
1527 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001528
Ned Deilyb24f4812014-02-13 22:50:42 -08001529 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001530 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001531 try:
1532 # The arguments here are undefined and the call may succeed
1533 # or fail. All we care here is that it doesn't segfault.
1534 socket.getaddrinfo("localhost", None, 0, 0, 0,
1535 socket.AI_NUMERICSERV)
1536 except socket.gaierror:
1537 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001538
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001539 def test_getnameinfo(self):
1540 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001541 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001542
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001543 @unittest.skipUnless(support.is_resource_enabled('network'),
1544 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001545 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001546 # Check for internet access before running test
1547 # (issue #12804, issue #25138).
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03001548 with socket_helper.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001549 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001550
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001551 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001552 domain = 'испытание.pythontest.net'
1553 socket.gethostbyname(domain)
1554 socket.gethostbyname_ex(domain)
1555 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001556 # 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 +00001557 # have a reverse entry yet
1558 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001559
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001560 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001561 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001562 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1563 self.skipTest("signal.alarm and socket.socketpair required for this test")
1564 # Our signal handlers clobber the C errno by calling a math function
1565 # with an invalid domain value.
1566 def ok_handler(*args):
1567 self.assertRaises(ValueError, math.acosh, 0)
1568 def raising_handler(*args):
1569 self.assertRaises(ValueError, math.acosh, 0)
1570 1 // 0
1571 c, s = socket.socketpair()
1572 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1573 try:
1574 if with_timeout:
1575 # Just above the one second minimum for signal.alarm
1576 c.settimeout(1.5)
1577 with self.assertRaises(ZeroDivisionError):
1578 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001579 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001580 if with_timeout:
1581 signal.signal(signal.SIGALRM, ok_handler)
1582 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001583 self.assertRaises(socket.timeout, c.sendall,
1584 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001585 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001586 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001587 signal.signal(signal.SIGALRM, old_alarm)
1588 c.close()
1589 s.close()
1590
1591 def test_sendall_interrupted(self):
1592 self.check_sendall_interrupted(False)
1593
1594 def test_sendall_interrupted_with_timeout(self):
1595 self.check_sendall_interrupted(True)
1596
Antoine Pitroue033e062010-10-29 10:38:18 +00001597 def test_dealloc_warn(self):
1598 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1599 r = repr(sock)
1600 with self.assertWarns(ResourceWarning) as cm:
1601 sock = None
1602 support.gc_collect()
1603 self.assertIn(r, str(cm.warning.args[0]))
1604 # An open socket file object gets dereferenced after the socket
1605 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1606 f = sock.makefile('rb')
1607 r = repr(sock)
1608 sock = None
1609 support.gc_collect()
1610 with self.assertWarns(ResourceWarning):
1611 f = None
1612 support.gc_collect()
1613
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001614 def test_name_closed_socketio(self):
1615 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1616 fp = sock.makefile("rb")
1617 fp.close()
1618 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1619
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001620 def test_unusable_closed_socketio(self):
1621 with socket.socket() as sock:
1622 fp = sock.makefile("rb", buffering=0)
1623 self.assertTrue(fp.readable())
1624 self.assertFalse(fp.writable())
1625 self.assertFalse(fp.seekable())
1626 fp.close()
1627 self.assertRaises(ValueError, fp.readable)
1628 self.assertRaises(ValueError, fp.writable)
1629 self.assertRaises(ValueError, fp.seekable)
1630
Christian Heimesd0e31b92018-01-27 09:54:13 +01001631 def test_socket_close(self):
1632 sock = socket.socket()
1633 try:
1634 sock.bind((HOST, 0))
1635 socket.close(sock.fileno())
1636 with self.assertRaises(OSError):
1637 sock.listen(1)
1638 finally:
1639 with self.assertRaises(OSError):
1640 # sock.close() fails with EBADF
1641 sock.close()
1642 with self.assertRaises(TypeError):
1643 socket.close(None)
1644 with self.assertRaises(OSError):
1645 socket.close(-1)
1646
Berker Peksag3fe64d02016-02-18 17:34:00 +02001647 def test_makefile_mode(self):
1648 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1649 with self.subTest(mode=mode):
1650 with socket.socket() as sock:
1651 with sock.makefile(mode) as fp:
1652 self.assertEqual(fp.mode, mode)
1653
1654 def test_makefile_invalid_mode(self):
1655 for mode in 'rt', 'x', '+', 'a':
1656 with self.subTest(mode=mode):
1657 with socket.socket() as sock:
1658 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1659 sock.makefile(mode)
1660
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001661 def test_pickle(self):
1662 sock = socket.socket()
1663 with sock:
1664 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1665 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001666 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1667 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1668 self.assertEqual(family, socket.AF_INET)
1669 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1670 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001671
Serhiy Storchaka78980432013-01-15 01:12:17 +02001672 def test_listen_backlog(self):
1673 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001674 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1675 srv.bind((HOST, 0))
1676 srv.listen(backlog)
1677
1678 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001679 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001680 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001681
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001682 @support.cpython_only
1683 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001684 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001685 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001686 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1687 srv.bind((HOST, 0))
1688 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001689
Serhiy Storchaka16994912020-04-25 10:06:29 +03001690 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001691 def test_flowinfo(self):
1692 self.assertRaises(OverflowError, socket.getnameinfo,
Serhiy Storchaka16994912020-04-25 10:06:29 +03001693 (socket_helper.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001694 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03001695 self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001696
Serhiy Storchaka16994912020-04-25 10:06:29 +03001697 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001698 def test_getaddrinfo_ipv6_basic(self):
1699 ((*_, sockaddr),) = socket.getaddrinfo(
1700 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1701 1234, socket.AF_INET6,
1702 socket.SOCK_DGRAM,
1703 socket.IPPROTO_UDP
1704 )
1705 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1706
Serhiy Storchaka16994912020-04-25 10:06:29 +03001707 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001708 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001709 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001710 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1711 # Just pick up any network interface (Linux, Mac OS X)
1712 (ifindex, test_interface) = socket.if_nameindex()[0]
1713 ((*_, sockaddr),) = socket.getaddrinfo(
1714 'ff02::1de:c0:face:8D%' + test_interface,
1715 1234, socket.AF_INET6,
1716 socket.SOCK_DGRAM,
1717 socket.IPPROTO_UDP
1718 )
1719 # Note missing interface name part in IPv6 address
1720 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1721
Serhiy Storchaka16994912020-04-25 10:06:29 +03001722 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001723 @unittest.skipUnless(
1724 sys.platform == 'win32',
1725 'Numeric scope id does not work or undocumented')
1726 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1727 # Also works on Linux and Mac OS X, but is not documented (?)
1728 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1729 ifindex = 42
1730 ((*_, sockaddr),) = socket.getaddrinfo(
1731 'ff02::1de:c0:face:8D%' + str(ifindex),
1732 1234, socket.AF_INET6,
1733 socket.SOCK_DGRAM,
1734 socket.IPPROTO_UDP
1735 )
1736 # Note missing interface name part in IPv6 address
1737 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1738
Serhiy Storchaka16994912020-04-25 10:06:29 +03001739 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001740 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001741 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001742 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1743 # Just pick up any network interface.
1744 (ifindex, test_interface) = socket.if_nameindex()[0]
1745 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1746 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1747 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1748
Serhiy Storchaka16994912020-04-25 10:06:29 +03001749 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001750 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001751 'Numeric scope id does not work or undocumented')
1752 def test_getnameinfo_ipv6_scopeid_numeric(self):
1753 # Also works on Linux (undocumented), but does not work on Mac OS X
1754 # Windows and Linux allow nonexistent interface numbers here.
1755 ifindex = 42
1756 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1757 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1758 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1759
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001760 def test_str_for_enums(self):
1761 # Make sure that the AF_* and SOCK_* constants have enum-like string
1762 # reprs.
1763 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1764 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001765 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001766
Yury Selivanov98181422017-12-18 20:02:54 -05001767 def test_socket_consistent_sock_type(self):
1768 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1769 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1770 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1771
1772 with socket.socket(socket.AF_INET, sock_type) as s:
1773 self.assertEqual(s.type, socket.SOCK_STREAM)
1774 s.settimeout(1)
1775 self.assertEqual(s.type, socket.SOCK_STREAM)
1776 s.settimeout(0)
1777 self.assertEqual(s.type, socket.SOCK_STREAM)
1778 s.setblocking(True)
1779 self.assertEqual(s.type, socket.SOCK_STREAM)
1780 s.setblocking(False)
1781 self.assertEqual(s.type, socket.SOCK_STREAM)
1782
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001783 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001784 # Test that when created with a family that's not one of the known
1785 # AF_*/SOCK_* constants, socket.family just returns the number.
1786 #
1787 # To do this we fool socket.socket into believing it already has an
1788 # open fd because on this path it doesn't actually verify the family and
1789 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001790 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1791 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001792 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1793
1794 unknown_type = max(
1795 kind
1796 for name, kind in socket.SocketKind.__members__.items()
1797 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1798 ) + 1
1799
1800 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001801 family=unknown_family, type=unknown_type, proto=23,
1802 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001803 self.assertEqual(s.family, unknown_family)
1804 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001805 # some OS like macOS ignore proto
1806 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001807
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001808 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1809 def test__sendfile_use_sendfile(self):
1810 class File:
1811 def __init__(self, fd):
1812 self.fd = fd
1813
1814 def fileno(self):
1815 return self.fd
1816 with socket.socket() as sock:
1817 fd = os.open(os.curdir, os.O_RDONLY)
1818 os.close(fd)
1819 with self.assertRaises(socket._GiveupOnSendfile):
1820 sock._sendfile_use_sendfile(File(fd))
1821 with self.assertRaises(OverflowError):
1822 sock._sendfile_use_sendfile(File(2**1000))
1823 with self.assertRaises(TypeError):
1824 sock._sendfile_use_sendfile(File(None))
1825
Christian Heimesb6e43af2018-01-29 22:37:58 +01001826 def _test_socket_fileno(self, s, family, stype):
1827 self.assertEqual(s.family, family)
1828 self.assertEqual(s.type, stype)
1829
1830 fd = s.fileno()
1831 s2 = socket.socket(fileno=fd)
1832 self.addCleanup(s2.close)
1833 # detach old fd to avoid double close
1834 s.detach()
1835 self.assertEqual(s2.family, family)
1836 self.assertEqual(s2.type, stype)
1837 self.assertEqual(s2.fileno(), fd)
1838
1839 def test_socket_fileno(self):
1840 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1841 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001842 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001843 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1844
1845 if hasattr(socket, "SOCK_DGRAM"):
1846 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1847 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001848 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001849 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1850
Serhiy Storchaka16994912020-04-25 10:06:29 +03001851 if socket_helper.IPV6_ENABLED:
Christian Heimesb6e43af2018-01-29 22:37:58 +01001852 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1853 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001854 s.bind((socket_helper.HOSTv6, 0, 0, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001855 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1856
1857 if hasattr(socket, "AF_UNIX"):
1858 tmpdir = tempfile.mkdtemp()
1859 self.addCleanup(shutil.rmtree, tmpdir)
1860 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1861 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001862 try:
1863 s.bind(os.path.join(tmpdir, 'socket'))
1864 except PermissionError:
1865 pass
1866 else:
1867 self._test_socket_fileno(s, socket.AF_UNIX,
1868 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001869
Dima Tisneke9912702018-12-17 22:07:55 +09001870 def test_socket_fileno_rejects_float(self):
1871 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1872 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1873
1874 def test_socket_fileno_rejects_other_types(self):
1875 with self.assertRaisesRegex(TypeError, "integer is required"):
1876 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1877
1878 def test_socket_fileno_rejects_invalid_socket(self):
1879 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1880 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1881
1882 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1883 def test_socket_fileno_rejects_negative(self):
1884 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1885 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1886
1887 def test_socket_fileno_requires_valid_fd(self):
1888 WSAENOTSOCK = 10038
1889 with self.assertRaises(OSError) as cm:
1890 socket.socket(fileno=support.make_bad_fd())
1891 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1892
1893 with self.assertRaises(OSError) as cm:
1894 socket.socket(
1895 socket.AF_INET,
1896 socket.SOCK_STREAM,
1897 fileno=support.make_bad_fd())
1898 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1899
1900 def test_socket_fileno_requires_socket_fd(self):
1901 with tempfile.NamedTemporaryFile() as afile:
1902 with self.assertRaises(OSError):
1903 socket.socket(fileno=afile.fileno())
1904
1905 with self.assertRaises(OSError) as cm:
1906 socket.socket(
1907 socket.AF_INET,
1908 socket.SOCK_STREAM,
1909 fileno=afile.fileno())
1910 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1911
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001912
Charles-François Natali47413c12011-10-06 19:47:44 +02001913@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1914class BasicCANTest(unittest.TestCase):
1915
1916 def testCrucialConstants(self):
1917 socket.AF_CAN
1918 socket.PF_CAN
1919 socket.CAN_RAW
1920
Charles-François Natali773e42d2013-02-05 19:42:01 +01001921 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1922 'socket.CAN_BCM required for this test.')
1923 def testBCMConstants(self):
1924 socket.CAN_BCM
1925
1926 # opcodes
1927 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1928 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1929 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1930 socket.CAN_BCM_TX_SEND # send one CAN frame
1931 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1932 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1933 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1934 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1935 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1936 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1937 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1938 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1939
karl ding31c4fd22019-07-31 01:47:16 -07001940 # flags
1941 socket.CAN_BCM_SETTIMER
1942 socket.CAN_BCM_STARTTIMER
1943 socket.CAN_BCM_TX_COUNTEVT
1944 socket.CAN_BCM_TX_ANNOUNCE
1945 socket.CAN_BCM_TX_CP_CAN_ID
1946 socket.CAN_BCM_RX_FILTER_ID
1947 socket.CAN_BCM_RX_CHECK_DLC
1948 socket.CAN_BCM_RX_NO_AUTOTIMER
1949 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1950 socket.CAN_BCM_TX_RESET_MULTI_IDX
1951 socket.CAN_BCM_RX_RTR_FRAME
1952
Charles-François Natali47413c12011-10-06 19:47:44 +02001953 def testCreateSocket(self):
1954 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1955 pass
1956
Charles-François Natali773e42d2013-02-05 19:42:01 +01001957 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1958 'socket.CAN_BCM required for this test.')
1959 def testCreateBCMSocket(self):
1960 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1961 pass
1962
Charles-François Natali47413c12011-10-06 19:47:44 +02001963 def testBindAny(self):
1964 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001965 address = ('', )
1966 s.bind(address)
1967 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001968
1969 def testTooLongInterfaceName(self):
1970 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1971 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001972 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001973 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001974
1975 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1976 'socket.CAN_RAW_LOOPBACK required for this test.')
1977 def testLoopback(self):
1978 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1979 for loopback in (0, 1):
1980 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1981 loopback)
1982 self.assertEqual(loopback,
1983 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1984
1985 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1986 'socket.CAN_RAW_FILTER required for this test.')
1987 def testFilter(self):
1988 can_id, can_mask = 0x200, 0x700
1989 can_filter = struct.pack("=II", can_id, can_mask)
1990 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1991 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1992 self.assertEqual(can_filter,
1993 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001994 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001995
1996
1997@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001998class CANTest(ThreadedCANSocketTest):
1999
Charles-François Natali47413c12011-10-06 19:47:44 +02002000 def __init__(self, methodName='runTest'):
2001 ThreadedCANSocketTest.__init__(self, methodName=methodName)
2002
2003 @classmethod
2004 def build_can_frame(cls, can_id, data):
2005 """Build a CAN frame."""
2006 can_dlc = len(data)
2007 data = data.ljust(8, b'\x00')
2008 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2009
2010 @classmethod
2011 def dissect_can_frame(cls, frame):
2012 """Dissect a CAN frame."""
2013 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2014 return (can_id, can_dlc, data[:can_dlc])
2015
2016 def testSendFrame(self):
2017 cf, addr = self.s.recvfrom(self.bufsize)
2018 self.assertEqual(self.cf, cf)
2019 self.assertEqual(addr[0], self.interface)
2020 self.assertEqual(addr[1], socket.AF_CAN)
2021
2022 def _testSendFrame(self):
2023 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2024 self.cli.send(self.cf)
2025
2026 def testSendMaxFrame(self):
2027 cf, addr = self.s.recvfrom(self.bufsize)
2028 self.assertEqual(self.cf, cf)
2029
2030 def _testSendMaxFrame(self):
2031 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2032 self.cli.send(self.cf)
2033
2034 def testSendMultiFrames(self):
2035 cf, addr = self.s.recvfrom(self.bufsize)
2036 self.assertEqual(self.cf1, cf)
2037
2038 cf, addr = self.s.recvfrom(self.bufsize)
2039 self.assertEqual(self.cf2, cf)
2040
2041 def _testSendMultiFrames(self):
2042 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2043 self.cli.send(self.cf1)
2044
2045 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2046 self.cli.send(self.cf2)
2047
Charles-François Natali773e42d2013-02-05 19:42:01 +01002048 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2049 'socket.CAN_BCM required for this test.')
2050 def _testBCM(self):
2051 cf, addr = self.cli.recvfrom(self.bufsize)
2052 self.assertEqual(self.cf, cf)
2053 can_id, can_dlc, data = self.dissect_can_frame(cf)
2054 self.assertEqual(self.can_id, can_id)
2055 self.assertEqual(self.data, data)
2056
2057 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2058 'socket.CAN_BCM required for this test.')
2059 def testBCM(self):
2060 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2061 self.addCleanup(bcm.close)
2062 bcm.connect((self.interface,))
2063 self.can_id = 0x123
2064 self.data = bytes([0xc0, 0xff, 0xee])
2065 self.cf = self.build_can_frame(self.can_id, self.data)
2066 opcode = socket.CAN_BCM_TX_SEND
2067 flags = 0
2068 count = 0
2069 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2070 bcm_can_id = 0x0222
2071 nframes = 1
2072 assert len(self.cf) == 16
2073 header = struct.pack(self.bcm_cmd_msg_fmt,
2074 opcode,
2075 flags,
2076 count,
2077 ival1_seconds,
2078 ival1_usec,
2079 ival2_seconds,
2080 ival2_usec,
2081 bcm_can_id,
2082 nframes,
2083 )
2084 header_plus_frame = header + self.cf
2085 bytes_sent = bcm.send(header_plus_frame)
2086 self.assertEqual(bytes_sent, len(header_plus_frame))
2087
Charles-François Natali47413c12011-10-06 19:47:44 +02002088
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002089@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2090class ISOTPTest(unittest.TestCase):
2091
2092 def __init__(self, *args, **kwargs):
2093 super().__init__(*args, **kwargs)
2094 self.interface = "vcan0"
2095
2096 def testCrucialConstants(self):
2097 socket.AF_CAN
2098 socket.PF_CAN
2099 socket.CAN_ISOTP
2100 socket.SOCK_DGRAM
2101
2102 def testCreateSocket(self):
2103 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2104 pass
2105
2106 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2107 'socket.CAN_ISOTP required for this test.')
2108 def testCreateISOTPSocket(self):
2109 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2110 pass
2111
2112 def testTooLongInterfaceName(self):
2113 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2114 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2115 with self.assertRaisesRegex(OSError, 'interface name too long'):
2116 s.bind(('x' * 1024, 1, 2))
2117
2118 def testBind(self):
2119 try:
2120 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2121 addr = self.interface, 0x123, 0x456
2122 s.bind(addr)
2123 self.assertEqual(s.getsockname(), addr)
2124 except OSError as e:
2125 if e.errno == errno.ENODEV:
2126 self.skipTest('network interface `%s` does not exist' %
2127 self.interface)
2128 else:
2129 raise
2130
2131
karl ding360371f2020-04-29 15:31:19 -07002132@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2133class J1939Test(unittest.TestCase):
2134
2135 def __init__(self, *args, **kwargs):
2136 super().__init__(*args, **kwargs)
2137 self.interface = "vcan0"
2138
2139 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2140 'socket.CAN_J1939 required for this test.')
2141 def testJ1939Constants(self):
2142 socket.CAN_J1939
2143
2144 socket.J1939_MAX_UNICAST_ADDR
2145 socket.J1939_IDLE_ADDR
2146 socket.J1939_NO_ADDR
2147 socket.J1939_NO_NAME
2148 socket.J1939_PGN_REQUEST
2149 socket.J1939_PGN_ADDRESS_CLAIMED
2150 socket.J1939_PGN_ADDRESS_COMMANDED
2151 socket.J1939_PGN_PDU1_MAX
2152 socket.J1939_PGN_MAX
2153 socket.J1939_NO_PGN
2154
2155 # J1939 socket options
2156 socket.SO_J1939_FILTER
2157 socket.SO_J1939_PROMISC
2158 socket.SO_J1939_SEND_PRIO
2159 socket.SO_J1939_ERRQUEUE
2160
2161 socket.SCM_J1939_DEST_ADDR
2162 socket.SCM_J1939_DEST_NAME
2163 socket.SCM_J1939_PRIO
2164 socket.SCM_J1939_ERRQUEUE
2165
2166 socket.J1939_NLA_PAD
2167 socket.J1939_NLA_BYTES_ACKED
2168
2169 socket.J1939_EE_INFO_NONE
2170 socket.J1939_EE_INFO_TX_ABORT
2171
2172 socket.J1939_FILTER_MAX
2173
2174 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2175 'socket.CAN_J1939 required for this test.')
2176 def testCreateJ1939Socket(self):
2177 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2178 pass
2179
2180 def testBind(self):
2181 try:
2182 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2183 addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2184 s.bind(addr)
2185 self.assertEqual(s.getsockname(), addr)
2186 except OSError as e:
2187 if e.errno == errno.ENODEV:
2188 self.skipTest('network interface `%s` does not exist' %
2189 self.interface)
2190 else:
2191 raise
2192
2193
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002194@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2195class BasicRDSTest(unittest.TestCase):
2196
2197 def testCrucialConstants(self):
2198 socket.AF_RDS
2199 socket.PF_RDS
2200
2201 def testCreateSocket(self):
2202 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2203 pass
2204
2205 def testSocketBufferSize(self):
2206 bufsize = 16384
2207 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2208 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2209 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2210
2211
2212@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002213class RDSTest(ThreadedRDSSocketTest):
2214
2215 def __init__(self, methodName='runTest'):
2216 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2217
Charles-François Natali240c55f2011-11-10 20:33:36 +01002218 def setUp(self):
2219 super().setUp()
2220 self.evt = threading.Event()
2221
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002222 def testSendAndRecv(self):
2223 data, addr = self.serv.recvfrom(self.bufsize)
2224 self.assertEqual(self.data, data)
2225 self.assertEqual(self.cli_addr, addr)
2226
2227 def _testSendAndRecv(self):
2228 self.data = b'spam'
2229 self.cli.sendto(self.data, 0, (HOST, self.port))
2230
2231 def testPeek(self):
2232 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2233 self.assertEqual(self.data, data)
2234 data, addr = self.serv.recvfrom(self.bufsize)
2235 self.assertEqual(self.data, data)
2236
2237 def _testPeek(self):
2238 self.data = b'spam'
2239 self.cli.sendto(self.data, 0, (HOST, self.port))
2240
2241 @requireAttrs(socket.socket, 'recvmsg')
2242 def testSendAndRecvMsg(self):
2243 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2244 self.assertEqual(self.data, data)
2245
2246 @requireAttrs(socket.socket, 'sendmsg')
2247 def _testSendAndRecvMsg(self):
2248 self.data = b'hello ' * 10
2249 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2250
2251 def testSendAndRecvMulti(self):
2252 data, addr = self.serv.recvfrom(self.bufsize)
2253 self.assertEqual(self.data1, data)
2254
2255 data, addr = self.serv.recvfrom(self.bufsize)
2256 self.assertEqual(self.data2, data)
2257
2258 def _testSendAndRecvMulti(self):
2259 self.data1 = b'bacon'
2260 self.cli.sendto(self.data1, 0, (HOST, self.port))
2261
2262 self.data2 = b'egg'
2263 self.cli.sendto(self.data2, 0, (HOST, self.port))
2264
2265 def testSelect(self):
2266 r, w, x = select.select([self.serv], [], [], 3.0)
2267 self.assertIn(self.serv, r)
2268 data, addr = self.serv.recvfrom(self.bufsize)
2269 self.assertEqual(self.data, data)
2270
2271 def _testSelect(self):
2272 self.data = b'select'
2273 self.cli.sendto(self.data, 0, (HOST, self.port))
2274
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002275@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2276 'QIPCRTR sockets required for this test.')
2277class BasicQIPCRTRTest(unittest.TestCase):
2278
2279 def testCrucialConstants(self):
2280 socket.AF_QIPCRTR
2281
2282 def testCreateSocket(self):
2283 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2284 pass
2285
2286 def testUnbound(self):
2287 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2288 self.assertEqual(s.getsockname()[1], 0)
2289
2290 def testBindSock(self):
2291 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002292 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002293 self.assertNotEqual(s.getsockname()[1], 0)
2294
2295 def testInvalidBindSock(self):
2296 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002297 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002298
2299 def testAutoBindSock(self):
2300 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2301 s.connect((123, 123))
2302 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002303
caaveryeffc12f2017-09-06 18:18:10 -04002304@unittest.skipIf(fcntl is None, "need fcntl")
2305@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2306 'VSOCK sockets required for this test.')
2307class BasicVSOCKTest(unittest.TestCase):
2308
2309 def testCrucialConstants(self):
2310 socket.AF_VSOCK
2311
2312 def testVSOCKConstants(self):
2313 socket.SO_VM_SOCKETS_BUFFER_SIZE
2314 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2315 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2316 socket.VMADDR_CID_ANY
2317 socket.VMADDR_PORT_ANY
2318 socket.VMADDR_CID_HOST
2319 socket.VM_SOCKETS_INVALID_VERSION
2320 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2321
2322 def testCreateSocket(self):
2323 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2324 pass
2325
2326 def testSocketBufferSize(self):
2327 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2328 orig_max = s.getsockopt(socket.AF_VSOCK,
2329 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2330 orig = s.getsockopt(socket.AF_VSOCK,
2331 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2332 orig_min = s.getsockopt(socket.AF_VSOCK,
2333 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2334
2335 s.setsockopt(socket.AF_VSOCK,
2336 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2337 s.setsockopt(socket.AF_VSOCK,
2338 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2339 s.setsockopt(socket.AF_VSOCK,
2340 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2341
2342 self.assertEqual(orig_max * 2,
2343 s.getsockopt(socket.AF_VSOCK,
2344 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2345 self.assertEqual(orig * 2,
2346 s.getsockopt(socket.AF_VSOCK,
2347 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2348 self.assertEqual(orig_min * 2,
2349 s.getsockopt(socket.AF_VSOCK,
2350 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2351
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002352
Greg Bowser8fbece12019-08-02 16:29:52 -04002353@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2354 'Bluetooth sockets required for this test.')
2355class BasicBluetoothTest(unittest.TestCase):
2356
2357 def testBluetoothConstants(self):
2358 socket.BDADDR_ANY
2359 socket.BDADDR_LOCAL
2360 socket.AF_BLUETOOTH
2361 socket.BTPROTO_RFCOMM
2362
2363 if sys.platform != "win32":
2364 socket.BTPROTO_HCI
2365 socket.SOL_HCI
2366 socket.BTPROTO_L2CAP
2367
2368 if not sys.platform.startswith("freebsd"):
2369 socket.BTPROTO_SCO
2370
2371 def testCreateRfcommSocket(self):
2372 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2373 pass
2374
2375 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2376 def testCreateL2capSocket(self):
2377 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2378 pass
2379
2380 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2381 def testCreateHciSocket(self):
2382 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2383 pass
2384
2385 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2386 "windows and freebsd do not support SCO sockets")
2387 def testCreateScoSocket(self):
2388 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2389 pass
2390
2391
Guido van Rossum24e4af82002-06-12 19:18:08 +00002392class BasicTCPTest(SocketConnectedTest):
2393
2394 def __init__(self, methodName='runTest'):
2395 SocketConnectedTest.__init__(self, methodName=methodName)
2396
2397 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002398 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002399 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002400 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002401
2402 def _testRecv(self):
2403 self.serv_conn.send(MSG)
2404
2405 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002406 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002407 seg1 = self.cli_conn.recv(len(MSG) - 3)
2408 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002409 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002410 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002411
2412 def _testOverFlowRecv(self):
2413 self.serv_conn.send(MSG)
2414
2415 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002416 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002417 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002418 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002419
2420 def _testRecvFrom(self):
2421 self.serv_conn.send(MSG)
2422
2423 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002424 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002425 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2426 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002427 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002428 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002429
2430 def _testOverFlowRecvFrom(self):
2431 self.serv_conn.send(MSG)
2432
2433 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002434 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002435 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002436 while 1:
2437 read = self.cli_conn.recv(1024)
2438 if not read:
2439 break
Guido van Rossume531e292002-08-08 20:28:34 +00002440 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002441 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002442
2443 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002444 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002445 self.serv_conn.sendall(big_chunk)
2446
2447 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002448 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002449 fd = self.cli_conn.fileno()
2450 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002451 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002452 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002453 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002454 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002455
2456 def _testFromFd(self):
2457 self.serv_conn.send(MSG)
2458
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002459 def testDup(self):
2460 # Testing dup()
2461 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002462 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002463 msg = sock.recv(1024)
2464 self.assertEqual(msg, MSG)
2465
2466 def _testDup(self):
2467 self.serv_conn.send(MSG)
2468
Guido van Rossum24e4af82002-06-12 19:18:08 +00002469 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002470 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002471 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002472 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002473 # wait for _testShutdown to finish: on OS X, when the server
2474 # closes the connection the client also becomes disconnected,
2475 # and the client's shutdown call will fail. (Issue #4397.)
2476 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002477
2478 def _testShutdown(self):
2479 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002480 self.serv_conn.shutdown(2)
2481
2482 testShutdown_overflow = support.cpython_only(testShutdown)
2483
2484 @support.cpython_only
2485 def _testShutdown_overflow(self):
2486 import _testcapi
2487 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002488 # Issue 15989
2489 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2490 _testcapi.INT_MAX + 1)
2491 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2492 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002493 self.serv_conn.shutdown(2)
2494
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002495 def testDetach(self):
2496 # Testing detach()
2497 fileno = self.cli_conn.fileno()
2498 f = self.cli_conn.detach()
2499 self.assertEqual(f, fileno)
2500 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002501 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002502 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002503 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002504 # ...but we can create another socket using the (still open)
2505 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002506 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002507 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002508 msg = sock.recv(1024)
2509 self.assertEqual(msg, MSG)
2510
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002511 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002512 self.serv_conn.send(MSG)
2513
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002514
Guido van Rossum24e4af82002-06-12 19:18:08 +00002515class BasicUDPTest(ThreadedUDPSocketTest):
2516
2517 def __init__(self, methodName='runTest'):
2518 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2519
2520 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002521 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002522 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002523 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002524
2525 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002526 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002527
Guido van Rossum1c938012002-06-12 21:17:20 +00002528 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002529 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002530 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002531 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002532
Guido van Rossum1c938012002-06-12 21:17:20 +00002533 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002534 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002535
Guido van Rossumd8faa362007-04-27 19:54:29 +00002536 def testRecvFromNegative(self):
2537 # Negative lengths passed to recvfrom should give ValueError.
2538 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2539
2540 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002541 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002542
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002543
2544@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2545 'UDPLITE sockets required for this test.')
2546class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2547
2548 def __init__(self, methodName='runTest'):
2549 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2550
2551 def testSendtoAndRecv(self):
2552 # Testing sendto() and Recv() over UDPLITE
2553 msg = self.serv.recv(len(MSG))
2554 self.assertEqual(msg, MSG)
2555
2556 def _testSendtoAndRecv(self):
2557 self.cli.sendto(MSG, 0, (HOST, self.port))
2558
2559 def testRecvFrom(self):
2560 # Testing recvfrom() over UDPLITE
2561 msg, addr = self.serv.recvfrom(len(MSG))
2562 self.assertEqual(msg, MSG)
2563
2564 def _testRecvFrom(self):
2565 self.cli.sendto(MSG, 0, (HOST, self.port))
2566
2567 def testRecvFromNegative(self):
2568 # Negative lengths passed to recvfrom should give ValueError.
2569 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2570
2571 def _testRecvFromNegative(self):
2572 self.cli.sendto(MSG, 0, (HOST, self.port))
2573
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002574# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2575# same test code is used with different families and types of socket
2576# (e.g. stream, datagram), and tests using recvmsg() are repeated
2577# using recvmsg_into().
2578#
2579# The generic test classes such as SendmsgTests and
2580# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2581# supplied with sockets cli_sock and serv_sock representing the
2582# client's and the server's end of the connection respectively, and
2583# attributes cli_addr and serv_addr holding their (numeric where
2584# appropriate) addresses.
2585#
2586# The final concrete test classes combine these with subclasses of
2587# SocketTestBase which set up client and server sockets of a specific
2588# type, and with subclasses of SendrecvmsgBase such as
2589# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2590# sockets to cli_sock and serv_sock and override the methods and
2591# attributes of SendrecvmsgBase to fill in destination addresses if
2592# needed when sending, check for specific flags in msg_flags, etc.
2593#
2594# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2595# recvmsg_into().
2596
2597# XXX: like the other datagram (UDP) tests in this module, the code
2598# here assumes that datagram delivery on the local machine will be
2599# reliable.
2600
2601class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2602 # Base class for sendmsg()/recvmsg() tests.
2603
2604 # Time in seconds to wait before considering a test failed, or
2605 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002606 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002607
2608 def setUp(self):
2609 self.misc_event = threading.Event()
2610 super().setUp()
2611
2612 def sendToServer(self, msg):
2613 # Send msg to the server.
2614 return self.cli_sock.send(msg)
2615
2616 # Tuple of alternative default arguments for sendmsg() when called
2617 # via sendmsgToServer() (e.g. to include a destination address).
2618 sendmsg_to_server_defaults = ()
2619
2620 def sendmsgToServer(self, *args):
2621 # Call sendmsg() on self.cli_sock with the given arguments,
2622 # filling in any arguments which are not supplied with the
2623 # corresponding items of self.sendmsg_to_server_defaults, if
2624 # any.
2625 return self.cli_sock.sendmsg(
2626 *(args + self.sendmsg_to_server_defaults[len(args):]))
2627
2628 def doRecvmsg(self, sock, bufsize, *args):
2629 # Call recvmsg() on sock with given arguments and return its
2630 # result. Should be used for tests which can use either
2631 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2632 # this method with one which emulates it using recvmsg_into(),
2633 # thus allowing the same test to be used for both methods.
2634 result = sock.recvmsg(bufsize, *args)
2635 self.registerRecvmsgResult(result)
2636 return result
2637
2638 def registerRecvmsgResult(self, result):
2639 # Called by doRecvmsg() with the return value of recvmsg() or
2640 # recvmsg_into(). Can be overridden to arrange cleanup based
2641 # on the returned ancillary data, for instance.
2642 pass
2643
2644 def checkRecvmsgAddress(self, addr1, addr2):
2645 # Called to compare the received address with the address of
2646 # the peer.
2647 self.assertEqual(addr1, addr2)
2648
2649 # Flags that are normally unset in msg_flags
2650 msg_flags_common_unset = 0
2651 for name in ("MSG_CTRUNC", "MSG_OOB"):
2652 msg_flags_common_unset |= getattr(socket, name, 0)
2653
2654 # Flags that are normally set
2655 msg_flags_common_set = 0
2656
2657 # Flags set when a complete record has been received (e.g. MSG_EOR
2658 # for SCTP)
2659 msg_flags_eor_indicator = 0
2660
2661 # Flags set when a complete record has not been received
2662 # (e.g. MSG_TRUNC for datagram sockets)
2663 msg_flags_non_eor_indicator = 0
2664
2665 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2666 # Method to check the value of msg_flags returned by recvmsg[_into]().
2667 #
2668 # Checks that all bits in msg_flags_common_set attribute are
2669 # set in "flags" and all bits in msg_flags_common_unset are
2670 # unset.
2671 #
2672 # The "eor" argument specifies whether the flags should
2673 # indicate that a full record (or datagram) has been received.
2674 # If "eor" is None, no checks are done; otherwise, checks
2675 # that:
2676 #
2677 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2678 # set and all bits in msg_flags_non_eor_indicator are unset
2679 #
2680 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2681 # are set and all bits in msg_flags_eor_indicator are unset
2682 #
2683 # If "checkset" and/or "checkunset" are supplied, they require
2684 # the given bits to be set or unset respectively, overriding
2685 # what the attributes require for those bits.
2686 #
2687 # If any bits are set in "ignore", they will not be checked,
2688 # regardless of the other inputs.
2689 #
2690 # Will raise Exception if the inputs require a bit to be both
2691 # set and unset, and it is not ignored.
2692
2693 defaultset = self.msg_flags_common_set
2694 defaultunset = self.msg_flags_common_unset
2695
2696 if eor:
2697 defaultset |= self.msg_flags_eor_indicator
2698 defaultunset |= self.msg_flags_non_eor_indicator
2699 elif eor is not None:
2700 defaultset |= self.msg_flags_non_eor_indicator
2701 defaultunset |= self.msg_flags_eor_indicator
2702
2703 # Function arguments override defaults
2704 defaultset &= ~checkunset
2705 defaultunset &= ~checkset
2706
2707 # Merge arguments with remaining defaults, and check for conflicts
2708 checkset |= defaultset
2709 checkunset |= defaultunset
2710 inboth = checkset & checkunset & ~ignore
2711 if inboth:
2712 raise Exception("contradictory set, unset requirements for flags "
2713 "{0:#x}".format(inboth))
2714
2715 # Compare with given msg_flags value
2716 mask = (checkset | checkunset) & ~ignore
2717 self.assertEqual(flags & mask, checkset & mask)
2718
2719
2720class RecvmsgIntoMixin(SendrecvmsgBase):
2721 # Mixin to implement doRecvmsg() using recvmsg_into().
2722
2723 def doRecvmsg(self, sock, bufsize, *args):
2724 buf = bytearray(bufsize)
2725 result = sock.recvmsg_into([buf], *args)
2726 self.registerRecvmsgResult(result)
2727 self.assertGreaterEqual(result[0], 0)
2728 self.assertLessEqual(result[0], bufsize)
2729 return (bytes(buf[:result[0]]),) + result[1:]
2730
2731
2732class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2733 # Defines flags to be checked in msg_flags for datagram sockets.
2734
2735 @property
2736 def msg_flags_non_eor_indicator(self):
2737 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2738
2739
2740class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2741 # Defines flags to be checked in msg_flags for SCTP sockets.
2742
2743 @property
2744 def msg_flags_eor_indicator(self):
2745 return super().msg_flags_eor_indicator | socket.MSG_EOR
2746
2747
2748class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2749 # Base class for tests on connectionless-mode sockets. Users must
2750 # supply sockets on attributes cli and serv to be mapped to
2751 # cli_sock and serv_sock respectively.
2752
2753 @property
2754 def serv_sock(self):
2755 return self.serv
2756
2757 @property
2758 def cli_sock(self):
2759 return self.cli
2760
2761 @property
2762 def sendmsg_to_server_defaults(self):
2763 return ([], [], 0, self.serv_addr)
2764
2765 def sendToServer(self, msg):
2766 return self.cli_sock.sendto(msg, self.serv_addr)
2767
2768
2769class SendrecvmsgConnectedBase(SendrecvmsgBase):
2770 # Base class for tests on connected sockets. Users must supply
2771 # sockets on attributes serv_conn and cli_conn (representing the
2772 # connections *to* the server and the client), to be mapped to
2773 # cli_sock and serv_sock respectively.
2774
2775 @property
2776 def serv_sock(self):
2777 return self.cli_conn
2778
2779 @property
2780 def cli_sock(self):
2781 return self.serv_conn
2782
2783 def checkRecvmsgAddress(self, addr1, addr2):
2784 # Address is currently "unspecified" for a connected socket,
2785 # so we don't examine it
2786 pass
2787
2788
2789class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2790 # Base class to set a timeout on server's socket.
2791
2792 def setUp(self):
2793 super().setUp()
2794 self.serv_sock.settimeout(self.fail_timeout)
2795
2796
2797class SendmsgTests(SendrecvmsgServerTimeoutBase):
2798 # Tests for sendmsg() which can use any socket type and do not
2799 # involve recvmsg() or recvmsg_into().
2800
2801 def testSendmsg(self):
2802 # Send a simple message with sendmsg().
2803 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2804
2805 def _testSendmsg(self):
2806 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2807
2808 def testSendmsgDataGenerator(self):
2809 # Send from buffer obtained from a generator (not a sequence).
2810 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2811
2812 def _testSendmsgDataGenerator(self):
2813 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2814 len(MSG))
2815
2816 def testSendmsgAncillaryGenerator(self):
2817 # Gather (empty) ancillary data from a generator.
2818 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2819
2820 def _testSendmsgAncillaryGenerator(self):
2821 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2822 len(MSG))
2823
2824 def testSendmsgArray(self):
2825 # Send data from an array instead of the usual bytes object.
2826 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2827
2828 def _testSendmsgArray(self):
2829 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2830 len(MSG))
2831
2832 def testSendmsgGather(self):
2833 # Send message data from more than one buffer (gather write).
2834 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2835
2836 def _testSendmsgGather(self):
2837 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2838
2839 def testSendmsgBadArgs(self):
2840 # Check that sendmsg() rejects invalid arguments.
2841 self.assertEqual(self.serv_sock.recv(1000), b"done")
2842
2843 def _testSendmsgBadArgs(self):
2844 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2845 self.assertRaises(TypeError, self.sendmsgToServer,
2846 b"not in an iterable")
2847 self.assertRaises(TypeError, self.sendmsgToServer,
2848 object())
2849 self.assertRaises(TypeError, self.sendmsgToServer,
2850 [object()])
2851 self.assertRaises(TypeError, self.sendmsgToServer,
2852 [MSG, object()])
2853 self.assertRaises(TypeError, self.sendmsgToServer,
2854 [MSG], object())
2855 self.assertRaises(TypeError, self.sendmsgToServer,
2856 [MSG], [], object())
2857 self.assertRaises(TypeError, self.sendmsgToServer,
2858 [MSG], [], 0, object())
2859 self.sendToServer(b"done")
2860
2861 def testSendmsgBadCmsg(self):
2862 # Check that invalid ancillary data items are rejected.
2863 self.assertEqual(self.serv_sock.recv(1000), b"done")
2864
2865 def _testSendmsgBadCmsg(self):
2866 self.assertRaises(TypeError, self.sendmsgToServer,
2867 [MSG], [object()])
2868 self.assertRaises(TypeError, self.sendmsgToServer,
2869 [MSG], [(object(), 0, b"data")])
2870 self.assertRaises(TypeError, self.sendmsgToServer,
2871 [MSG], [(0, object(), b"data")])
2872 self.assertRaises(TypeError, self.sendmsgToServer,
2873 [MSG], [(0, 0, object())])
2874 self.assertRaises(TypeError, self.sendmsgToServer,
2875 [MSG], [(0, 0)])
2876 self.assertRaises(TypeError, self.sendmsgToServer,
2877 [MSG], [(0, 0, b"data", 42)])
2878 self.sendToServer(b"done")
2879
2880 @requireAttrs(socket, "CMSG_SPACE")
2881 def testSendmsgBadMultiCmsg(self):
2882 # Check that invalid ancillary data items are rejected when
2883 # more than one item is present.
2884 self.assertEqual(self.serv_sock.recv(1000), b"done")
2885
2886 @testSendmsgBadMultiCmsg.client_skip
2887 def _testSendmsgBadMultiCmsg(self):
2888 self.assertRaises(TypeError, self.sendmsgToServer,
2889 [MSG], [0, 0, b""])
2890 self.assertRaises(TypeError, self.sendmsgToServer,
2891 [MSG], [(0, 0, b""), object()])
2892 self.sendToServer(b"done")
2893
2894 def testSendmsgExcessCmsgReject(self):
2895 # Check that sendmsg() rejects excess ancillary data items
2896 # when the number that can be sent is limited.
2897 self.assertEqual(self.serv_sock.recv(1000), b"done")
2898
2899 def _testSendmsgExcessCmsgReject(self):
2900 if not hasattr(socket, "CMSG_SPACE"):
2901 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002902 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002903 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2904 self.assertIsNone(cm.exception.errno)
2905 self.sendToServer(b"done")
2906
2907 def testSendmsgAfterClose(self):
2908 # Check that sendmsg() fails on a closed socket.
2909 pass
2910
2911 def _testSendmsgAfterClose(self):
2912 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002913 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002914
2915
2916class SendmsgStreamTests(SendmsgTests):
2917 # Tests for sendmsg() which require a stream socket and do not
2918 # involve recvmsg() or recvmsg_into().
2919
2920 def testSendmsgExplicitNoneAddr(self):
2921 # Check that peer address can be specified as None.
2922 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2923
2924 def _testSendmsgExplicitNoneAddr(self):
2925 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2926
2927 def testSendmsgTimeout(self):
2928 # Check that timeout works with sendmsg().
2929 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2930 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2931
2932 def _testSendmsgTimeout(self):
2933 try:
2934 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002935 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002936 while True:
2937 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002938 except socket.timeout:
2939 pass
2940 except OSError as exc:
2941 if exc.errno != errno.ENOMEM:
2942 raise
2943 # bpo-33937 the test randomly fails on Travis CI with
2944 # "OSError: [Errno 12] Cannot allocate memory"
2945 else:
2946 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002947 finally:
2948 self.misc_event.set()
2949
2950 # XXX: would be nice to have more tests for sendmsg flags argument.
2951
2952 # Linux supports MSG_DONTWAIT when sending, but in general, it
2953 # only works when receiving. Could add other platforms if they
2954 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002955 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002956 "MSG_DONTWAIT not known to work on this platform when "
2957 "sending")
2958 def testSendmsgDontWait(self):
2959 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2960 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2961 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2962
2963 @testSendmsgDontWait.client_skip
2964 def _testSendmsgDontWait(self):
2965 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002966 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002967 while True:
2968 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002969 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2970 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002971 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002972 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002973 finally:
2974 self.misc_event.set()
2975
2976
2977class SendmsgConnectionlessTests(SendmsgTests):
2978 # Tests for sendmsg() which require a connectionless-mode
2979 # (e.g. datagram) socket, and do not involve recvmsg() or
2980 # recvmsg_into().
2981
2982 def testSendmsgNoDestAddr(self):
2983 # Check that sendmsg() fails when no destination address is
2984 # given for unconnected socket.
2985 pass
2986
2987 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002988 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002989 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002990 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002991 [MSG], [], 0, None)
2992
2993
2994class RecvmsgGenericTests(SendrecvmsgBase):
2995 # Tests for recvmsg() which can also be emulated using
2996 # recvmsg_into(), and can use any socket type.
2997
2998 def testRecvmsg(self):
2999 # Receive a simple message with recvmsg[_into]().
3000 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3001 self.assertEqual(msg, MSG)
3002 self.checkRecvmsgAddress(addr, self.cli_addr)
3003 self.assertEqual(ancdata, [])
3004 self.checkFlags(flags, eor=True)
3005
3006 def _testRecvmsg(self):
3007 self.sendToServer(MSG)
3008
3009 def testRecvmsgExplicitDefaults(self):
3010 # Test recvmsg[_into]() with default arguments provided explicitly.
3011 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3012 len(MSG), 0, 0)
3013 self.assertEqual(msg, MSG)
3014 self.checkRecvmsgAddress(addr, self.cli_addr)
3015 self.assertEqual(ancdata, [])
3016 self.checkFlags(flags, eor=True)
3017
3018 def _testRecvmsgExplicitDefaults(self):
3019 self.sendToServer(MSG)
3020
3021 def testRecvmsgShorter(self):
3022 # Receive a message smaller than buffer.
3023 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3024 len(MSG) + 42)
3025 self.assertEqual(msg, MSG)
3026 self.checkRecvmsgAddress(addr, self.cli_addr)
3027 self.assertEqual(ancdata, [])
3028 self.checkFlags(flags, eor=True)
3029
3030 def _testRecvmsgShorter(self):
3031 self.sendToServer(MSG)
3032
3033 def testRecvmsgTrunc(self):
3034 # Receive part of message, check for truncation indicators.
3035 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3036 len(MSG) - 3)
3037 self.assertEqual(msg, MSG[:-3])
3038 self.checkRecvmsgAddress(addr, self.cli_addr)
3039 self.assertEqual(ancdata, [])
3040 self.checkFlags(flags, eor=False)
3041
3042 def _testRecvmsgTrunc(self):
3043 self.sendToServer(MSG)
3044
3045 def testRecvmsgShortAncillaryBuf(self):
3046 # Test ancillary data buffer too small to hold any ancillary data.
3047 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3048 len(MSG), 1)
3049 self.assertEqual(msg, MSG)
3050 self.checkRecvmsgAddress(addr, self.cli_addr)
3051 self.assertEqual(ancdata, [])
3052 self.checkFlags(flags, eor=True)
3053
3054 def _testRecvmsgShortAncillaryBuf(self):
3055 self.sendToServer(MSG)
3056
3057 def testRecvmsgLongAncillaryBuf(self):
3058 # Test large ancillary data buffer.
3059 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3060 len(MSG), 10240)
3061 self.assertEqual(msg, MSG)
3062 self.checkRecvmsgAddress(addr, self.cli_addr)
3063 self.assertEqual(ancdata, [])
3064 self.checkFlags(flags, eor=True)
3065
3066 def _testRecvmsgLongAncillaryBuf(self):
3067 self.sendToServer(MSG)
3068
3069 def testRecvmsgAfterClose(self):
3070 # Check that recvmsg[_into]() fails on a closed socket.
3071 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003072 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003073
3074 def _testRecvmsgAfterClose(self):
3075 pass
3076
3077 def testRecvmsgTimeout(self):
3078 # Check that timeout works.
3079 try:
3080 self.serv_sock.settimeout(0.03)
3081 self.assertRaises(socket.timeout,
3082 self.doRecvmsg, self.serv_sock, len(MSG))
3083 finally:
3084 self.misc_event.set()
3085
3086 def _testRecvmsgTimeout(self):
3087 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3088
3089 @requireAttrs(socket, "MSG_PEEK")
3090 def testRecvmsgPeek(self):
3091 # Check that MSG_PEEK in flags enables examination of pending
3092 # data without consuming it.
3093
3094 # Receive part of data with MSG_PEEK.
3095 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3096 len(MSG) - 3, 0,
3097 socket.MSG_PEEK)
3098 self.assertEqual(msg, MSG[:-3])
3099 self.checkRecvmsgAddress(addr, self.cli_addr)
3100 self.assertEqual(ancdata, [])
3101 # Ignoring MSG_TRUNC here (so this test is the same for stream
3102 # and datagram sockets). Some wording in POSIX seems to
3103 # suggest that it needn't be set when peeking, but that may
3104 # just be a slip.
3105 self.checkFlags(flags, eor=False,
3106 ignore=getattr(socket, "MSG_TRUNC", 0))
3107
3108 # Receive all data with MSG_PEEK.
3109 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3110 len(MSG), 0,
3111 socket.MSG_PEEK)
3112 self.assertEqual(msg, MSG)
3113 self.checkRecvmsgAddress(addr, self.cli_addr)
3114 self.assertEqual(ancdata, [])
3115 self.checkFlags(flags, eor=True)
3116
3117 # Check that the same data can still be received normally.
3118 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3119 self.assertEqual(msg, MSG)
3120 self.checkRecvmsgAddress(addr, self.cli_addr)
3121 self.assertEqual(ancdata, [])
3122 self.checkFlags(flags, eor=True)
3123
3124 @testRecvmsgPeek.client_skip
3125 def _testRecvmsgPeek(self):
3126 self.sendToServer(MSG)
3127
3128 @requireAttrs(socket.socket, "sendmsg")
3129 def testRecvmsgFromSendmsg(self):
3130 # Test receiving with recvmsg[_into]() when message is sent
3131 # using sendmsg().
3132 self.serv_sock.settimeout(self.fail_timeout)
3133 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3134 self.assertEqual(msg, MSG)
3135 self.checkRecvmsgAddress(addr, self.cli_addr)
3136 self.assertEqual(ancdata, [])
3137 self.checkFlags(flags, eor=True)
3138
3139 @testRecvmsgFromSendmsg.client_skip
3140 def _testRecvmsgFromSendmsg(self):
3141 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3142
3143
3144class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3145 # Tests which require a stream socket and can use either recvmsg()
3146 # or recvmsg_into().
3147
3148 def testRecvmsgEOF(self):
3149 # Receive end-of-stream indicator (b"", peer socket closed).
3150 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3151 self.assertEqual(msg, b"")
3152 self.checkRecvmsgAddress(addr, self.cli_addr)
3153 self.assertEqual(ancdata, [])
3154 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3155
3156 def _testRecvmsgEOF(self):
3157 self.cli_sock.close()
3158
3159 def testRecvmsgOverflow(self):
3160 # Receive a message in more than one chunk.
3161 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3162 len(MSG) - 3)
3163 self.checkRecvmsgAddress(addr, self.cli_addr)
3164 self.assertEqual(ancdata, [])
3165 self.checkFlags(flags, eor=False)
3166
3167 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3168 self.checkRecvmsgAddress(addr, self.cli_addr)
3169 self.assertEqual(ancdata, [])
3170 self.checkFlags(flags, eor=True)
3171
3172 msg = seg1 + seg2
3173 self.assertEqual(msg, MSG)
3174
3175 def _testRecvmsgOverflow(self):
3176 self.sendToServer(MSG)
3177
3178
3179class RecvmsgTests(RecvmsgGenericTests):
3180 # Tests for recvmsg() which can use any socket type.
3181
3182 def testRecvmsgBadArgs(self):
3183 # Check that recvmsg() rejects invalid arguments.
3184 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3185 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3186 -1, 0, 0)
3187 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3188 len(MSG), -1, 0)
3189 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3190 [bytearray(10)], 0, 0)
3191 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3192 object(), 0, 0)
3193 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3194 len(MSG), object(), 0)
3195 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3196 len(MSG), 0, object())
3197
3198 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3199 self.assertEqual(msg, MSG)
3200 self.checkRecvmsgAddress(addr, self.cli_addr)
3201 self.assertEqual(ancdata, [])
3202 self.checkFlags(flags, eor=True)
3203
3204 def _testRecvmsgBadArgs(self):
3205 self.sendToServer(MSG)
3206
3207
3208class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3209 # Tests for recvmsg_into() which can use any socket type.
3210
3211 def testRecvmsgIntoBadArgs(self):
3212 # Check that recvmsg_into() rejects invalid arguments.
3213 buf = bytearray(len(MSG))
3214 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3215 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3216 len(MSG), 0, 0)
3217 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3218 buf, 0, 0)
3219 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3220 [object()], 0, 0)
3221 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3222 [b"I'm not writable"], 0, 0)
3223 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3224 [buf, object()], 0, 0)
3225 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3226 [buf], -1, 0)
3227 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3228 [buf], object(), 0)
3229 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3230 [buf], 0, object())
3231
3232 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3233 self.assertEqual(nbytes, len(MSG))
3234 self.assertEqual(buf, bytearray(MSG))
3235 self.checkRecvmsgAddress(addr, self.cli_addr)
3236 self.assertEqual(ancdata, [])
3237 self.checkFlags(flags, eor=True)
3238
3239 def _testRecvmsgIntoBadArgs(self):
3240 self.sendToServer(MSG)
3241
3242 def testRecvmsgIntoGenerator(self):
3243 # Receive into buffer obtained from a generator (not a sequence).
3244 buf = bytearray(len(MSG))
3245 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3246 (o for o in [buf]))
3247 self.assertEqual(nbytes, len(MSG))
3248 self.assertEqual(buf, bytearray(MSG))
3249 self.checkRecvmsgAddress(addr, self.cli_addr)
3250 self.assertEqual(ancdata, [])
3251 self.checkFlags(flags, eor=True)
3252
3253 def _testRecvmsgIntoGenerator(self):
3254 self.sendToServer(MSG)
3255
3256 def testRecvmsgIntoArray(self):
3257 # Receive into an array rather than the usual bytearray.
3258 buf = array.array("B", [0] * len(MSG))
3259 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3260 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003261 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003262 self.checkRecvmsgAddress(addr, self.cli_addr)
3263 self.assertEqual(ancdata, [])
3264 self.checkFlags(flags, eor=True)
3265
3266 def _testRecvmsgIntoArray(self):
3267 self.sendToServer(MSG)
3268
3269 def testRecvmsgIntoScatter(self):
3270 # Receive into multiple buffers (scatter write).
3271 b1 = bytearray(b"----")
3272 b2 = bytearray(b"0123456789")
3273 b3 = bytearray(b"--------------")
3274 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3275 [b1, memoryview(b2)[2:9], b3])
3276 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3277 self.assertEqual(b1, bytearray(b"Mary"))
3278 self.assertEqual(b2, bytearray(b"01 had a 9"))
3279 self.assertEqual(b3, bytearray(b"little lamb---"))
3280 self.checkRecvmsgAddress(addr, self.cli_addr)
3281 self.assertEqual(ancdata, [])
3282 self.checkFlags(flags, eor=True)
3283
3284 def _testRecvmsgIntoScatter(self):
3285 self.sendToServer(b"Mary had a little lamb")
3286
3287
3288class CmsgMacroTests(unittest.TestCase):
3289 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3290 # assumptions used by sendmsg() and recvmsg[_into](), which share
3291 # code with these functions.
3292
3293 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003294 try:
3295 import _testcapi
3296 except ImportError:
3297 socklen_t_limit = 0x7fffffff
3298 else:
3299 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003300
3301 @requireAttrs(socket, "CMSG_LEN")
3302 def testCMSG_LEN(self):
3303 # Test CMSG_LEN() with various valid and invalid values,
3304 # checking the assumptions used by recvmsg() and sendmsg().
3305 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3306 values = list(range(257)) + list(range(toobig - 257, toobig))
3307
3308 # struct cmsghdr has at least three members, two of which are ints
3309 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3310 for n in values:
3311 ret = socket.CMSG_LEN(n)
3312 # This is how recvmsg() calculates the data size
3313 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3314 self.assertLessEqual(ret, self.socklen_t_limit)
3315
3316 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3317 # sendmsg() shares code with these functions, and requires
3318 # that it reject values over the limit.
3319 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3320 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3321
3322 @requireAttrs(socket, "CMSG_SPACE")
3323 def testCMSG_SPACE(self):
3324 # Test CMSG_SPACE() with various valid and invalid values,
3325 # checking the assumptions used by sendmsg().
3326 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3327 values = list(range(257)) + list(range(toobig - 257, toobig))
3328
3329 last = socket.CMSG_SPACE(0)
3330 # struct cmsghdr has at least three members, two of which are ints
3331 self.assertGreater(last, array.array("i").itemsize * 2)
3332 for n in values:
3333 ret = socket.CMSG_SPACE(n)
3334 self.assertGreaterEqual(ret, last)
3335 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3336 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3337 self.assertLessEqual(ret, self.socklen_t_limit)
3338 last = ret
3339
3340 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3341 # sendmsg() shares code with these functions, and requires
3342 # that it reject values over the limit.
3343 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3344 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3345
3346
3347class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3348 # Tests for file descriptor passing on Unix-domain sockets.
3349
3350 # Invalid file descriptor value that's unlikely to evaluate to a
3351 # real FD even if one of its bytes is replaced with a different
3352 # value (which shouldn't actually happen).
3353 badfd = -0x5555
3354
3355 def newFDs(self, n):
3356 # Return a list of n file descriptors for newly-created files
3357 # containing their list indices as ASCII numbers.
3358 fds = []
3359 for i in range(n):
3360 fd, path = tempfile.mkstemp()
3361 self.addCleanup(os.unlink, path)
3362 self.addCleanup(os.close, fd)
3363 os.write(fd, str(i).encode())
3364 fds.append(fd)
3365 return fds
3366
3367 def checkFDs(self, fds):
3368 # Check that the file descriptors in the given list contain
3369 # their correct list indices as ASCII numbers.
3370 for n, fd in enumerate(fds):
3371 os.lseek(fd, 0, os.SEEK_SET)
3372 self.assertEqual(os.read(fd, 1024), str(n).encode())
3373
3374 def registerRecvmsgResult(self, result):
3375 self.addCleanup(self.closeRecvmsgFDs, result)
3376
3377 def closeRecvmsgFDs(self, recvmsg_result):
3378 # Close all file descriptors specified in the ancillary data
3379 # of the given return value from recvmsg() or recvmsg_into().
3380 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3381 if (cmsg_level == socket.SOL_SOCKET and
3382 cmsg_type == socket.SCM_RIGHTS):
3383 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003384 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003385 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3386 for fd in fds:
3387 os.close(fd)
3388
3389 def createAndSendFDs(self, n):
3390 # Send n new file descriptors created by newFDs() to the
3391 # server, with the constant MSG as the non-ancillary data.
3392 self.assertEqual(
3393 self.sendmsgToServer([MSG],
3394 [(socket.SOL_SOCKET,
3395 socket.SCM_RIGHTS,
3396 array.array("i", self.newFDs(n)))]),
3397 len(MSG))
3398
3399 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3400 # Check that constant MSG was received with numfds file
3401 # descriptors in a maximum of maxcmsgs control messages (which
3402 # must contain only complete integers). By default, check
3403 # that MSG_CTRUNC is unset, but ignore any flags in
3404 # ignoreflags.
3405 msg, ancdata, flags, addr = result
3406 self.assertEqual(msg, MSG)
3407 self.checkRecvmsgAddress(addr, self.cli_addr)
3408 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3409 ignore=ignoreflags)
3410
3411 self.assertIsInstance(ancdata, list)
3412 self.assertLessEqual(len(ancdata), maxcmsgs)
3413 fds = array.array("i")
3414 for item in ancdata:
3415 self.assertIsInstance(item, tuple)
3416 cmsg_level, cmsg_type, cmsg_data = item
3417 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3418 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3419 self.assertIsInstance(cmsg_data, bytes)
3420 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003421 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003422
3423 self.assertEqual(len(fds), numfds)
3424 self.checkFDs(fds)
3425
3426 def testFDPassSimple(self):
3427 # Pass a single FD (array read from bytes object).
3428 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3429 len(MSG), 10240))
3430
3431 def _testFDPassSimple(self):
3432 self.assertEqual(
3433 self.sendmsgToServer(
3434 [MSG],
3435 [(socket.SOL_SOCKET,
3436 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003437 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003438 len(MSG))
3439
3440 def testMultipleFDPass(self):
3441 # Pass multiple FDs in a single array.
3442 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3443 len(MSG), 10240))
3444
3445 def _testMultipleFDPass(self):
3446 self.createAndSendFDs(4)
3447
3448 @requireAttrs(socket, "CMSG_SPACE")
3449 def testFDPassCMSG_SPACE(self):
3450 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3451 self.checkRecvmsgFDs(
3452 4, self.doRecvmsg(self.serv_sock, len(MSG),
3453 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3454
3455 @testFDPassCMSG_SPACE.client_skip
3456 def _testFDPassCMSG_SPACE(self):
3457 self.createAndSendFDs(4)
3458
3459 def testFDPassCMSG_LEN(self):
3460 # Test using CMSG_LEN() to calculate ancillary buffer size.
3461 self.checkRecvmsgFDs(1,
3462 self.doRecvmsg(self.serv_sock, len(MSG),
3463 socket.CMSG_LEN(4 * SIZEOF_INT)),
3464 # RFC 3542 says implementations may set
3465 # MSG_CTRUNC if there isn't enough space
3466 # for trailing padding.
3467 ignoreflags=socket.MSG_CTRUNC)
3468
3469 def _testFDPassCMSG_LEN(self):
3470 self.createAndSendFDs(1)
3471
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003472 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003473 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003474 @requireAttrs(socket, "CMSG_SPACE")
3475 def testFDPassSeparate(self):
3476 # Pass two FDs in two separate arrays. Arrays may be combined
3477 # into a single control message by the OS.
3478 self.checkRecvmsgFDs(2,
3479 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3480 maxcmsgs=2)
3481
3482 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003483 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003484 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003485 def _testFDPassSeparate(self):
3486 fd0, fd1 = self.newFDs(2)
3487 self.assertEqual(
3488 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3489 socket.SCM_RIGHTS,
3490 array.array("i", [fd0])),
3491 (socket.SOL_SOCKET,
3492 socket.SCM_RIGHTS,
3493 array.array("i", [fd1]))]),
3494 len(MSG))
3495
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003496 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003497 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003498 @requireAttrs(socket, "CMSG_SPACE")
3499 def testFDPassSeparateMinSpace(self):
3500 # Pass two FDs in two separate arrays, receiving them into the
3501 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003502 num_fds = 2
3503 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003504 self.doRecvmsg(self.serv_sock, len(MSG),
3505 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003506 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003507 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3508
3509 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003510 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003511 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003512 def _testFDPassSeparateMinSpace(self):
3513 fd0, fd1 = self.newFDs(2)
3514 self.assertEqual(
3515 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3516 socket.SCM_RIGHTS,
3517 array.array("i", [fd0])),
3518 (socket.SOL_SOCKET,
3519 socket.SCM_RIGHTS,
3520 array.array("i", [fd1]))]),
3521 len(MSG))
3522
3523 def sendAncillaryIfPossible(self, msg, ancdata):
3524 # Try to send msg and ancdata to server, but if the system
3525 # call fails, just send msg with no ancillary data.
3526 try:
3527 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003528 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003529 # Check that it was the system call that failed
3530 self.assertIsInstance(e.errno, int)
3531 nbytes = self.sendmsgToServer([msg])
3532 self.assertEqual(nbytes, len(msg))
3533
Brett Cannon3bbad122015-12-28 17:21:44 -08003534 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003535 def testFDPassEmpty(self):
3536 # Try to pass an empty FD array. Can receive either no array
3537 # or an empty array.
3538 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3539 len(MSG), 10240),
3540 ignoreflags=socket.MSG_CTRUNC)
3541
3542 def _testFDPassEmpty(self):
3543 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3544 socket.SCM_RIGHTS,
3545 b"")])
3546
3547 def testFDPassPartialInt(self):
3548 # Try to pass a truncated FD array.
3549 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3550 len(MSG), 10240)
3551 self.assertEqual(msg, MSG)
3552 self.checkRecvmsgAddress(addr, self.cli_addr)
3553 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3554 self.assertLessEqual(len(ancdata), 1)
3555 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3556 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3557 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3558 self.assertLess(len(cmsg_data), SIZEOF_INT)
3559
3560 def _testFDPassPartialInt(self):
3561 self.sendAncillaryIfPossible(
3562 MSG,
3563 [(socket.SOL_SOCKET,
3564 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003565 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003566
3567 @requireAttrs(socket, "CMSG_SPACE")
3568 def testFDPassPartialIntInMiddle(self):
3569 # Try to pass two FD arrays, the first of which is truncated.
3570 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3571 len(MSG), 10240)
3572 self.assertEqual(msg, MSG)
3573 self.checkRecvmsgAddress(addr, self.cli_addr)
3574 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3575 self.assertLessEqual(len(ancdata), 2)
3576 fds = array.array("i")
3577 # Arrays may have been combined in a single control message
3578 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3579 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3580 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003581 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003582 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3583 self.assertLessEqual(len(fds), 2)
3584 self.checkFDs(fds)
3585
3586 @testFDPassPartialIntInMiddle.client_skip
3587 def _testFDPassPartialIntInMiddle(self):
3588 fd0, fd1 = self.newFDs(2)
3589 self.sendAncillaryIfPossible(
3590 MSG,
3591 [(socket.SOL_SOCKET,
3592 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003593 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003594 (socket.SOL_SOCKET,
3595 socket.SCM_RIGHTS,
3596 array.array("i", [fd1]))])
3597
3598 def checkTruncatedHeader(self, result, ignoreflags=0):
3599 # Check that no ancillary data items are returned when data is
3600 # truncated inside the cmsghdr structure.
3601 msg, ancdata, flags, addr = result
3602 self.assertEqual(msg, MSG)
3603 self.checkRecvmsgAddress(addr, self.cli_addr)
3604 self.assertEqual(ancdata, [])
3605 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3606 ignore=ignoreflags)
3607
3608 def testCmsgTruncNoBufSize(self):
3609 # Check that no ancillary data is received when no buffer size
3610 # is specified.
3611 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3612 # BSD seems to set MSG_CTRUNC only
3613 # if an item has been partially
3614 # received.
3615 ignoreflags=socket.MSG_CTRUNC)
3616
3617 def _testCmsgTruncNoBufSize(self):
3618 self.createAndSendFDs(1)
3619
3620 def testCmsgTrunc0(self):
3621 # Check that no ancillary data is received when buffer size is 0.
3622 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3623 ignoreflags=socket.MSG_CTRUNC)
3624
3625 def _testCmsgTrunc0(self):
3626 self.createAndSendFDs(1)
3627
3628 # Check that no ancillary data is returned for various non-zero
3629 # (but still too small) buffer sizes.
3630
3631 def testCmsgTrunc1(self):
3632 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3633
3634 def _testCmsgTrunc1(self):
3635 self.createAndSendFDs(1)
3636
3637 def testCmsgTrunc2Int(self):
3638 # The cmsghdr structure has at least three members, two of
3639 # which are ints, so we still shouldn't see any ancillary
3640 # data.
3641 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3642 SIZEOF_INT * 2))
3643
3644 def _testCmsgTrunc2Int(self):
3645 self.createAndSendFDs(1)
3646
3647 def testCmsgTruncLen0Minus1(self):
3648 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3649 socket.CMSG_LEN(0) - 1))
3650
3651 def _testCmsgTruncLen0Minus1(self):
3652 self.createAndSendFDs(1)
3653
3654 # The following tests try to truncate the control message in the
3655 # middle of the FD array.
3656
3657 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3658 # Check that file descriptor data is truncated to between
3659 # mindata and maxdata bytes when received with buffer size
3660 # ancbuf, and that any complete file descriptor numbers are
3661 # valid.
3662 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3663 len(MSG), ancbuf)
3664 self.assertEqual(msg, MSG)
3665 self.checkRecvmsgAddress(addr, self.cli_addr)
3666 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3667
3668 if mindata == 0 and ancdata == []:
3669 return
3670 self.assertEqual(len(ancdata), 1)
3671 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3672 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3673 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3674 self.assertGreaterEqual(len(cmsg_data), mindata)
3675 self.assertLessEqual(len(cmsg_data), maxdata)
3676 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003677 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003678 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3679 self.checkFDs(fds)
3680
3681 def testCmsgTruncLen0(self):
3682 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3683
3684 def _testCmsgTruncLen0(self):
3685 self.createAndSendFDs(1)
3686
3687 def testCmsgTruncLen0Plus1(self):
3688 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3689
3690 def _testCmsgTruncLen0Plus1(self):
3691 self.createAndSendFDs(2)
3692
3693 def testCmsgTruncLen1(self):
3694 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3695 maxdata=SIZEOF_INT)
3696
3697 def _testCmsgTruncLen1(self):
3698 self.createAndSendFDs(2)
3699
3700 def testCmsgTruncLen2Minus1(self):
3701 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3702 maxdata=(2 * SIZEOF_INT) - 1)
3703
3704 def _testCmsgTruncLen2Minus1(self):
3705 self.createAndSendFDs(2)
3706
3707
3708class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3709 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3710 # features of the RFC 3542 Advanced Sockets API for IPv6.
3711 # Currently we can only handle certain data items (e.g. traffic
3712 # class, hop limit, MTU discovery and fragmentation settings)
3713 # without resorting to unportable means such as the struct module,
3714 # but the tests here are aimed at testing the ancillary data
3715 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3716 # itself.
3717
3718 # Test value to use when setting hop limit of packet
3719 hop_limit = 2
3720
3721 # Test value to use when setting traffic class of packet.
3722 # -1 means "use kernel default".
3723 traffic_class = -1
3724
3725 def ancillaryMapping(self, ancdata):
3726 # Given ancillary data list ancdata, return a mapping from
3727 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3728 # Check that no (level, type) pair appears more than once.
3729 d = {}
3730 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3731 self.assertNotIn((cmsg_level, cmsg_type), d)
3732 d[(cmsg_level, cmsg_type)] = cmsg_data
3733 return d
3734
3735 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3736 # Receive hop limit into ancbufsize bytes of ancillary data
3737 # space. Check that data is MSG, ancillary data is not
3738 # truncated (but ignore any flags in ignoreflags), and hop
3739 # limit is between 0 and maxhop inclusive.
3740 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3741 socket.IPV6_RECVHOPLIMIT, 1)
3742 self.misc_event.set()
3743 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3744 len(MSG), ancbufsize)
3745
3746 self.assertEqual(msg, MSG)
3747 self.checkRecvmsgAddress(addr, self.cli_addr)
3748 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3749 ignore=ignoreflags)
3750
3751 self.assertEqual(len(ancdata), 1)
3752 self.assertIsInstance(ancdata[0], tuple)
3753 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3754 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3755 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3756 self.assertIsInstance(cmsg_data, bytes)
3757 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3758 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003759 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003760 self.assertGreaterEqual(a[0], 0)
3761 self.assertLessEqual(a[0], maxhop)
3762
3763 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3764 def testRecvHopLimit(self):
3765 # Test receiving the packet hop limit as ancillary data.
3766 self.checkHopLimit(ancbufsize=10240)
3767
3768 @testRecvHopLimit.client_skip
3769 def _testRecvHopLimit(self):
3770 # Need to wait until server has asked to receive ancillary
3771 # data, as implementations are not required to buffer it
3772 # otherwise.
3773 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3774 self.sendToServer(MSG)
3775
3776 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3777 def testRecvHopLimitCMSG_SPACE(self):
3778 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3779 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3780
3781 @testRecvHopLimitCMSG_SPACE.client_skip
3782 def _testRecvHopLimitCMSG_SPACE(self):
3783 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3784 self.sendToServer(MSG)
3785
3786 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3787 # 3542 says portable applications must provide space for trailing
3788 # padding. Implementations may set MSG_CTRUNC if there isn't
3789 # enough space for the padding.
3790
3791 @requireAttrs(socket.socket, "sendmsg")
3792 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3793 def testSetHopLimit(self):
3794 # Test setting hop limit on outgoing packet and receiving it
3795 # at the other end.
3796 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3797
3798 @testSetHopLimit.client_skip
3799 def _testSetHopLimit(self):
3800 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3801 self.assertEqual(
3802 self.sendmsgToServer([MSG],
3803 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3804 array.array("i", [self.hop_limit]))]),
3805 len(MSG))
3806
3807 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3808 ignoreflags=0):
3809 # Receive traffic class and hop limit into ancbufsize bytes of
3810 # ancillary data space. Check that data is MSG, ancillary
3811 # data is not truncated (but ignore any flags in ignoreflags),
3812 # and traffic class and hop limit are in range (hop limit no
3813 # more than maxhop).
3814 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3815 socket.IPV6_RECVHOPLIMIT, 1)
3816 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3817 socket.IPV6_RECVTCLASS, 1)
3818 self.misc_event.set()
3819 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3820 len(MSG), ancbufsize)
3821
3822 self.assertEqual(msg, MSG)
3823 self.checkRecvmsgAddress(addr, self.cli_addr)
3824 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3825 ignore=ignoreflags)
3826 self.assertEqual(len(ancdata), 2)
3827 ancmap = self.ancillaryMapping(ancdata)
3828
3829 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3830 self.assertEqual(len(tcdata), SIZEOF_INT)
3831 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003832 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833 self.assertGreaterEqual(a[0], 0)
3834 self.assertLessEqual(a[0], 255)
3835
3836 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3837 self.assertEqual(len(hldata), SIZEOF_INT)
3838 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003839 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003840 self.assertGreaterEqual(a[0], 0)
3841 self.assertLessEqual(a[0], maxhop)
3842
3843 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3844 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3845 def testRecvTrafficClassAndHopLimit(self):
3846 # Test receiving traffic class and hop limit as ancillary data.
3847 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3848
3849 @testRecvTrafficClassAndHopLimit.client_skip
3850 def _testRecvTrafficClassAndHopLimit(self):
3851 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3852 self.sendToServer(MSG)
3853
3854 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3855 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3856 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3857 # Test receiving traffic class and hop limit, using
3858 # CMSG_SPACE() to calculate buffer size.
3859 self.checkTrafficClassAndHopLimit(
3860 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3861
3862 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3863 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3864 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3865 self.sendToServer(MSG)
3866
3867 @requireAttrs(socket.socket, "sendmsg")
3868 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3869 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3870 def testSetTrafficClassAndHopLimit(self):
3871 # Test setting traffic class and hop limit on outgoing packet,
3872 # and receiving them at the other end.
3873 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3874 maxhop=self.hop_limit)
3875
3876 @testSetTrafficClassAndHopLimit.client_skip
3877 def _testSetTrafficClassAndHopLimit(self):
3878 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3879 self.assertEqual(
3880 self.sendmsgToServer([MSG],
3881 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3882 array.array("i", [self.traffic_class])),
3883 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3884 array.array("i", [self.hop_limit]))]),
3885 len(MSG))
3886
3887 @requireAttrs(socket.socket, "sendmsg")
3888 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3889 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3890 def testOddCmsgSize(self):
3891 # Try to send ancillary data with first item one byte too
3892 # long. Fall back to sending with correct size if this fails,
3893 # and check that second item was handled correctly.
3894 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3895 maxhop=self.hop_limit)
3896
3897 @testOddCmsgSize.client_skip
3898 def _testOddCmsgSize(self):
3899 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3900 try:
3901 nbytes = self.sendmsgToServer(
3902 [MSG],
3903 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003904 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003905 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3906 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003907 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003908 self.assertIsInstance(e.errno, int)
3909 nbytes = self.sendmsgToServer(
3910 [MSG],
3911 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3912 array.array("i", [self.traffic_class])),
3913 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3914 array.array("i", [self.hop_limit]))])
3915 self.assertEqual(nbytes, len(MSG))
3916
3917 # Tests for proper handling of truncated ancillary data
3918
3919 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3920 # Receive hop limit into ancbufsize bytes of ancillary data
3921 # space, which should be too small to contain the ancillary
3922 # data header (if ancbufsize is None, pass no second argument
3923 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3924 # (unless included in ignoreflags), and no ancillary data is
3925 # returned.
3926 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3927 socket.IPV6_RECVHOPLIMIT, 1)
3928 self.misc_event.set()
3929 args = () if ancbufsize is None else (ancbufsize,)
3930 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3931 len(MSG), *args)
3932
3933 self.assertEqual(msg, MSG)
3934 self.checkRecvmsgAddress(addr, self.cli_addr)
3935 self.assertEqual(ancdata, [])
3936 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3937 ignore=ignoreflags)
3938
3939 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3940 def testCmsgTruncNoBufSize(self):
3941 # Check that no ancillary data is received when no ancillary
3942 # buffer size is provided.
3943 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3944 # BSD seems to set
3945 # MSG_CTRUNC only if an item
3946 # has been partially
3947 # received.
3948 ignoreflags=socket.MSG_CTRUNC)
3949
3950 @testCmsgTruncNoBufSize.client_skip
3951 def _testCmsgTruncNoBufSize(self):
3952 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3953 self.sendToServer(MSG)
3954
3955 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3956 def testSingleCmsgTrunc0(self):
3957 # Check that no ancillary data is received when ancillary
3958 # buffer size is zero.
3959 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3960 ignoreflags=socket.MSG_CTRUNC)
3961
3962 @testSingleCmsgTrunc0.client_skip
3963 def _testSingleCmsgTrunc0(self):
3964 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3965 self.sendToServer(MSG)
3966
3967 # Check that no ancillary data is returned for various non-zero
3968 # (but still too small) buffer sizes.
3969
3970 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3971 def testSingleCmsgTrunc1(self):
3972 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3973
3974 @testSingleCmsgTrunc1.client_skip
3975 def _testSingleCmsgTrunc1(self):
3976 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3977 self.sendToServer(MSG)
3978
3979 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3980 def testSingleCmsgTrunc2Int(self):
3981 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3982
3983 @testSingleCmsgTrunc2Int.client_skip
3984 def _testSingleCmsgTrunc2Int(self):
3985 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3986 self.sendToServer(MSG)
3987
3988 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3989 def testSingleCmsgTruncLen0Minus1(self):
3990 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3991
3992 @testSingleCmsgTruncLen0Minus1.client_skip
3993 def _testSingleCmsgTruncLen0Minus1(self):
3994 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3995 self.sendToServer(MSG)
3996
3997 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3998 def testSingleCmsgTruncInData(self):
3999 # Test truncation of a control message inside its associated
4000 # data. The message may be returned with its data truncated,
4001 # or not returned at all.
4002 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4003 socket.IPV6_RECVHOPLIMIT, 1)
4004 self.misc_event.set()
4005 msg, ancdata, flags, addr = self.doRecvmsg(
4006 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4007
4008 self.assertEqual(msg, MSG)
4009 self.checkRecvmsgAddress(addr, self.cli_addr)
4010 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4011
4012 self.assertLessEqual(len(ancdata), 1)
4013 if ancdata:
4014 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4015 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4016 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4017 self.assertLess(len(cmsg_data), SIZEOF_INT)
4018
4019 @testSingleCmsgTruncInData.client_skip
4020 def _testSingleCmsgTruncInData(self):
4021 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4022 self.sendToServer(MSG)
4023
4024 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4025 # Receive traffic class and hop limit into ancbufsize bytes of
4026 # ancillary data space, which should be large enough to
4027 # contain the first item, but too small to contain the header
4028 # of the second. Check that data is MSG, MSG_CTRUNC is set
4029 # (unless included in ignoreflags), and only one ancillary
4030 # data item is returned.
4031 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4032 socket.IPV6_RECVHOPLIMIT, 1)
4033 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4034 socket.IPV6_RECVTCLASS, 1)
4035 self.misc_event.set()
4036 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4037 len(MSG), ancbufsize)
4038
4039 self.assertEqual(msg, MSG)
4040 self.checkRecvmsgAddress(addr, self.cli_addr)
4041 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4042 ignore=ignoreflags)
4043
4044 self.assertEqual(len(ancdata), 1)
4045 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4046 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4047 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4048 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4049 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004050 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004051 self.assertGreaterEqual(a[0], 0)
4052 self.assertLessEqual(a[0], 255)
4053
4054 # Try the above test with various buffer sizes.
4055
4056 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4057 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4058 def testSecondCmsgTrunc0(self):
4059 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4060 ignoreflags=socket.MSG_CTRUNC)
4061
4062 @testSecondCmsgTrunc0.client_skip
4063 def _testSecondCmsgTrunc0(self):
4064 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4065 self.sendToServer(MSG)
4066
4067 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4068 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4069 def testSecondCmsgTrunc1(self):
4070 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4071
4072 @testSecondCmsgTrunc1.client_skip
4073 def _testSecondCmsgTrunc1(self):
4074 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4075 self.sendToServer(MSG)
4076
4077 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4078 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4079 def testSecondCmsgTrunc2Int(self):
4080 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4081 2 * SIZEOF_INT)
4082
4083 @testSecondCmsgTrunc2Int.client_skip
4084 def _testSecondCmsgTrunc2Int(self):
4085 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4086 self.sendToServer(MSG)
4087
4088 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4089 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4090 def testSecondCmsgTruncLen0Minus1(self):
4091 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4092 socket.CMSG_LEN(0) - 1)
4093
4094 @testSecondCmsgTruncLen0Minus1.client_skip
4095 def _testSecondCmsgTruncLen0Minus1(self):
4096 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4097 self.sendToServer(MSG)
4098
4099 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4100 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4101 def testSecomdCmsgTruncInData(self):
4102 # Test truncation of the second of two control messages inside
4103 # its associated data.
4104 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4105 socket.IPV6_RECVHOPLIMIT, 1)
4106 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4107 socket.IPV6_RECVTCLASS, 1)
4108 self.misc_event.set()
4109 msg, ancdata, flags, addr = self.doRecvmsg(
4110 self.serv_sock, len(MSG),
4111 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4112
4113 self.assertEqual(msg, MSG)
4114 self.checkRecvmsgAddress(addr, self.cli_addr)
4115 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4116
4117 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4118
4119 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4120 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4121 cmsg_types.remove(cmsg_type)
4122 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4123 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004124 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004125 self.assertGreaterEqual(a[0], 0)
4126 self.assertLessEqual(a[0], 255)
4127
4128 if ancdata:
4129 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4130 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4131 cmsg_types.remove(cmsg_type)
4132 self.assertLess(len(cmsg_data), SIZEOF_INT)
4133
4134 self.assertEqual(ancdata, [])
4135
4136 @testSecomdCmsgTruncInData.client_skip
4137 def _testSecomdCmsgTruncInData(self):
4138 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4139 self.sendToServer(MSG)
4140
4141
4142# Derive concrete test classes for different socket types.
4143
4144class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4145 SendrecvmsgConnectionlessBase,
4146 ThreadedSocketTestMixin, UDPTestBase):
4147 pass
4148
4149@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004150class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4151 pass
4152
4153@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004154class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4155 pass
4156
4157@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004158class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4159 pass
4160
4161
4162class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4163 SendrecvmsgConnectionlessBase,
4164 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004165
4166 def checkRecvmsgAddress(self, addr1, addr2):
4167 # Called to compare the received address with the address of
4168 # the peer, ignoring scope ID
4169 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004170
4171@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004172@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004173@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004174class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4175 pass
4176
4177@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004178@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004179@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004180class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4181 pass
4182
4183@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004184@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004185@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004186class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4187 pass
4188
4189@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004190@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004191@requireAttrs(socket, "IPPROTO_IPV6")
4192@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004193class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4194 SendrecvmsgUDP6TestBase):
4195 pass
4196
4197@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004198@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004199@requireAttrs(socket, "IPPROTO_IPV6")
4200@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004201class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4202 RFC3542AncillaryTest,
4203 SendrecvmsgUDP6TestBase):
4204 pass
4205
4206
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004207@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4208 'UDPLITE sockets required for this test.')
4209class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4210 SendrecvmsgConnectionlessBase,
4211 ThreadedSocketTestMixin, UDPLITETestBase):
4212 pass
4213
4214@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4215 'UDPLITE sockets required for this test.')
4216@requireAttrs(socket.socket, "sendmsg")
4217class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4218 pass
4219
4220@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4221 'UDPLITE sockets required for this test.')
4222@requireAttrs(socket.socket, "recvmsg")
4223class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4224 pass
4225
4226@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4227 'UDPLITE sockets required for this test.')
4228@requireAttrs(socket.socket, "recvmsg_into")
4229class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4230 pass
4231
4232
4233@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4234 'UDPLITE sockets required for this test.')
4235class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4236 SendrecvmsgConnectionlessBase,
4237 ThreadedSocketTestMixin, UDPLITE6TestBase):
4238
4239 def checkRecvmsgAddress(self, addr1, addr2):
4240 # Called to compare the received address with the address of
4241 # the peer, ignoring scope ID
4242 self.assertEqual(addr1[:-1], addr2[:-1])
4243
4244@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004245@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004246@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4247 'UDPLITE sockets required for this test.')
4248@requireSocket("AF_INET6", "SOCK_DGRAM")
4249class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4250 pass
4251
4252@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004253@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004254@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4255 'UDPLITE sockets required for this test.')
4256@requireSocket("AF_INET6", "SOCK_DGRAM")
4257class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4258 pass
4259
4260@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004261@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004262@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4263 'UDPLITE sockets required for this test.')
4264@requireSocket("AF_INET6", "SOCK_DGRAM")
4265class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4266 pass
4267
4268@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004269@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004270@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4271 'UDPLITE sockets required for this test.')
4272@requireAttrs(socket, "IPPROTO_IPV6")
4273@requireSocket("AF_INET6", "SOCK_DGRAM")
4274class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4275 SendrecvmsgUDPLITE6TestBase):
4276 pass
4277
4278@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004279@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004280@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4281 'UDPLITE sockets required for this test.')
4282@requireAttrs(socket, "IPPROTO_IPV6")
4283@requireSocket("AF_INET6", "SOCK_DGRAM")
4284class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4285 RFC3542AncillaryTest,
4286 SendrecvmsgUDPLITE6TestBase):
4287 pass
4288
4289
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004290class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4291 ConnectedStreamTestMixin, TCPTestBase):
4292 pass
4293
4294@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004295class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4296 pass
4297
4298@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004299class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4300 SendrecvmsgTCPTestBase):
4301 pass
4302
4303@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004304class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4305 SendrecvmsgTCPTestBase):
4306 pass
4307
4308
4309class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4310 SendrecvmsgConnectedBase,
4311 ConnectedStreamTestMixin, SCTPStreamBase):
4312 pass
4313
4314@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004315@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004316@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004317class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4318 pass
4319
4320@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004321@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004322@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004323class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4324 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004325
4326 def testRecvmsgEOF(self):
4327 try:
4328 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4329 except OSError as e:
4330 if e.errno != errno.ENOTCONN:
4331 raise
4332 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004333
4334@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004335@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004336@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004337class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4338 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004339
4340 def testRecvmsgEOF(self):
4341 try:
4342 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4343 except OSError as e:
4344 if e.errno != errno.ENOTCONN:
4345 raise
4346 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004347
4348
4349class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4350 ConnectedStreamTestMixin, UnixStreamBase):
4351 pass
4352
4353@requireAttrs(socket.socket, "sendmsg")
4354@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004355class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4356 pass
4357
4358@requireAttrs(socket.socket, "recvmsg")
4359@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004360class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4361 SendrecvmsgUnixStreamTestBase):
4362 pass
4363
4364@requireAttrs(socket.socket, "recvmsg_into")
4365@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004366class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4367 SendrecvmsgUnixStreamTestBase):
4368 pass
4369
4370@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4371@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004372class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4373 pass
4374
4375@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4376@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004377class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4378 SendrecvmsgUnixStreamTestBase):
4379 pass
4380
4381
4382# Test interrupting the interruptible send/receive methods with a
4383# signal when a timeout is set. These tests avoid having multiple
4384# threads alive during the test so that the OS cannot deliver the
4385# signal to the wrong one.
4386
4387class InterruptedTimeoutBase(unittest.TestCase):
4388 # Base class for interrupted send/receive tests. Installs an
4389 # empty handler for SIGALRM and removes it on teardown, along with
4390 # any scheduled alarms.
4391
4392 def setUp(self):
4393 super().setUp()
4394 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004395 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004396 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004397
4398 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004399 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004400
4401 # Provide setAlarm() method to schedule delivery of SIGALRM after
4402 # given number of seconds, or cancel it if zero, and an
4403 # appropriate time value to use. Use setitimer() if available.
4404 if hasattr(signal, "setitimer"):
4405 alarm_time = 0.05
4406
4407 def setAlarm(self, seconds):
4408 signal.setitimer(signal.ITIMER_REAL, seconds)
4409 else:
4410 # Old systems may deliver the alarm up to one second early
4411 alarm_time = 2
4412
4413 def setAlarm(self, seconds):
4414 signal.alarm(seconds)
4415
4416
4417# Require siginterrupt() in order to ensure that system calls are
4418# interrupted by default.
4419@requireAttrs(signal, "siginterrupt")
4420@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4421 "Don't have signal.alarm or signal.setitimer")
4422class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4423 # Test interrupting the recv*() methods with signals when a
4424 # timeout is set.
4425
4426 def setUp(self):
4427 super().setUp()
4428 self.serv.settimeout(self.timeout)
4429
4430 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004431 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004432 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004433 try:
4434 self.setAlarm(self.alarm_time)
4435 with self.assertRaises(ZeroDivisionError) as cm:
4436 func(*args, **kwargs)
4437 finally:
4438 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004439
4440 def testInterruptedRecvTimeout(self):
4441 self.checkInterruptedRecv(self.serv.recv, 1024)
4442
4443 def testInterruptedRecvIntoTimeout(self):
4444 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4445
4446 def testInterruptedRecvfromTimeout(self):
4447 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4448
4449 def testInterruptedRecvfromIntoTimeout(self):
4450 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4451
4452 @requireAttrs(socket.socket, "recvmsg")
4453 def testInterruptedRecvmsgTimeout(self):
4454 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4455
4456 @requireAttrs(socket.socket, "recvmsg_into")
4457 def testInterruptedRecvmsgIntoTimeout(self):
4458 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4459
4460
4461# Require siginterrupt() in order to ensure that system calls are
4462# interrupted by default.
4463@requireAttrs(signal, "siginterrupt")
4464@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4465 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004466class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4467 ThreadSafeCleanupTestCase,
4468 SocketListeningTestMixin, TCPTestBase):
4469 # Test interrupting the interruptible send*() methods with signals
4470 # when a timeout is set.
4471
4472 def setUp(self):
4473 super().setUp()
4474 self.serv_conn = self.newSocket()
4475 self.addCleanup(self.serv_conn.close)
4476 # Use a thread to complete the connection, but wait for it to
4477 # terminate before running the test, so that there is only one
4478 # thread to accept the signal.
4479 cli_thread = threading.Thread(target=self.doConnect)
4480 cli_thread.start()
4481 self.cli_conn, addr = self.serv.accept()
4482 self.addCleanup(self.cli_conn.close)
4483 cli_thread.join()
4484 self.serv_conn.settimeout(self.timeout)
4485
4486 def doConnect(self):
4487 self.serv_conn.connect(self.serv_addr)
4488
4489 def checkInterruptedSend(self, func, *args, **kwargs):
4490 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004491 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004492 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004493 try:
4494 with self.assertRaises(ZeroDivisionError) as cm:
4495 while True:
4496 self.setAlarm(self.alarm_time)
4497 func(*args, **kwargs)
4498 finally:
4499 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004500
Ned Deilyc5640382014-02-03 13:58:31 -08004501 # Issue #12958: The following tests have problems on OS X prior to 10.7
4502 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004503 def testInterruptedSendTimeout(self):
4504 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4505
Ned Deilyc5640382014-02-03 13:58:31 -08004506 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004507 def testInterruptedSendtoTimeout(self):
4508 # Passing an actual address here as Python's wrapper for
4509 # sendto() doesn't allow passing a zero-length one; POSIX
4510 # requires that the address is ignored since the socket is
4511 # connection-mode, however.
4512 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4513 self.serv_addr)
4514
Ned Deilyc5640382014-02-03 13:58:31 -08004515 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004516 @requireAttrs(socket.socket, "sendmsg")
4517 def testInterruptedSendmsgTimeout(self):
4518 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4519
4520
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004521class TCPCloserTest(ThreadedTCPSocketTest):
4522
4523 def testClose(self):
4524 conn, addr = self.serv.accept()
4525 conn.close()
4526
4527 sd = self.cli
4528 read, write, err = select.select([sd], [], [], 1.0)
4529 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004530 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004531
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004532 # Calling close() many times should be safe.
4533 conn.close()
4534 conn.close()
4535
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004536 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004537 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004538 time.sleep(1.0)
4539
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004540
Dave Cole331708b2004-08-09 04:51:41 +00004541class BasicSocketPairTest(SocketPairTest):
4542
4543 def __init__(self, methodName='runTest'):
4544 SocketPairTest.__init__(self, methodName=methodName)
4545
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004546 def _check_defaults(self, sock):
4547 self.assertIsInstance(sock, socket.socket)
4548 if hasattr(socket, 'AF_UNIX'):
4549 self.assertEqual(sock.family, socket.AF_UNIX)
4550 else:
4551 self.assertEqual(sock.family, socket.AF_INET)
4552 self.assertEqual(sock.type, socket.SOCK_STREAM)
4553 self.assertEqual(sock.proto, 0)
4554
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004555 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004556 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004557
4558 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004559 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004560
Dave Cole331708b2004-08-09 04:51:41 +00004561 def testRecv(self):
4562 msg = self.serv.recv(1024)
4563 self.assertEqual(msg, MSG)
4564
4565 def _testRecv(self):
4566 self.cli.send(MSG)
4567
4568 def testSend(self):
4569 self.serv.send(MSG)
4570
4571 def _testSend(self):
4572 msg = self.cli.recv(1024)
4573 self.assertEqual(msg, MSG)
4574
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004575
Guido van Rossum24e4af82002-06-12 19:18:08 +00004576class NonBlockingTCPTests(ThreadedTCPSocketTest):
4577
4578 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004579 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004580 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4581
Victor Stinner304315d2018-11-30 13:22:44 +01004582 def assert_sock_timeout(self, sock, timeout):
4583 self.assertEqual(self.serv.gettimeout(), timeout)
4584
4585 blocking = (timeout != 0.0)
4586 self.assertEqual(sock.getblocking(), blocking)
4587
4588 if fcntl is not None:
4589 # When a Python socket has a non-zero timeout, it's switched
4590 # internally to a non-blocking mode. Later, sock.sendall(),
4591 # sock.recv(), and other socket operations use a select() call and
4592 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4593 # timeouts are enforced.
4594 fd_blocking = (timeout is None)
4595
4596 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4597 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4598
Guido van Rossum24e4af82002-06-12 19:18:08 +00004599 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004600 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004601 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004602 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004603
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004604 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004605 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004606
4607 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004608 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004609
4610 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004611 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004612
4613 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004614 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004615
4616 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004617 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004618
4619 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004620 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004621
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004622 @support.cpython_only
4623 def testSetBlocking_overflow(self):
4624 # Issue 15989
4625 import _testcapi
4626 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4627 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004628
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004629 self.serv.setblocking(False)
4630 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004631
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004632 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4633 self.assertIsNone(self.serv.gettimeout())
4634
4635 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4636
Serhiy Storchaka43767632013-11-03 21:31:38 +02004637 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4638 'test needs socket.SOCK_NONBLOCK')
4639 @support.requires_linux_version(2, 6, 28)
4640 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004641 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004642 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004643 self.serv = socket.socket(socket.AF_INET,
4644 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4645 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004646
4647 def _testInitNonBlocking(self):
4648 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004649
Victor Stinner304315d2018-11-30 13:22:44 +01004650 def testInheritFlagsBlocking(self):
4651 # bpo-7995: accept() on a listening socket with a timeout and the
4652 # default timeout is None, the resulting socket must be blocking.
4653 with socket_setdefaulttimeout(None):
4654 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004655 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004656 self.addCleanup(conn.close)
4657 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004658
Victor Stinner304315d2018-11-30 13:22:44 +01004659 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004660 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004661
4662 def testInheritFlagsTimeout(self):
4663 # bpo-7995: accept() on a listening socket with a timeout and the
4664 # default timeout is None, the resulting socket must inherit
4665 # the default timeout.
4666 default_timeout = 20.0
4667 with socket_setdefaulttimeout(default_timeout):
4668 self.serv.settimeout(10)
4669 conn, addr = self.serv.accept()
4670 self.addCleanup(conn.close)
4671 self.assertEqual(conn.gettimeout(), default_timeout)
4672
4673 def _testInheritFlagsTimeout(self):
4674 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004675
Guido van Rossum24e4af82002-06-12 19:18:08 +00004676 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004677 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004678 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004679
4680 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004681 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004682 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004683 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004684 dt = time.monotonic() - start_time
4685 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004686
4687 self.event.set()
4688
Victor Stinner24c62582019-10-30 12:41:43 +01004689 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004690 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004691 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004692
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004693 # connect() completed: non-blocking accept() doesn't block
4694 conn, addr = self.serv.accept()
4695 self.addCleanup(conn.close)
4696 self.assertIsNone(conn.gettimeout())
4697
Guido van Rossum24e4af82002-06-12 19:18:08 +00004698 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004699 # don't connect before event is set to check
4700 # that non-blocking accept() raises BlockingIOError
4701 self.event.wait()
4702
Christian Heimes5e696852008-04-09 08:37:03 +00004703 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004704
Guido van Rossum24e4af82002-06-12 19:18:08 +00004705 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004706 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004707 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004708 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004709 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004710
4711 # the server didn't send data yet: non-blocking recv() fails
4712 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004713 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004714
4715 self.event.set()
4716
Victor Stinner24c62582019-10-30 12:41:43 +01004717 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004718 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004719 self.fail("Error during select call to non-blocking socket.")
4720
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004721 # the server sent data yet: non-blocking recv() doesn't block
4722 msg = conn.recv(len(MSG))
4723 self.assertEqual(msg, MSG)
4724
Guido van Rossum24e4af82002-06-12 19:18:08 +00004725 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004726 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004727
4728 # don't send anything before event is set to check
4729 # that non-blocking recv() raises BlockingIOError
4730 self.event.wait()
4731
4732 # send data: recv() will no longer block
4733 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004734
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004735
Guido van Rossum24e4af82002-06-12 19:18:08 +00004736class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004737 """Unit tests for the object returned by socket.makefile()
4738
Antoine Pitrou834bd812010-10-13 16:17:14 +00004739 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004740 the client connection. You can read from this file to
4741 get output from the server.
4742
Antoine Pitrou834bd812010-10-13 16:17:14 +00004743 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004744 server connection. You can write to this file to send output
4745 to the client.
4746 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004747
Guido van Rossume9f66142002-08-07 15:46:19 +00004748 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004749 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004750 errors = 'strict'
4751 newline = None
4752
4753 read_mode = 'rb'
4754 read_msg = MSG
4755 write_mode = 'wb'
4756 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004757
Guido van Rossum24e4af82002-06-12 19:18:08 +00004758 def __init__(self, methodName='runTest'):
4759 SocketConnectedTest.__init__(self, methodName=methodName)
4760
4761 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004762 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4763 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004764 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004765 self.read_file = self.cli_conn.makefile(
4766 self.read_mode, self.bufsize,
4767 encoding = self.encoding,
4768 errors = self.errors,
4769 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004770
4771 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004772 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004773 self.read_file.close()
4774 self.assertTrue(self.read_file.closed)
4775 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004776 SocketConnectedTest.tearDown(self)
4777
4778 def clientSetUp(self):
4779 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004780 self.write_file = self.serv_conn.makefile(
4781 self.write_mode, self.bufsize,
4782 encoding = self.encoding,
4783 errors = self.errors,
4784 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004785
4786 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004787 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004788 self.write_file.close()
4789 self.assertTrue(self.write_file.closed)
4790 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004791 SocketConnectedTest.clientTearDown(self)
4792
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004793 def testReadAfterTimeout(self):
4794 # Issue #7322: A file object must disallow further reads
4795 # after a timeout has occurred.
4796 self.cli_conn.settimeout(1)
4797 self.read_file.read(3)
4798 # First read raises a timeout
4799 self.assertRaises(socket.timeout, self.read_file.read, 1)
4800 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004801 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004802 self.read_file.read(1)
4803 self.assertIn("cannot read from timed out object", str(ctx.exception))
4804
4805 def _testReadAfterTimeout(self):
4806 self.write_file.write(self.write_msg[0:3])
4807 self.write_file.flush()
4808 self.serv_finished.wait()
4809
Guido van Rossum24e4af82002-06-12 19:18:08 +00004810 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004811 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004812 first_seg = self.read_file.read(len(self.read_msg)-3)
4813 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004814 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004815 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004816
4817 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004818 self.write_file.write(self.write_msg)
4819 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004820
Guido van Rossum8c943832002-08-08 01:00:28 +00004821 def testFullRead(self):
4822 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004823 msg = self.read_file.read()
4824 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004825
4826 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004827 self.write_file.write(self.write_msg)
4828 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004829
Guido van Rossum24e4af82002-06-12 19:18:08 +00004830 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004831 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004832 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004833 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004834 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004835 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004836 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004837 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004838 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004839
4840 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004841 self.write_file.write(self.write_msg)
4842 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004843
4844 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004845 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004846 line = self.read_file.readline()
4847 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004848
4849 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004850 self.write_file.write(self.write_msg)
4851 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004852
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004853 def testCloseAfterMakefile(self):
4854 # The file returned by makefile should keep the socket open.
4855 self.cli_conn.close()
4856 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004857 msg = self.read_file.read()
4858 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004859
4860 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004861 self.write_file.write(self.write_msg)
4862 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004863
4864 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004865 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004866 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004867 if isinstance(self.read_msg, str):
4868 msg = msg.decode()
4869 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004870
4871 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004872 self.write_file.write(self.write_msg)
4873 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004874
Tim Peters116d83c2004-03-28 02:20:45 +00004875 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004876 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004877
4878 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004879 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004880
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004881 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004882 self.assertEqual(self.read_file.mode, self.read_mode)
4883 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004884
4885 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004886 self.assertEqual(self.write_file.mode, self.write_mode)
4887 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004888
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004889 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004890 self.read_file.close()
4891 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004892 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004893 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004894
4895 def _testRealClose(self):
4896 pass
4897
4898
Guido van Rossume9f66142002-08-07 15:46:19 +00004899class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4900
4901 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004902
Guido van Rossume9f66142002-08-07 15:46:19 +00004903 In this case (and in this case only), it should be possible to
4904 create a file object, read a line from it, create another file
4905 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004906 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004907 when reading multiple requests from the same socket."""
4908
4909 bufsize = 0 # Use unbuffered mode
4910
4911 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004912 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004913 line = self.read_file.readline() # first line
4914 self.assertEqual(line, b"A. " + self.write_msg) # first line
4915 self.read_file = self.cli_conn.makefile('rb', 0)
4916 line = self.read_file.readline() # second line
4917 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004918
4919 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004920 self.write_file.write(b"A. " + self.write_msg)
4921 self.write_file.write(b"B. " + self.write_msg)
4922 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004923
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004924 def testMakefileClose(self):
4925 # The file returned by makefile should keep the socket open...
4926 self.cli_conn.close()
4927 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004928 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004929 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004930 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004931 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004932
4933 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004934 self.write_file.write(self.write_msg)
4935 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004936
4937 def testMakefileCloseSocketDestroy(self):
4938 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004939 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004940 refcount_after = sys.getrefcount(self.cli_conn)
4941 self.assertEqual(refcount_before - 1, refcount_after)
4942
4943 def _testMakefileCloseSocketDestroy(self):
4944 pass
4945
Antoine Pitrou98b46702010-09-18 22:59:00 +00004946 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004947 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004948 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4949
4950 def testSmallReadNonBlocking(self):
4951 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004952 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4953 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004954 self.evt1.set()
4955 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004956 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004957 if first_seg is None:
4958 # Data not arrived (can happen under Windows), wait a bit
4959 time.sleep(0.5)
4960 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004961 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004962 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004963 self.assertEqual(n, 3)
4964 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004965 self.assertEqual(msg, self.read_msg)
4966 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4967 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004968
4969 def _testSmallReadNonBlocking(self):
4970 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004971 self.write_file.write(self.write_msg)
4972 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004973 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004974 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004975 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4976 self.serv_finished.wait(5.0)
4977
4978 def testWriteNonBlocking(self):
4979 self.cli_finished.wait(5.0)
4980 # The client thread can't skip directly - the SkipTest exception
4981 # would appear as a failure.
4982 if self.serv_skipped:
4983 self.skipTest(self.serv_skipped)
4984
4985 def _testWriteNonBlocking(self):
4986 self.serv_skipped = None
4987 self.serv_conn.setblocking(False)
4988 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004989 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004990 LIMIT = 10
4991 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004992 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004993 self.assertGreater(n, 0)
4994 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004995 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004996 if n is None:
4997 # Succeeded
4998 break
4999 self.assertGreater(n, 0)
5000 else:
5001 # Let us know that this test didn't manage to establish
5002 # the expected conditions. This is not a failure in itself but,
5003 # if it happens repeatedly, the test should be fixed.
5004 self.serv_skipped = "failed to saturate the socket buffer"
5005
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005006
Guido van Rossum8c943832002-08-08 01:00:28 +00005007class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5008
5009 bufsize = 1 # Default-buffered for reading; line-buffered for writing
5010
5011
5012class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5013
5014 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00005015
Thomas Woutersb2137042007-02-01 18:02:27 +00005016
Antoine Pitrou834bd812010-10-13 16:17:14 +00005017class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5018 """Tests for socket.makefile() in text mode (rather than binary)"""
5019
5020 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005021 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005022 write_mode = 'wb'
5023 write_msg = MSG
5024 newline = ''
5025
5026
5027class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5028 """Tests for socket.makefile() in text mode (rather than binary)"""
5029
5030 read_mode = 'rb'
5031 read_msg = MSG
5032 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005033 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005034 newline = ''
5035
5036
5037class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5038 """Tests for socket.makefile() in text mode (rather than binary)"""
5039
5040 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005041 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005042 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005043 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005044 newline = ''
5045
5046
Guido van Rossumd8faa362007-04-27 19:54:29 +00005047class NetworkConnectionTest(object):
5048 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005049
Guido van Rossumd8faa362007-04-27 19:54:29 +00005050 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005051 # We're inherited below by BasicTCPTest2, which also inherits
5052 # BasicTCPTest, which defines self.port referenced below.
5053 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005054 self.serv_conn = self.cli
5055
5056class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5057 """Tests that NetworkConnection does not break existing TCP functionality.
5058 """
5059
5060class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005061
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005062 class MockSocket(socket.socket):
5063 def connect(self, *args):
5064 raise socket.timeout('timed out')
5065
5066 @contextlib.contextmanager
5067 def mocked_socket_module(self):
5068 """Return a socket which times out on connect"""
5069 old_socket = socket.socket
5070 socket.socket = self.MockSocket
5071 try:
5072 yield
5073 finally:
5074 socket.socket = old_socket
5075
5076 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005077 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005078 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005079 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005080 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005081 cli.connect((HOST, port))
5082 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5083
5084 def test_create_connection(self):
5085 # Issue #9792: errors raised by create_connection() should have
5086 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005087 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005088 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005089 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005090
5091 # Issue #16257: create_connection() calls getaddrinfo() against
5092 # 'localhost'. This may result in an IPV6 addr being returned
5093 # as well as an IPV4 one:
5094 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5095 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5096 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5097 #
5098 # create_connection() enumerates through all the addresses returned
5099 # and if it doesn't successfully bind to any of them, it propagates
5100 # the last exception it encountered.
5101 #
5102 # On Solaris, ENETUNREACH is returned in this circumstance instead
5103 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5104 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005105 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005106 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005107
5108 def test_create_connection_timeout(self):
5109 # Issue #9792: create_connection() should not recast timeout errors
5110 # as generic socket errors.
5111 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005112 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005113 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005114 except socket.timeout:
5115 pass
5116 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005117 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005118 raise
5119 else:
5120 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005121
Guido van Rossumd8faa362007-04-27 19:54:29 +00005122
5123class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5124
5125 def __init__(self, methodName='runTest'):
5126 SocketTCPTest.__init__(self, methodName=methodName)
5127 ThreadableTest.__init__(self)
5128
5129 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005130 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005131
5132 def clientTearDown(self):
5133 self.cli.close()
5134 self.cli = None
5135 ThreadableTest.clientTearDown(self)
5136
5137 def _justAccept(self):
5138 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005139 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005140
5141 testFamily = _justAccept
5142 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005143 self.cli = socket.create_connection((HOST, self.port),
5144 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005145 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005146 self.assertEqual(self.cli.family, 2)
5147
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005148 testSourceAddress = _justAccept
5149 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005150 self.cli = socket.create_connection((HOST, self.port),
5151 timeout=support.LOOPBACK_TIMEOUT,
5152 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005153 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005154 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005155 # The port number being used is sufficient to show that the bind()
5156 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005157
Guido van Rossumd8faa362007-04-27 19:54:29 +00005158 testTimeoutDefault = _justAccept
5159 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005160 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005161 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005162 socket.setdefaulttimeout(42)
5163 try:
5164 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005165 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005166 finally:
5167 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005168 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005169
5170 testTimeoutNone = _justAccept
5171 def _testTimeoutNone(self):
5172 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005173 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005174 socket.setdefaulttimeout(30)
5175 try:
5176 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005177 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005178 finally:
5179 socket.setdefaulttimeout(None)
5180 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005181
5182 testTimeoutValueNamed = _justAccept
5183 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005184 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005185 self.assertEqual(self.cli.gettimeout(), 30)
5186
5187 testTimeoutValueNonamed = _justAccept
5188 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005189 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005190 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005191 self.assertEqual(self.cli.gettimeout(), 30)
5192
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005193
Guido van Rossumd8faa362007-04-27 19:54:29 +00005194class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5195
5196 def __init__(self, methodName='runTest'):
5197 SocketTCPTest.__init__(self, methodName=methodName)
5198 ThreadableTest.__init__(self)
5199
5200 def clientSetUp(self):
5201 pass
5202
5203 def clientTearDown(self):
5204 self.cli.close()
5205 self.cli = None
5206 ThreadableTest.clientTearDown(self)
5207
5208 def testInsideTimeout(self):
5209 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005210 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005211 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005212 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005213 testOutsideTimeout = testInsideTimeout
5214
5215 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005216 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005217 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005218 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005219
5220 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005221 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005222 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005223
5224
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005225class TCPTimeoutTest(SocketTCPTest):
5226
5227 def testTCPTimeout(self):
5228 def raise_timeout(*args, **kwargs):
5229 self.serv.settimeout(1.0)
5230 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005231 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005232 "Error generating a timeout exception (TCP)")
5233
5234 def testTimeoutZero(self):
5235 ok = False
5236 try:
5237 self.serv.settimeout(0.0)
5238 foo = self.serv.accept()
5239 except socket.timeout:
5240 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005241 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005242 ok = True
5243 except:
5244 self.fail("caught unexpected exception (TCP)")
5245 if not ok:
5246 self.fail("accept() returned success when we did not expect it")
5247
Serhiy Storchaka43767632013-11-03 21:31:38 +02005248 @unittest.skipUnless(hasattr(signal, 'alarm'),
5249 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005250 def testInterruptedTimeout(self):
5251 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005252 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005253 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005254 self.serv.settimeout(5.0) # must be longer than alarm
5255 class Alarm(Exception):
5256 pass
5257 def alarm_handler(signal, frame):
5258 raise Alarm
5259 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5260 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005261 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005262 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005263 foo = self.serv.accept()
5264 except socket.timeout:
5265 self.fail("caught timeout instead of Alarm")
5266 except Alarm:
5267 pass
5268 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005269 self.fail("caught other exception instead of Alarm:"
5270 " %s(%s):\n%s" %
5271 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005272 else:
5273 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005274 finally:
5275 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005276 except Alarm:
5277 self.fail("got Alarm in wrong place")
5278 finally:
5279 # no alarm can be pending. Safe to restore old handler.
5280 signal.signal(signal.SIGALRM, old_alarm)
5281
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005282class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005283
5284 def testUDPTimeout(self):
5285 def raise_timeout(*args, **kwargs):
5286 self.serv.settimeout(1.0)
5287 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005288 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005289 "Error generating a timeout exception (UDP)")
5290
5291 def testTimeoutZero(self):
5292 ok = False
5293 try:
5294 self.serv.settimeout(0.0)
5295 foo = self.serv.recv(1024)
5296 except socket.timeout:
5297 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005298 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005299 ok = True
5300 except:
5301 self.fail("caught unexpected exception (UDP)")
5302 if not ok:
5303 self.fail("recv() returned success when we did not expect it")
5304
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005305@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5306 'UDPLITE sockets required for this test.')
5307class UDPLITETimeoutTest(SocketUDPLITETest):
5308
5309 def testUDPLITETimeout(self):
5310 def raise_timeout(*args, **kwargs):
5311 self.serv.settimeout(1.0)
5312 self.serv.recv(1024)
5313 self.assertRaises(socket.timeout, raise_timeout,
5314 "Error generating a timeout exception (UDPLITE)")
5315
5316 def testTimeoutZero(self):
5317 ok = False
5318 try:
5319 self.serv.settimeout(0.0)
5320 foo = self.serv.recv(1024)
5321 except socket.timeout:
5322 self.fail("caught timeout instead of error (UDPLITE)")
5323 except OSError:
5324 ok = True
5325 except:
5326 self.fail("caught unexpected exception (UDPLITE)")
5327 if not ok:
5328 self.fail("recv() returned success when we did not expect it")
5329
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005330class TestExceptions(unittest.TestCase):
5331
5332 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005333 self.assertTrue(issubclass(OSError, Exception))
5334 self.assertTrue(issubclass(socket.herror, OSError))
5335 self.assertTrue(issubclass(socket.gaierror, OSError))
5336 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005337
Yury Selivanovfa22b292016-10-18 16:03:52 -04005338 def test_setblocking_invalidfd(self):
5339 # Regression test for issue #28471
5340
5341 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5342 sock = socket.socket(
5343 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5344 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005345 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005346
5347 with self.assertRaises(OSError):
5348 sock.setblocking(False)
5349
5350
Serhiy Storchaka43767632013-11-03 21:31:38 +02005351@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005352class TestLinuxAbstractNamespace(unittest.TestCase):
5353
5354 UNIX_PATH_MAX = 108
5355
5356 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005357 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005358 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5359 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005360 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005361 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5362 s2.connect(s1.getsockname())
5363 with s1.accept()[0] as s3:
5364 self.assertEqual(s1.getsockname(), address)
5365 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005366
5367 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005368 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005369 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5370 s.bind(address)
5371 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005372
5373 def testNameOverflow(self):
5374 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005375 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005376 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005377
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005378 def testStrName(self):
5379 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005380 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5381 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005382 s.bind("\x00python\x00test\x00")
5383 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005384 finally:
5385 s.close()
5386
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005387 def testBytearrayName(self):
5388 # Check that an abstract name can be passed as a bytearray.
5389 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5390 s.bind(bytearray(b"\x00python\x00test\x00"))
5391 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5392
Serhiy Storchaka43767632013-11-03 21:31:38 +02005393@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005394class TestUnixDomain(unittest.TestCase):
5395
5396 def setUp(self):
5397 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5398
5399 def tearDown(self):
5400 self.sock.close()
5401
5402 def encoded(self, path):
5403 # Return the given path encoded in the file system encoding,
5404 # or skip the test if this is not possible.
5405 try:
5406 return os.fsencode(path)
5407 except UnicodeEncodeError:
5408 self.skipTest(
5409 "Pathname {0!a} cannot be represented in file "
5410 "system encoding {1!r}".format(
5411 path, sys.getfilesystemencoding()))
5412
Antoine Pitrou16374872011-12-16 15:04:12 +01005413 def bind(self, sock, path):
5414 # Bind the socket
5415 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005416 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005417 except OSError as e:
5418 if str(e) == "AF_UNIX path too long":
5419 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005420 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005421 .format(path))
5422 else:
5423 raise
5424
Antoine Pitrou495b5022017-05-02 17:20:00 +02005425 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005426 # Issue #30205 (note getsockname() can return None on OS X)
5427 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005428
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005429 def testStrAddr(self):
5430 # Test binding to and retrieving a normal string pathname.
5431 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005432 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005433 self.addCleanup(support.unlink, path)
5434 self.assertEqual(self.sock.getsockname(), path)
5435
5436 def testBytesAddr(self):
5437 # Test binding to a bytes pathname.
5438 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005439 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005440 self.addCleanup(support.unlink, path)
5441 self.assertEqual(self.sock.getsockname(), path)
5442
5443 def testSurrogateescapeBind(self):
5444 # Test binding to a valid non-ASCII pathname, with the
5445 # non-ASCII bytes supplied using surrogateescape encoding.
5446 path = os.path.abspath(support.TESTFN_UNICODE)
5447 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005448 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005449 self.addCleanup(support.unlink, path)
5450 self.assertEqual(self.sock.getsockname(), path)
5451
5452 def testUnencodableAddr(self):
5453 # Test binding to a pathname that cannot be encoded in the
5454 # file system encoding.
5455 if support.TESTFN_UNENCODABLE is None:
5456 self.skipTest("No unencodable filename available")
5457 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005458 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005459 self.addCleanup(support.unlink, path)
5460 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005461
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005462
Thomas Wouters477c8d52006-05-27 19:21:47 +00005463class BufferIOTest(SocketConnectedTest):
5464 """
5465 Test the buffer versions of socket.recv() and socket.send().
5466 """
5467 def __init__(self, methodName='runTest'):
5468 SocketConnectedTest.__init__(self, methodName=methodName)
5469
Antoine Pitrou25480782010-03-17 22:50:28 +00005470 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005471 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005472 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005473 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005474 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005475 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005476 self.assertEqual(msg, MSG)
5477
Antoine Pitrou25480782010-03-17 22:50:28 +00005478 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005479 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005480 self.serv_conn.send(buf)
5481
Antoine Pitrou25480782010-03-17 22:50:28 +00005482 def testRecvIntoBytearray(self):
5483 buf = bytearray(1024)
5484 nbytes = self.cli_conn.recv_into(buf)
5485 self.assertEqual(nbytes, len(MSG))
5486 msg = buf[:len(MSG)]
5487 self.assertEqual(msg, MSG)
5488
5489 _testRecvIntoBytearray = _testRecvIntoArray
5490
5491 def testRecvIntoMemoryview(self):
5492 buf = bytearray(1024)
5493 nbytes = self.cli_conn.recv_into(memoryview(buf))
5494 self.assertEqual(nbytes, len(MSG))
5495 msg = buf[:len(MSG)]
5496 self.assertEqual(msg, MSG)
5497
5498 _testRecvIntoMemoryview = _testRecvIntoArray
5499
5500 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005501 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005502 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005503 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005504 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005505 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005506 self.assertEqual(msg, MSG)
5507
Antoine Pitrou25480782010-03-17 22:50:28 +00005508 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005509 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005510 self.serv_conn.send(buf)
5511
Antoine Pitrou25480782010-03-17 22:50:28 +00005512 def testRecvFromIntoBytearray(self):
5513 buf = bytearray(1024)
5514 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5515 self.assertEqual(nbytes, len(MSG))
5516 msg = buf[:len(MSG)]
5517 self.assertEqual(msg, MSG)
5518
5519 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5520
5521 def testRecvFromIntoMemoryview(self):
5522 buf = bytearray(1024)
5523 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5524 self.assertEqual(nbytes, len(MSG))
5525 msg = buf[:len(MSG)]
5526 self.assertEqual(msg, MSG)
5527
5528 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5529
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005530 def testRecvFromIntoSmallBuffer(self):
5531 # See issue #20246.
5532 buf = bytearray(8)
5533 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5534
5535 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005536 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005537
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005538 def testRecvFromIntoEmptyBuffer(self):
5539 buf = bytearray()
5540 self.cli_conn.recvfrom_into(buf)
5541 self.cli_conn.recvfrom_into(buf, 0)
5542
5543 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5544
Christian Heimes043d6f62008-01-07 17:19:16 +00005545
5546TIPC_STYPE = 2000
5547TIPC_LOWER = 200
5548TIPC_UPPER = 210
5549
5550def isTipcAvailable():
5551 """Check if the TIPC module is loaded
5552
5553 The TIPC module is not loaded automatically on Ubuntu and probably
5554 other Linux distros.
5555 """
5556 if not hasattr(socket, "AF_TIPC"):
5557 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005558 try:
5559 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005560 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005561 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005562 # have not the permission to read it.
5563 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005564 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005565 for line in f:
5566 if line.startswith("tipc "):
5567 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005568 return False
5569
Serhiy Storchaka43767632013-11-03 21:31:38 +02005570@unittest.skipUnless(isTipcAvailable(),
5571 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005572class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005573 def testRDM(self):
5574 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5575 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005576 self.addCleanup(srv.close)
5577 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005578
5579 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5580 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5581 TIPC_LOWER, TIPC_UPPER)
5582 srv.bind(srvaddr)
5583
5584 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5585 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5586 cli.sendto(MSG, sendaddr)
5587
5588 msg, recvaddr = srv.recvfrom(1024)
5589
5590 self.assertEqual(cli.getsockname(), recvaddr)
5591 self.assertEqual(msg, MSG)
5592
5593
Serhiy Storchaka43767632013-11-03 21:31:38 +02005594@unittest.skipUnless(isTipcAvailable(),
5595 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005596class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005597 def __init__(self, methodName = 'runTest'):
5598 unittest.TestCase.__init__(self, methodName = methodName)
5599 ThreadableTest.__init__(self)
5600
5601 def setUp(self):
5602 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005603 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005604 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5605 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5606 TIPC_LOWER, TIPC_UPPER)
5607 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005608 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005609 self.serverExplicitReady()
5610 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005611 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005612
5613 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005614 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005615 # accept() call; sleep a little while to avoid it, otherwise
5616 # we could get an exception
5617 time.sleep(0.1)
5618 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005619 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005620 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5621 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5622 self.cli.connect(addr)
5623 self.cliaddr = self.cli.getsockname()
5624
5625 def testStream(self):
5626 msg = self.conn.recv(1024)
5627 self.assertEqual(msg, MSG)
5628 self.assertEqual(self.cliaddr, self.connaddr)
5629
5630 def _testStream(self):
5631 self.cli.send(MSG)
5632 self.cli.close()
5633
5634
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005635class ContextManagersTest(ThreadedTCPSocketTest):
5636
5637 def _testSocketClass(self):
5638 # base test
5639 with socket.socket() as sock:
5640 self.assertFalse(sock._closed)
5641 self.assertTrue(sock._closed)
5642 # close inside with block
5643 with socket.socket() as sock:
5644 sock.close()
5645 self.assertTrue(sock._closed)
5646 # exception inside with block
5647 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005648 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005649 self.assertTrue(sock._closed)
5650
5651 def testCreateConnectionBase(self):
5652 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005653 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005654 data = conn.recv(1024)
5655 conn.sendall(data)
5656
5657 def _testCreateConnectionBase(self):
5658 address = self.serv.getsockname()
5659 with socket.create_connection(address) as sock:
5660 self.assertFalse(sock._closed)
5661 sock.sendall(b'foo')
5662 self.assertEqual(sock.recv(1024), b'foo')
5663 self.assertTrue(sock._closed)
5664
5665 def testCreateConnectionClose(self):
5666 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005667 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005668 data = conn.recv(1024)
5669 conn.sendall(data)
5670
5671 def _testCreateConnectionClose(self):
5672 address = self.serv.getsockname()
5673 with socket.create_connection(address) as sock:
5674 sock.close()
5675 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005676 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005677
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005678
Victor Stinnerdaf45552013-08-28 00:53:59 +02005679class InheritanceTest(unittest.TestCase):
5680 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5681 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005682 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005683 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005684 with socket.socket(socket.AF_INET,
5685 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005686 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005687 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005688
5689 def test_default_inheritable(self):
5690 sock = socket.socket()
5691 with sock:
5692 self.assertEqual(sock.get_inheritable(), False)
5693
5694 def test_dup(self):
5695 sock = socket.socket()
5696 with sock:
5697 newsock = sock.dup()
5698 sock.close()
5699 with newsock:
5700 self.assertEqual(newsock.get_inheritable(), False)
5701
5702 def test_set_inheritable(self):
5703 sock = socket.socket()
5704 with sock:
5705 sock.set_inheritable(True)
5706 self.assertEqual(sock.get_inheritable(), True)
5707
5708 sock.set_inheritable(False)
5709 self.assertEqual(sock.get_inheritable(), False)
5710
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005711 @unittest.skipIf(fcntl is None, "need fcntl")
5712 def test_get_inheritable_cloexec(self):
5713 sock = socket.socket()
5714 with sock:
5715 fd = sock.fileno()
5716 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005717
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005718 # clear FD_CLOEXEC flag
5719 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5720 flags &= ~fcntl.FD_CLOEXEC
5721 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005722
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005723 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005724
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005725 @unittest.skipIf(fcntl is None, "need fcntl")
5726 def test_set_inheritable_cloexec(self):
5727 sock = socket.socket()
5728 with sock:
5729 fd = sock.fileno()
5730 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5731 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005732
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005733 sock.set_inheritable(True)
5734 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5735 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005736
5737
Victor Stinnerdaf45552013-08-28 00:53:59 +02005738 def test_socketpair(self):
5739 s1, s2 = socket.socketpair()
5740 self.addCleanup(s1.close)
5741 self.addCleanup(s2.close)
5742 self.assertEqual(s1.get_inheritable(), False)
5743 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005744
5745
5746@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5747 "SOCK_NONBLOCK not defined")
5748class NonblockConstantTest(unittest.TestCase):
5749 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5750 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005751 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005752 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005753 self.assertTrue(
5754 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005755 if timeout == 0:
5756 # timeout == 0: means that getblocking() must be False.
5757 self.assertFalse(s.getblocking())
5758 else:
5759 # If timeout > 0, the socket will be in a "blocking" mode
5760 # from the standpoint of the Python API. For Python socket
5761 # object, "blocking" means that operations like 'sock.recv()'
5762 # will block. Internally, file descriptors for
5763 # "blocking" Python sockets *with timeouts* are in a
5764 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5765 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5766 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005767 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005768 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005769 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005770 self.assertFalse(
5771 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005772 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005773
Charles-François Natali239bb962011-06-03 12:55:15 +02005774 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005775 def test_SOCK_NONBLOCK(self):
5776 # a lot of it seems silly and redundant, but I wanted to test that
5777 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005778 with socket.socket(socket.AF_INET,
5779 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5780 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005781 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005782 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005783 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005784 self.checkNonblock(s)
5785 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005786 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005787 s.settimeout(2.0)
5788 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005789 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005790 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005791 # defaulttimeout
5792 t = socket.getdefaulttimeout()
5793 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005794 with socket.socket() as s:
5795 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005796 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005797 with socket.socket() as s:
5798 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005799 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005800 with socket.socket() as s:
5801 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005802 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005803 with socket.socket() as s:
5804 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005805 socket.setdefaulttimeout(t)
5806
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005807
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005808@unittest.skipUnless(os.name == "nt", "Windows specific")
5809@unittest.skipUnless(multiprocessing, "need multiprocessing")
5810class TestSocketSharing(SocketTCPTest):
5811 # This must be classmethod and not staticmethod or multiprocessing
5812 # won't be able to bootstrap it.
5813 @classmethod
5814 def remoteProcessServer(cls, q):
5815 # Recreate socket from shared data
5816 sdata = q.get()
5817 message = q.get()
5818
5819 s = socket.fromshare(sdata)
5820 s2, c = s.accept()
5821
5822 # Send the message
5823 s2.sendall(message)
5824 s2.close()
5825 s.close()
5826
5827 def testShare(self):
5828 # Transfer the listening server socket to another process
5829 # and service it from there.
5830
5831 # Create process:
5832 q = multiprocessing.Queue()
5833 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5834 p.start()
5835
5836 # Get the shared socket data
5837 data = self.serv.share(p.pid)
5838
5839 # Pass the shared socket to the other process
5840 addr = self.serv.getsockname()
5841 self.serv.close()
5842 q.put(data)
5843
5844 # The data that the server will send us
5845 message = b"slapmahfro"
5846 q.put(message)
5847
5848 # Connect
5849 s = socket.create_connection(addr)
5850 # listen for the data
5851 m = []
5852 while True:
5853 data = s.recv(100)
5854 if not data:
5855 break
5856 m.append(data)
5857 s.close()
5858 received = b"".join(m)
5859 self.assertEqual(received, message)
5860 p.join()
5861
5862 def testShareLength(self):
5863 data = self.serv.share(os.getpid())
5864 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5865 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5866
5867 def compareSockets(self, org, other):
5868 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005869 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005870 self.assertEqual(org.gettimeout(), None)
5871 self.assertEqual(org.gettimeout(), other.gettimeout())
5872
5873 self.assertEqual(org.family, other.family)
5874 self.assertEqual(org.type, other.type)
5875 # If the user specified "0" for proto, then
5876 # internally windows will have picked the correct value.
5877 # Python introspection on the socket however will still return
5878 # 0. For the shared socket, the python value is recreated
5879 # from the actual value, so it may not compare correctly.
5880 if org.proto != 0:
5881 self.assertEqual(org.proto, other.proto)
5882
5883 def testShareLocal(self):
5884 data = self.serv.share(os.getpid())
5885 s = socket.fromshare(data)
5886 try:
5887 self.compareSockets(self.serv, s)
5888 finally:
5889 s.close()
5890
5891 def testTypes(self):
5892 families = [socket.AF_INET, socket.AF_INET6]
5893 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5894 for f in families:
5895 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005896 try:
5897 source = socket.socket(f, t)
5898 except OSError:
5899 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005900 try:
5901 data = source.share(os.getpid())
5902 shared = socket.fromshare(data)
5903 try:
5904 self.compareSockets(source, shared)
5905 finally:
5906 shared.close()
5907 finally:
5908 source.close()
5909
5910
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005911class SendfileUsingSendTest(ThreadedTCPSocketTest):
5912 """
5913 Test the send() implementation of socket.sendfile().
5914 """
5915
Victor Stinner8c663fd2017-11-08 14:44:44 -08005916 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005917 BUFSIZE = 8192
5918 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005919 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005920
5921 @classmethod
5922 def setUpClass(cls):
5923 def chunks(total, step):
5924 assert total >= step
5925 while total > step:
5926 yield step
5927 total -= step
5928 if total:
5929 yield total
5930
5931 chunk = b"".join([random.choice(string.ascii_letters).encode()
5932 for i in range(cls.BUFSIZE)])
5933 with open(support.TESTFN, 'wb') as f:
5934 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5935 f.write(chunk)
5936 with open(support.TESTFN, 'rb') as f:
5937 cls.FILEDATA = f.read()
5938 assert len(cls.FILEDATA) == cls.FILESIZE
5939
5940 @classmethod
5941 def tearDownClass(cls):
5942 support.unlink(support.TESTFN)
5943
5944 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005945 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005946 conn, addr = self.serv.accept()
5947 conn.settimeout(self.TIMEOUT)
5948 self.addCleanup(conn.close)
5949 return conn
5950
5951 def recv_data(self, conn):
5952 received = []
5953 while True:
5954 chunk = conn.recv(self.BUFSIZE)
5955 if not chunk:
5956 break
5957 received.append(chunk)
5958 return b''.join(received)
5959
5960 def meth_from_sock(self, sock):
5961 # Depending on the mixin class being run return either send()
5962 # or sendfile() method implementation.
5963 return getattr(sock, "_sendfile_use_send")
5964
5965 # regular file
5966
5967 def _testRegularFile(self):
5968 address = self.serv.getsockname()
5969 file = open(support.TESTFN, 'rb')
5970 with socket.create_connection(address) as sock, file as file:
5971 meth = self.meth_from_sock(sock)
5972 sent = meth(file)
5973 self.assertEqual(sent, self.FILESIZE)
5974 self.assertEqual(file.tell(), self.FILESIZE)
5975
5976 def testRegularFile(self):
5977 conn = self.accept_conn()
5978 data = self.recv_data(conn)
5979 self.assertEqual(len(data), self.FILESIZE)
5980 self.assertEqual(data, self.FILEDATA)
5981
5982 # non regular file
5983
5984 def _testNonRegularFile(self):
5985 address = self.serv.getsockname()
5986 file = io.BytesIO(self.FILEDATA)
5987 with socket.create_connection(address) as sock, file as file:
5988 sent = sock.sendfile(file)
5989 self.assertEqual(sent, self.FILESIZE)
5990 self.assertEqual(file.tell(), self.FILESIZE)
5991 self.assertRaises(socket._GiveupOnSendfile,
5992 sock._sendfile_use_sendfile, file)
5993
5994 def testNonRegularFile(self):
5995 conn = self.accept_conn()
5996 data = self.recv_data(conn)
5997 self.assertEqual(len(data), self.FILESIZE)
5998 self.assertEqual(data, self.FILEDATA)
5999
6000 # empty file
6001
6002 def _testEmptyFileSend(self):
6003 address = self.serv.getsockname()
6004 filename = support.TESTFN + "2"
6005 with open(filename, 'wb'):
6006 self.addCleanup(support.unlink, filename)
6007 file = open(filename, 'rb')
6008 with socket.create_connection(address) as sock, file as file:
6009 meth = self.meth_from_sock(sock)
6010 sent = meth(file)
6011 self.assertEqual(sent, 0)
6012 self.assertEqual(file.tell(), 0)
6013
6014 def testEmptyFileSend(self):
6015 conn = self.accept_conn()
6016 data = self.recv_data(conn)
6017 self.assertEqual(data, b"")
6018
6019 # offset
6020
6021 def _testOffset(self):
6022 address = self.serv.getsockname()
6023 file = open(support.TESTFN, 'rb')
6024 with socket.create_connection(address) as sock, file as file:
6025 meth = self.meth_from_sock(sock)
6026 sent = meth(file, offset=5000)
6027 self.assertEqual(sent, self.FILESIZE - 5000)
6028 self.assertEqual(file.tell(), self.FILESIZE)
6029
6030 def testOffset(self):
6031 conn = self.accept_conn()
6032 data = self.recv_data(conn)
6033 self.assertEqual(len(data), self.FILESIZE - 5000)
6034 self.assertEqual(data, self.FILEDATA[5000:])
6035
6036 # count
6037
6038 def _testCount(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 count = 5000007
6045 meth = self.meth_from_sock(sock)
6046 sent = meth(file, count=count)
6047 self.assertEqual(sent, count)
6048 self.assertEqual(file.tell(), count)
6049
6050 def testCount(self):
6051 count = 5000007
6052 conn = self.accept_conn()
6053 data = self.recv_data(conn)
6054 self.assertEqual(len(data), count)
6055 self.assertEqual(data, self.FILEDATA[:count])
6056
6057 # count small
6058
6059 def _testCountSmall(self):
6060 address = self.serv.getsockname()
6061 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006062 sock = socket.create_connection(address,
6063 timeout=support.LOOPBACK_TIMEOUT)
6064 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006065 count = 1
6066 meth = self.meth_from_sock(sock)
6067 sent = meth(file, count=count)
6068 self.assertEqual(sent, count)
6069 self.assertEqual(file.tell(), count)
6070
6071 def testCountSmall(self):
6072 count = 1
6073 conn = self.accept_conn()
6074 data = self.recv_data(conn)
6075 self.assertEqual(len(data), count)
6076 self.assertEqual(data, self.FILEDATA[:count])
6077
6078 # count + offset
6079
6080 def _testCountWithOffset(self):
6081 address = self.serv.getsockname()
6082 file = open(support.TESTFN, 'rb')
6083 with socket.create_connection(address, timeout=2) as sock, file as file:
6084 count = 100007
6085 meth = self.meth_from_sock(sock)
6086 sent = meth(file, offset=2007, count=count)
6087 self.assertEqual(sent, count)
6088 self.assertEqual(file.tell(), count + 2007)
6089
6090 def testCountWithOffset(self):
6091 count = 100007
6092 conn = self.accept_conn()
6093 data = self.recv_data(conn)
6094 self.assertEqual(len(data), count)
6095 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6096
6097 # non blocking sockets are not supposed to work
6098
6099 def _testNonBlocking(self):
6100 address = self.serv.getsockname()
6101 file = open(support.TESTFN, 'rb')
6102 with socket.create_connection(address) as sock, file as file:
6103 sock.setblocking(False)
6104 meth = self.meth_from_sock(sock)
6105 self.assertRaises(ValueError, meth, file)
6106 self.assertRaises(ValueError, sock.sendfile, file)
6107
6108 def testNonBlocking(self):
6109 conn = self.accept_conn()
6110 if conn.recv(8192):
6111 self.fail('was not supposed to receive any data')
6112
6113 # timeout (non-triggered)
6114
6115 def _testWithTimeout(self):
6116 address = self.serv.getsockname()
6117 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006118 sock = socket.create_connection(address,
6119 timeout=support.LOOPBACK_TIMEOUT)
6120 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006121 meth = self.meth_from_sock(sock)
6122 sent = meth(file)
6123 self.assertEqual(sent, self.FILESIZE)
6124
6125 def testWithTimeout(self):
6126 conn = self.accept_conn()
6127 data = self.recv_data(conn)
6128 self.assertEqual(len(data), self.FILESIZE)
6129 self.assertEqual(data, self.FILEDATA)
6130
6131 # timeout (triggered)
6132
6133 def _testWithTimeoutTriggeredSend(self):
6134 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006135 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006136 with socket.create_connection(address) as sock:
6137 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006138 meth = self.meth_from_sock(sock)
6139 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006140
6141 def testWithTimeoutTriggeredSend(self):
6142 conn = self.accept_conn()
6143 conn.recv(88192)
6144
6145 # errors
6146
6147 def _test_errors(self):
6148 pass
6149
6150 def test_errors(self):
6151 with open(support.TESTFN, 'rb') as file:
6152 with socket.socket(type=socket.SOCK_DGRAM) as s:
6153 meth = self.meth_from_sock(s)
6154 self.assertRaisesRegex(
6155 ValueError, "SOCK_STREAM", meth, file)
6156 with open(support.TESTFN, 'rt') as file:
6157 with socket.socket() as s:
6158 meth = self.meth_from_sock(s)
6159 self.assertRaisesRegex(
6160 ValueError, "binary mode", meth, file)
6161 with open(support.TESTFN, 'rb') as file:
6162 with socket.socket() as s:
6163 meth = self.meth_from_sock(s)
6164 self.assertRaisesRegex(TypeError, "positive integer",
6165 meth, file, count='2')
6166 self.assertRaisesRegex(TypeError, "positive integer",
6167 meth, file, count=0.1)
6168 self.assertRaisesRegex(ValueError, "positive integer",
6169 meth, file, count=0)
6170 self.assertRaisesRegex(ValueError, "positive integer",
6171 meth, file, count=-1)
6172
6173
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006174@unittest.skipUnless(hasattr(os, "sendfile"),
6175 'os.sendfile() required for this test.')
6176class SendfileUsingSendfileTest(SendfileUsingSendTest):
6177 """
6178 Test the sendfile() implementation of socket.sendfile().
6179 """
6180 def meth_from_sock(self, sock):
6181 return getattr(sock, "_sendfile_use_sendfile")
6182
Christian Heimes48371412016-09-06 00:37:46 +02006183
6184@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006185class LinuxKernelCryptoAPI(unittest.TestCase):
6186 # tests for AF_ALG
6187 def create_alg(self, typ, name):
6188 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006189 try:
6190 sock.bind((typ, name))
6191 except FileNotFoundError as e:
6192 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006193 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006194 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006195 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006196 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006197
Victor Stinner86afc1f2017-11-30 13:58:43 +01006198 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6199 # at least on ppc64le architecture
6200 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006201 def test_sha256(self):
6202 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6203 "177a9cb410ff61f20015ad")
6204 with self.create_alg('hash', 'sha256') as algo:
6205 op, _ = algo.accept()
6206 with op:
6207 op.sendall(b"abc")
6208 self.assertEqual(op.recv(512), expected)
6209
6210 op, _ = algo.accept()
6211 with op:
6212 op.send(b'a', socket.MSG_MORE)
6213 op.send(b'b', socket.MSG_MORE)
6214 op.send(b'c', socket.MSG_MORE)
6215 op.send(b'')
6216 self.assertEqual(op.recv(512), expected)
6217
6218 def test_hmac_sha1(self):
6219 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6220 with self.create_alg('hash', 'hmac(sha1)') as algo:
6221 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6222 op, _ = algo.accept()
6223 with op:
6224 op.sendall(b"what do ya want for nothing?")
6225 self.assertEqual(op.recv(512), expected)
6226
Christian Heimese084f842016-09-11 20:11:30 +02006227 # Although it should work with 3.19 and newer the test blocks on
6228 # Ubuntu 15.10 with Kernel 4.2.0-19.
6229 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006230 def test_aes_cbc(self):
6231 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6232 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6233 msg = b"Single block msg"
6234 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6235 msglen = len(msg)
6236 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6237 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6238 op, _ = algo.accept()
6239 with op:
6240 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6241 flags=socket.MSG_MORE)
6242 op.sendall(msg)
6243 self.assertEqual(op.recv(msglen), ciphertext)
6244
6245 op, _ = algo.accept()
6246 with op:
6247 op.sendmsg_afalg([ciphertext],
6248 op=socket.ALG_OP_DECRYPT, iv=iv)
6249 self.assertEqual(op.recv(msglen), msg)
6250
6251 # long message
6252 multiplier = 1024
6253 longmsg = [msg] * multiplier
6254 op, _ = algo.accept()
6255 with op:
6256 op.sendmsg_afalg(longmsg,
6257 op=socket.ALG_OP_ENCRYPT, iv=iv)
6258 enc = op.recv(msglen * multiplier)
6259 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006260 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006261
6262 op, _ = algo.accept()
6263 with op:
6264 op.sendmsg_afalg([enc],
6265 op=socket.ALG_OP_DECRYPT, iv=iv)
6266 dec = op.recv(msglen * multiplier)
6267 self.assertEqual(len(dec), msglen * multiplier)
6268 self.assertEqual(dec, msg * multiplier)
6269
matejcik9764c152017-02-16 14:41:31 +01006270 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006271 def test_aead_aes_gcm(self):
6272 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6273 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6274 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6275 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6276 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6277 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6278
6279 taglen = len(expected_tag)
6280 assoclen = len(assoc)
6281
6282 with self.create_alg('aead', 'gcm(aes)') as algo:
6283 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6284 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6285 None, taglen)
6286
6287 # send assoc, plain and tag buffer in separate steps
6288 op, _ = algo.accept()
6289 with op:
6290 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6291 assoclen=assoclen, flags=socket.MSG_MORE)
6292 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006293 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006294 res = op.recv(assoclen + len(plain) + taglen)
6295 self.assertEqual(expected_ct, res[assoclen:-taglen])
6296 self.assertEqual(expected_tag, res[-taglen:])
6297
6298 # now with msg
6299 op, _ = algo.accept()
6300 with op:
matejcik9764c152017-02-16 14:41:31 +01006301 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006302 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6303 assoclen=assoclen)
6304 res = op.recv(assoclen + len(plain) + taglen)
6305 self.assertEqual(expected_ct, res[assoclen:-taglen])
6306 self.assertEqual(expected_tag, res[-taglen:])
6307
6308 # create anc data manually
6309 pack_uint32 = struct.Struct('I').pack
6310 op, _ = algo.accept()
6311 with op:
matejcik9764c152017-02-16 14:41:31 +01006312 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006313 op.sendmsg(
6314 [msg],
6315 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6316 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6317 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6318 )
6319 )
matejcik9764c152017-02-16 14:41:31 +01006320 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006321 self.assertEqual(expected_ct, res[assoclen:-taglen])
6322 self.assertEqual(expected_tag, res[-taglen:])
6323
6324 # decrypt and verify
6325 op, _ = algo.accept()
6326 with op:
6327 msg = assoc + expected_ct + expected_tag
6328 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6329 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006330 res = op.recv(len(msg) - taglen)
6331 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006332
Christian Heimese084f842016-09-11 20:11:30 +02006333 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006334 def test_drbg_pr_sha256(self):
6335 # deterministic random bit generator, prediction resistance, sha256
6336 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6337 extra_seed = os.urandom(32)
6338 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6339 op, _ = algo.accept()
6340 with op:
6341 rn = op.recv(32)
6342 self.assertEqual(len(rn), 32)
6343
6344 def test_sendmsg_afalg_args(self):
6345 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006346 with sock:
6347 with self.assertRaises(TypeError):
6348 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006349
Christian Heimes02b30352016-09-11 19:49:56 +02006350 with self.assertRaises(TypeError):
6351 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006352
Christian Heimes02b30352016-09-11 19:49:56 +02006353 with self.assertRaises(TypeError):
6354 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006355
Christian Heimes02b30352016-09-11 19:49:56 +02006356 with self.assertRaises(TypeError):
6357 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006358
Christian Heimes02b30352016-09-11 19:49:56 +02006359 with self.assertRaises(TypeError):
6360 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6361
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006362 def test_length_restriction(self):
6363 # bpo-35050, off-by-one error in length check
6364 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6365 self.addCleanup(sock.close)
6366
6367 # salg_type[14]
6368 with self.assertRaises(FileNotFoundError):
6369 sock.bind(("t" * 13, "name"))
6370 with self.assertRaisesRegex(ValueError, "type too long"):
6371 sock.bind(("t" * 14, "name"))
6372
6373 # salg_name[64]
6374 with self.assertRaises(FileNotFoundError):
6375 sock.bind(("type", "n" * 63))
6376 with self.assertRaisesRegex(ValueError, "name too long"):
6377 sock.bind(("type", "n" * 64))
6378
6379
animalize19e7d482018-02-27 02:10:36 +08006380@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6381class TestMSWindowsTCPFlags(unittest.TestCase):
6382 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006383 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006384 'TCP_MAXSEG',
6385 'TCP_NODELAY',
6386 # available starting with Windows 10 1607
6387 'TCP_FASTOPEN',
6388 # available starting with Windows 10 1703
6389 'TCP_KEEPCNT',
6390 # available starting with Windows 10 1709
6391 'TCP_KEEPIDLE',
6392 'TCP_KEEPINTVL'
6393 }
6394
6395 def test_new_tcp_flags(self):
6396 provided = [s for s in dir(socket) if s.startswith('TCP')]
6397 unknown = [s for s in provided if s not in self.knownTCPFlags]
6398
6399 self.assertEqual([], unknown,
6400 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006401
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006402
6403class CreateServerTest(unittest.TestCase):
6404
6405 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006406 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006407 with socket.create_server(("127.0.0.1", port)) as sock:
6408 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6409 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006410 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006411 with socket.create_server(("::1", port),
6412 family=socket.AF_INET6) as sock:
6413 self.assertEqual(sock.getsockname()[0], "::1")
6414 self.assertEqual(sock.getsockname()[1], port)
6415
6416 def test_family_and_type(self):
6417 with socket.create_server(("127.0.0.1", 0)) as sock:
6418 self.assertEqual(sock.family, socket.AF_INET)
6419 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006420 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006421 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6422 self.assertEqual(s.family, socket.AF_INET6)
6423 self.assertEqual(sock.type, socket.SOCK_STREAM)
6424
6425 def test_reuse_port(self):
6426 if not hasattr(socket, "SO_REUSEPORT"):
6427 with self.assertRaises(ValueError):
6428 socket.create_server(("localhost", 0), reuse_port=True)
6429 else:
6430 with socket.create_server(("localhost", 0)) as sock:
6431 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6432 self.assertEqual(opt, 0)
6433 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6434 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6435 self.assertNotEqual(opt, 0)
6436
6437 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6438 not hasattr(_socket, 'IPV6_V6ONLY'),
6439 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006440 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006441 def test_ipv6_only_default(self):
6442 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6443 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6444
6445 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6446 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006447 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006448 def test_dualstack_ipv6_family(self):
6449 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6450 dualstack_ipv6=True) as sock:
6451 self.assertEqual(sock.family, socket.AF_INET6)
6452
6453
6454class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006455 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006456
6457 def setUp(self):
6458 self.thread = None
6459
6460 def tearDown(self):
6461 if self.thread is not None:
6462 self.thread.join(self.timeout)
6463
6464 def echo_server(self, sock):
6465 def run(sock):
6466 with sock:
6467 conn, _ = sock.accept()
6468 with conn:
6469 event.wait(self.timeout)
6470 msg = conn.recv(1024)
6471 if not msg:
6472 return
6473 conn.sendall(msg)
6474
6475 event = threading.Event()
6476 sock.settimeout(self.timeout)
6477 self.thread = threading.Thread(target=run, args=(sock, ))
6478 self.thread.start()
6479 event.set()
6480
6481 def echo_client(self, addr, family):
6482 with socket.socket(family=family) as sock:
6483 sock.settimeout(self.timeout)
6484 sock.connect(addr)
6485 sock.sendall(b'foo')
6486 self.assertEqual(sock.recv(1024), b'foo')
6487
6488 def test_tcp4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006489 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006490 with socket.create_server(("", port)) as sock:
6491 self.echo_server(sock)
6492 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6493
Serhiy Storchaka16994912020-04-25 10:06:29 +03006494 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006495 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006496 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006497 with socket.create_server(("", port),
6498 family=socket.AF_INET6) as sock:
6499 self.echo_server(sock)
6500 self.echo_client(("::1", port), socket.AF_INET6)
6501
6502 # --- dual stack tests
6503
6504 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6505 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006506 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006507 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006508 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006509 with socket.create_server(("", port), family=socket.AF_INET6,
6510 dualstack_ipv6=True) as sock:
6511 self.echo_server(sock)
6512 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6513
6514 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6515 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006516 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006517 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006518 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006519 with socket.create_server(("", port), family=socket.AF_INET6,
6520 dualstack_ipv6=True) as sock:
6521 self.echo_server(sock)
6522 self.echo_client(("::1", port), socket.AF_INET6)
6523
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006524@requireAttrs(socket, "send_fds")
6525@requireAttrs(socket, "recv_fds")
6526@requireAttrs(socket, "AF_UNIX")
6527class SendRecvFdsTests(unittest.TestCase):
6528 def testSendAndRecvFds(self):
6529 def close_pipes(pipes):
6530 for fd1, fd2 in pipes:
6531 os.close(fd1)
6532 os.close(fd2)
6533
6534 def close_fds(fds):
6535 for fd in fds:
6536 os.close(fd)
6537
6538 # send 10 file descriptors
6539 pipes = [os.pipe() for _ in range(10)]
6540 self.addCleanup(close_pipes, pipes)
6541 fds = [rfd for rfd, wfd in pipes]
6542
6543 # use a UNIX socket pair to exchange file descriptors locally
6544 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6545 with sock1, sock2:
6546 socket.send_fds(sock1, [MSG], fds)
6547 # request more data and file descriptors than expected
6548 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6549 self.addCleanup(close_fds, fds2)
6550
6551 self.assertEqual(msg, MSG)
6552 self.assertEqual(len(fds2), len(fds))
6553 self.assertEqual(flags, 0)
6554 # don't test addr
6555
6556 # test that file descriptors are connected
6557 for index, fds in enumerate(pipes):
6558 rfd, wfd = fds
6559 os.write(wfd, str(index).encode())
6560
6561 for index, rfd in enumerate(fds2):
6562 data = os.read(rfd, 100)
6563 self.assertEqual(data, str(index).encode())
6564
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006565
Guido van Rossumb995eb72002-07-31 16:08:40 +00006566def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006567 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006568 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006569 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6570 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006571
6572 tests.extend([
6573 NonBlockingTCPTests,
6574 FileObjectClassTestCase,
6575 UnbufferedFileObjectClassTestCase,
6576 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006577 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006578 UnicodeReadFileObjectClassTestCase,
6579 UnicodeWriteFileObjectClassTestCase,
6580 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006581 NetworkConnectionNoServer,
6582 NetworkConnectionAttributesTest,
6583 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006584 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006585 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006586 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006587 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006588 tests.append(BasicSocketPairTest)
6589 tests.append(TestUnixDomain)
6590 tests.append(TestLinuxAbstractNamespace)
6591 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006592 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006593 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006594 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006595 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006596 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006597 BasicVSOCKTest,
6598 ThreadedVSOCKSocketStreamTest,
6599 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006600 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006601 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006602 CmsgMacroTests,
6603 SendmsgUDPTest,
6604 RecvmsgUDPTest,
6605 RecvmsgIntoUDPTest,
6606 SendmsgUDP6Test,
6607 RecvmsgUDP6Test,
6608 RecvmsgRFC3542AncillaryUDP6Test,
6609 RecvmsgIntoRFC3542AncillaryUDP6Test,
6610 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006611 SendmsgUDPLITETest,
6612 RecvmsgUDPLITETest,
6613 RecvmsgIntoUDPLITETest,
6614 SendmsgUDPLITE6Test,
6615 RecvmsgUDPLITE6Test,
6616 RecvmsgRFC3542AncillaryUDPLITE6Test,
6617 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6618 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006619 SendmsgTCPTest,
6620 RecvmsgTCPTest,
6621 RecvmsgIntoTCPTest,
6622 SendmsgSCTPStreamTest,
6623 RecvmsgSCTPStreamTest,
6624 RecvmsgIntoSCTPStreamTest,
6625 SendmsgUnixStreamTest,
6626 RecvmsgUnixStreamTest,
6627 RecvmsgIntoUnixStreamTest,
6628 RecvmsgSCMRightsStreamTest,
6629 RecvmsgIntoSCMRightsStreamTest,
6630 # These are slow when setitimer() is not available
6631 InterruptedRecvTimeoutTest,
6632 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006633 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006634 SendfileUsingSendTest,
6635 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006636 ])
animalize19e7d482018-02-27 02:10:36 +08006637 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006638
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006639 thread_info = support.threading_setup()
6640 support.run_unittest(*tests)
6641 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006642
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006643
Guido van Rossum24e4af82002-06-12 19:18:08 +00006644if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006645 test_main()