blob: dc1330735df108e47ba6133b13e8e27ae55f4ac9 [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 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300921 s.sendto(b'foo', None, None)
922 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300923 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300924 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300925 self.assertIn('(1 given)', str(cm.exception))
926 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300927 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300928 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300929
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000931 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100933 if socket.has_ipv6:
934 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935 socket.SOCK_STREAM
936 socket.SOCK_DGRAM
937 socket.SOCK_RAW
938 socket.SOCK_RDM
939 socket.SOCK_SEQPACKET
940 socket.SOL_SOCKET
941 socket.SO_REUSEADDR
942
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100943 def testCrucialIpProtoConstants(self):
944 socket.IPPROTO_TCP
945 socket.IPPROTO_UDP
946 if socket.has_ipv6:
947 socket.IPPROTO_IPV6
948
949 @unittest.skipUnless(os.name == "nt", "Windows specific")
950 def testWindowsSpecificConstants(self):
951 socket.IPPROTO_ICLFXBM
952 socket.IPPROTO_ST
953 socket.IPPROTO_CBT
954 socket.IPPROTO_IGP
955 socket.IPPROTO_RDP
956 socket.IPPROTO_PGM
957 socket.IPPROTO_L2TP
958 socket.IPPROTO_SCTP
959
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +0200960 @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
961 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
962 def test3542SocketOptions(self):
963 # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542
964 opts = {
965 'IPV6_CHECKSUM',
966 'IPV6_DONTFRAG',
967 'IPV6_DSTOPTS',
968 'IPV6_HOPLIMIT',
969 'IPV6_HOPOPTS',
970 'IPV6_NEXTHOP',
971 'IPV6_PATHMTU',
972 'IPV6_PKTINFO',
973 'IPV6_RECVDSTOPTS',
974 'IPV6_RECVHOPLIMIT',
975 'IPV6_RECVHOPOPTS',
976 'IPV6_RECVPATHMTU',
977 'IPV6_RECVPKTINFO',
978 'IPV6_RECVRTHDR',
979 'IPV6_RECVTCLASS',
980 'IPV6_RTHDR',
981 'IPV6_RTHDRDSTOPTS',
982 'IPV6_RTHDR_TYPE_0',
983 'IPV6_TCLASS',
984 'IPV6_USE_MIN_MTU',
985 }
986 for opt in opts:
987 self.assertTrue(
988 hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'"
989 )
990
Guido van Rossum654c11e2002-06-13 20:24:17 +0000991 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000992 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000993 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000994 try:
995 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200996 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000997 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600998 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000999 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +00001000 try:
1001 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001002 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +00001003 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001004 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +00001005 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001006 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +00001007 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001008 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001009
Charles-François Natali0cc86852013-09-13 19:53:08 +02001010 def test_host_resolution(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03001011 for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001012 self.assertEqual(socket.gethostbyname(addr), addr)
1013
Serhiy Storchaka16994912020-04-25 10:06:29 +03001014 # 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 +02001015 # a matching name entry (e.g. 'ip6-localhost')
Serhiy Storchaka16994912020-04-25 10:06:29 +03001016 for host in [socket_helper.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001017 self.assertIn(host, socket.gethostbyaddr(host)[2])
1018
Xiang Zhangd36a7162017-03-07 11:06:09 +08001019 def test_host_resolution_bad_address(self):
1020 # These are all malformed IP addresses and expected not to resolve to
1021 # any result. But some ISPs, e.g. AWS, may successfully resolve these
1022 # IPs.
1023 explanation = (
1024 "resolving an invalid IP address did not raise OSError; "
1025 "can be caused by a broken DNS server"
1026 )
1027 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
1028 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -04001029 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +08001030 socket.gethostbyname(addr)
1031 with self.assertRaises(OSError, msg=explanation):
1032 socket.gethostbyaddr(addr)
1033
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001034 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
1035 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
1036 def test_sethostname(self):
1037 oldhn = socket.gethostname()
1038 try:
1039 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001040 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001041 if e.errno == errno.EPERM:
1042 self.skipTest("test should be run as root")
1043 else:
1044 raise
1045 try:
1046 # running test as root!
1047 self.assertEqual(socket.gethostname(), 'new')
1048 # Should work with bytes objects too
1049 socket.sethostname(b'bar')
1050 self.assertEqual(socket.gethostname(), 'bar')
1051 finally:
1052 socket.sethostname(oldhn)
1053
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001054 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1055 'socket.if_nameindex() not available.')
1056 def testInterfaceNameIndex(self):
1057 interfaces = socket.if_nameindex()
1058 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001059 self.assertIsInstance(index, int)
1060 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001061 # interface indices are non-zero integers
1062 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001063 _index = socket.if_nametoindex(name)
1064 self.assertIsInstance(_index, int)
1065 self.assertEqual(index, _index)
1066 _name = socket.if_indextoname(index)
1067 self.assertIsInstance(_name, str)
1068 self.assertEqual(name, _name)
1069
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001070 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1071 'socket.if_indextoname() not available.')
1072 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001073 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001074 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001075
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001076 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1077 'socket.if_nametoindex() not available.')
1078 def testInvalidInterfaceNameToIndex(self):
1079 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1080 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1081
Serhiy Storchaka43767632013-11-03 21:31:38 +02001082 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1083 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001084 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001085 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001086 try:
1087 # On some versions, this loses a reference
1088 orig = sys.getrefcount(__name__)
1089 socket.getnameinfo(__name__,0)
1090 except TypeError:
1091 if sys.getrefcount(__name__) != orig:
1092 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001093
Guido van Rossum24e4af82002-06-12 19:18:08 +00001094 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001095 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096 try:
1097 # On some versions, this crashes the interpreter.
1098 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001099 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001100 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001101
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001102 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001103 # This just checks that htons etc. are their own inverse,
1104 # when looking at the lower 16 or 32 bits.
1105 sizes = {socket.htonl: 32, socket.ntohl: 32,
1106 socket.htons: 16, socket.ntohs: 16}
1107 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001108 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001109 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1110 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001111
Guido van Rossuma2627af2002-09-14 00:58:46 +00001112 swapped = func(mask)
1113 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001114 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001115
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001116 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001117 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001118 import _testcapi
1119 s_good_values = [0, 1, 2, 0xffff]
1120 l_good_values = s_good_values + [0xffffffff]
1121 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1122 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1123 _testcapi.INT_MAX + 1]
1124 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1125 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001126 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001127 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001128 for k in l_good_values:
1129 socket.ntohl(k)
1130 socket.htonl(k)
1131 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001132 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001133 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001134 for k in l_bad_values:
1135 self.assertRaises(OverflowError, socket.ntohl, k)
1136 self.assertRaises(OverflowError, socket.htonl, k)
1137 for k in s_deprecated_values:
1138 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1139 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001140
Barry Warsaw11b91a02004-06-28 00:50:43 +00001141 def testGetServBy(self):
1142 eq = self.assertEqual
1143 # Find one service that exists, then check all the related interfaces.
1144 # I've ordered this by protocols that have both a tcp and udp
1145 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001146 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001147 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001148 # avoid the 'echo' service on this platform, as there is an
1149 # assumption breaking non-standard port/protocol entry
1150 services = ('daytime', 'qotd', 'domain')
1151 else:
1152 services = ('echo', 'daytime', 'domain')
1153 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001154 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001155 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001156 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001157 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001158 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001159 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001160 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001161 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001162 # Issue #26936: Android getservbyname() was broken before API 23.
1163 if (not hasattr(sys, 'getandroidapilevel') or
1164 sys.getandroidapilevel() >= 23):
1165 port2 = socket.getservbyname(service)
1166 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001167 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001168 try:
1169 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001170 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001171 udpport = None
1172 else:
1173 eq(udpport, port)
1174 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001175 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001176 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001177 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001178 eq(socket.getservbyport(port, 'tcp'), service)
1179 if udpport is not None:
1180 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001181 # Make sure getservbyport does not accept out of range ports.
1182 self.assertRaises(OverflowError, socket.getservbyport, -1)
1183 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001184
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001185 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001186 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001187 # The default timeout should initially be None
1188 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001189 with socket.socket() as s:
1190 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001191
1192 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001193 with socket_setdefaulttimeout(10):
1194 self.assertEqual(socket.getdefaulttimeout(), 10)
1195 with socket.socket() as sock:
1196 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001197
Victor Stinner304315d2018-11-30 13:22:44 +01001198 # Reset the default timeout to None, and see if it propagates
1199 socket.setdefaulttimeout(None)
1200 self.assertEqual(socket.getdefaulttimeout(), None)
1201 with socket.socket() as sock:
1202 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001203
1204 # Check that setting it to an invalid value raises ValueError
1205 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1206
1207 # Check that setting it to an invalid type raises TypeError
1208 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1209
Serhiy Storchaka43767632013-11-03 21:31:38 +02001210 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1211 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001212 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001213 # Test that issue1008086 and issue767150 are fixed.
1214 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001215 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1216 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001217
Serhiy Storchaka43767632013-11-03 21:31:38 +02001218 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1219 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001220 def testIPv4toString(self):
1221 from socket import inet_aton as f, inet_pton, AF_INET
1222 g = lambda a: inet_pton(AF_INET, a)
1223
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001224 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001225 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001226 )
1227
Ezio Melottib3aedd42010-11-20 19:04:17 +00001228 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1229 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1230 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1231 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1232 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001233 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001234 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001235 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001236 assertInvalid(f, '300.0.0.0')
1237 assertInvalid(f, 'a.0.0.0')
1238 assertInvalid(f, '1.2.3.4.5')
1239 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001240
Ezio Melottib3aedd42010-11-20 19:04:17 +00001241 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1242 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1243 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1244 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001245 assertInvalid(g, '0.0.0.')
1246 assertInvalid(g, '300.0.0.0')
1247 assertInvalid(g, 'a.0.0.0')
1248 assertInvalid(g, '1.2.3.4.5')
1249 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001250
Serhiy Storchaka43767632013-11-03 21:31:38 +02001251 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1252 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001253 def testIPv6toString(self):
1254 try:
1255 from socket import inet_pton, AF_INET6, has_ipv6
1256 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001257 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001258 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001259 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001260
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001261 if sys.platform == "win32":
1262 try:
1263 inet_pton(AF_INET6, '::')
1264 except OSError as e:
1265 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001266 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001267
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001268 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001269 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001270 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001271 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001272
Ezio Melottib3aedd42010-11-20 19:04:17 +00001273 self.assertEqual(b'\x00' * 16, f('::'))
1274 self.assertEqual(b'\x00' * 16, f('0::0'))
1275 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1276 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001277 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 +00001278 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1279 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001280 self.assertEqual(
1281 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1282 f('ad42:abc::127:0:254:2')
1283 )
1284 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1285 assertInvalid('0x20::')
1286 assertInvalid(':::')
1287 assertInvalid('::0::')
1288 assertInvalid('1::abc::')
1289 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001290 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001291 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001292 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001293 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001294 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001295 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001296
1297 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1298 f('::254.42.23.64')
1299 )
1300 self.assertEqual(
1301 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1302 f('42::a29b:254.42.23.64')
1303 )
1304 self.assertEqual(
1305 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1306 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1307 )
1308 assertInvalid('255.254.253.252')
1309 assertInvalid('1::260.2.3.0')
1310 assertInvalid('1::0.be.e.0')
1311 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1312 assertInvalid('::1.2.3.4:0')
1313 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001314
Serhiy Storchaka43767632013-11-03 21:31:38 +02001315 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1316 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001317 def testStringToIPv4(self):
1318 from socket import inet_ntoa as f, inet_ntop, AF_INET
1319 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001320 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001321 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001322 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001323
Ezio Melottib3aedd42010-11-20 19:04:17 +00001324 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1325 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1326 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1327 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001328 assertInvalid(f, b'\x00' * 3)
1329 assertInvalid(f, b'\x00' * 5)
1330 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001331 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001332
Ezio Melottib3aedd42010-11-20 19:04:17 +00001333 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1334 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1335 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001336 assertInvalid(g, b'\x00' * 3)
1337 assertInvalid(g, b'\x00' * 5)
1338 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001339 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001340
Serhiy Storchaka43767632013-11-03 21:31:38 +02001341 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1342 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001343 def testStringToIPv6(self):
1344 try:
1345 from socket import inet_ntop, AF_INET6, has_ipv6
1346 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001347 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001348 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001349 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001350
1351 if sys.platform == "win32":
1352 try:
1353 inet_ntop(AF_INET6, b'\x00' * 16)
1354 except OSError as e:
1355 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001356 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001357
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001358 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001359 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001360 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001361 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001362
Ezio Melottib3aedd42010-11-20 19:04:17 +00001363 self.assertEqual('::', f(b'\x00' * 16))
1364 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1365 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001366 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001367 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 +00001368 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001369 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001370
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001371 assertInvalid(b'\x12' * 15)
1372 assertInvalid(b'\x12' * 17)
1373 assertInvalid(b'\x12' * 4)
1374
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001375 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001376
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001377 def testSockName(self):
1378 # Testing getsockname()
Serhiy Storchaka16994912020-04-25 10:06:29 +03001379 port = socket_helper.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001380 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001381 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001382 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001383 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001384 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1385 # it reasonable to get the host's addr in addition to 0.0.0.0.
1386 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001387 try:
1388 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001389 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001390 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001391 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001392 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001393 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001394
1395 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001396 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001397 # We know a socket should start without reuse==0
1398 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001399 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001400 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001401 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001402
1403 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001404 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001405 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001406 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001407 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1408 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001409 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001410
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001411 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001412 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001413 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1414 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001415 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001416
Martin Panter50ab1a32016-04-11 00:38:12 +00001417 def testCloseException(self):
1418 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001419 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001420 socket.socket(fileno=sock.fileno()).close()
1421 try:
1422 sock.close()
1423 except OSError as err:
1424 # Winsock apparently raises ENOTSOCK
1425 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1426 else:
1427 self.fail("close() should raise EBADF/ENOTSOCK")
1428
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001429 def testNewAttributes(self):
1430 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001431
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001432 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1433 self.assertEqual(sock.family, socket.AF_INET)
1434 if hasattr(socket, 'SOCK_CLOEXEC'):
1435 self.assertIn(sock.type,
1436 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1437 socket.SOCK_STREAM))
1438 else:
1439 self.assertEqual(sock.type, socket.SOCK_STREAM)
1440 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001441
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001442 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001443 sock = socket.socket()
1444 self.addCleanup(sock.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001445 port = socket_helper.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001446 big_port = port + 65536
1447 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001448 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1449 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1450 # Since find_unused_port() is inherently subject to race conditions, we
1451 # call it a couple times if necessary.
1452 for i in itertools.count():
Serhiy Storchaka16994912020-04-25 10:06:29 +03001453 port = socket_helper.find_unused_port()
Charles-François Natali65708cf2014-07-25 18:44:30 +01001454 try:
1455 sock.bind((HOST, port))
1456 except OSError as e:
1457 if e.errno != errno.EADDRINUSE or i == 5:
1458 raise
1459 else:
1460 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001461
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001462 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001463 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001464 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1465 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1466 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1467 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001468 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1469 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001470 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001471 self.assertRaises(ValueError, s.ioctl, -1, None)
1472 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001473
Steve Dowerea93ac02016-06-17 12:52:18 -07001474 @unittest.skipUnless(os.name == "nt", "Windows specific")
1475 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1476 'Loopback fast path support required for this test')
1477 def test_sio_loopback_fast_path(self):
1478 s = socket.socket()
1479 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001480 try:
1481 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1482 except OSError as exc:
1483 WSAEOPNOTSUPP = 10045
1484 if exc.winerror == WSAEOPNOTSUPP:
1485 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1486 "doesn't implemented in this Windows version")
1487 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001488 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1489
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001490 def testGetaddrinfo(self):
1491 try:
1492 socket.getaddrinfo('localhost', 80)
1493 except socket.gaierror as err:
1494 if err.errno == socket.EAI_SERVICE:
1495 # see http://bugs.python.org/issue1282647
1496 self.skipTest("buggy libc version")
1497 raise
1498 # len of every sequence is supposed to be == 5
1499 for info in socket.getaddrinfo(HOST, None):
1500 self.assertEqual(len(info), 5)
1501 # host can be a domain name, a string representation of an
1502 # IPv4/v6 address or None
1503 socket.getaddrinfo('localhost', 80)
1504 socket.getaddrinfo('127.0.0.1', 80)
1505 socket.getaddrinfo(None, 80)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001506 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001507 socket.getaddrinfo('::1', 80)
1508 # port can be a string service name such as "http", a numeric
1509 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001510 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1511 if (not hasattr(sys, 'getandroidapilevel') or
1512 sys.getandroidapilevel() >= 23):
1513 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001514 socket.getaddrinfo(HOST, 80)
1515 socket.getaddrinfo(HOST, None)
1516 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001517 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1518 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001519 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001520 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1521 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001522 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001523 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1524 for _, socktype, _, _, _ in infos:
1525 self.assertEqual(socktype, socket.SOCK_STREAM)
1526 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001527 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001528 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1529 # a server willing to support both IPv4 and IPv6 will
1530 # usually do this
1531 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1532 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001533 # test keyword arguments
1534 a = socket.getaddrinfo(HOST, None)
1535 b = socket.getaddrinfo(host=HOST, port=None)
1536 self.assertEqual(a, b)
1537 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1538 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1539 self.assertEqual(a, b)
1540 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1541 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1542 self.assertEqual(a, b)
1543 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1544 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1545 self.assertEqual(a, b)
1546 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1547 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1548 self.assertEqual(a, b)
1549 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1550 socket.AI_PASSIVE)
1551 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1552 type=socket.SOCK_STREAM, proto=0,
1553 flags=socket.AI_PASSIVE)
1554 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001555 # Issue #6697.
1556 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001557
Ned Deilyb24f4812014-02-13 22:50:42 -08001558 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001559 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001560 try:
1561 # The arguments here are undefined and the call may succeed
1562 # or fail. All we care here is that it doesn't segfault.
1563 socket.getaddrinfo("localhost", None, 0, 0, 0,
1564 socket.AI_NUMERICSERV)
1565 except socket.gaierror:
1566 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001567
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001568 def test_getnameinfo(self):
1569 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001570 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001571
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001572 @unittest.skipUnless(support.is_resource_enabled('network'),
1573 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001574 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001575 # Check for internet access before running test
1576 # (issue #12804, issue #25138).
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03001577 with socket_helper.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001578 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001579
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001580 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001581 domain = 'испытание.pythontest.net'
1582 socket.gethostbyname(domain)
1583 socket.gethostbyname_ex(domain)
1584 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001585 # 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 +00001586 # have a reverse entry yet
1587 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001588
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001589 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001590 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001591 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1592 self.skipTest("signal.alarm and socket.socketpair required for this test")
1593 # Our signal handlers clobber the C errno by calling a math function
1594 # with an invalid domain value.
1595 def ok_handler(*args):
1596 self.assertRaises(ValueError, math.acosh, 0)
1597 def raising_handler(*args):
1598 self.assertRaises(ValueError, math.acosh, 0)
1599 1 // 0
1600 c, s = socket.socketpair()
1601 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1602 try:
1603 if with_timeout:
1604 # Just above the one second minimum for signal.alarm
1605 c.settimeout(1.5)
1606 with self.assertRaises(ZeroDivisionError):
1607 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001608 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001609 if with_timeout:
1610 signal.signal(signal.SIGALRM, ok_handler)
1611 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001612 self.assertRaises(socket.timeout, c.sendall,
1613 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001614 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001615 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001616 signal.signal(signal.SIGALRM, old_alarm)
1617 c.close()
1618 s.close()
1619
1620 def test_sendall_interrupted(self):
1621 self.check_sendall_interrupted(False)
1622
1623 def test_sendall_interrupted_with_timeout(self):
1624 self.check_sendall_interrupted(True)
1625
Antoine Pitroue033e062010-10-29 10:38:18 +00001626 def test_dealloc_warn(self):
1627 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1628 r = repr(sock)
1629 with self.assertWarns(ResourceWarning) as cm:
1630 sock = None
1631 support.gc_collect()
1632 self.assertIn(r, str(cm.warning.args[0]))
1633 # An open socket file object gets dereferenced after the socket
1634 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1635 f = sock.makefile('rb')
1636 r = repr(sock)
1637 sock = None
1638 support.gc_collect()
1639 with self.assertWarns(ResourceWarning):
1640 f = None
1641 support.gc_collect()
1642
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001643 def test_name_closed_socketio(self):
1644 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1645 fp = sock.makefile("rb")
1646 fp.close()
1647 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1648
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001649 def test_unusable_closed_socketio(self):
1650 with socket.socket() as sock:
1651 fp = sock.makefile("rb", buffering=0)
1652 self.assertTrue(fp.readable())
1653 self.assertFalse(fp.writable())
1654 self.assertFalse(fp.seekable())
1655 fp.close()
1656 self.assertRaises(ValueError, fp.readable)
1657 self.assertRaises(ValueError, fp.writable)
1658 self.assertRaises(ValueError, fp.seekable)
1659
Christian Heimesd0e31b92018-01-27 09:54:13 +01001660 def test_socket_close(self):
1661 sock = socket.socket()
1662 try:
1663 sock.bind((HOST, 0))
1664 socket.close(sock.fileno())
1665 with self.assertRaises(OSError):
1666 sock.listen(1)
1667 finally:
1668 with self.assertRaises(OSError):
1669 # sock.close() fails with EBADF
1670 sock.close()
1671 with self.assertRaises(TypeError):
1672 socket.close(None)
1673 with self.assertRaises(OSError):
1674 socket.close(-1)
1675
Berker Peksag3fe64d02016-02-18 17:34:00 +02001676 def test_makefile_mode(self):
1677 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1678 with self.subTest(mode=mode):
1679 with socket.socket() as sock:
1680 with sock.makefile(mode) as fp:
1681 self.assertEqual(fp.mode, mode)
1682
1683 def test_makefile_invalid_mode(self):
1684 for mode in 'rt', 'x', '+', 'a':
1685 with self.subTest(mode=mode):
1686 with socket.socket() as sock:
1687 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1688 sock.makefile(mode)
1689
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001690 def test_pickle(self):
1691 sock = socket.socket()
1692 with sock:
1693 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1694 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001695 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1696 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1697 self.assertEqual(family, socket.AF_INET)
1698 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1699 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001700
Serhiy Storchaka78980432013-01-15 01:12:17 +02001701 def test_listen_backlog(self):
1702 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001703 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1704 srv.bind((HOST, 0))
1705 srv.listen(backlog)
1706
1707 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001708 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001709 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001710
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001711 @support.cpython_only
1712 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001713 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001714 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001715 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1716 srv.bind((HOST, 0))
1717 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001718
Serhiy Storchaka16994912020-04-25 10:06:29 +03001719 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001720 def test_flowinfo(self):
1721 self.assertRaises(OverflowError, socket.getnameinfo,
Serhiy Storchaka16994912020-04-25 10:06:29 +03001722 (socket_helper.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001723 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03001724 self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001725
Serhiy Storchaka16994912020-04-25 10:06:29 +03001726 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001727 def test_getaddrinfo_ipv6_basic(self):
1728 ((*_, sockaddr),) = socket.getaddrinfo(
1729 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1730 1234, socket.AF_INET6,
1731 socket.SOCK_DGRAM,
1732 socket.IPPROTO_UDP
1733 )
1734 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1735
Serhiy Storchaka16994912020-04-25 10:06:29 +03001736 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001737 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001738 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001739 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1740 # Just pick up any network interface (Linux, Mac OS X)
1741 (ifindex, test_interface) = socket.if_nameindex()[0]
1742 ((*_, sockaddr),) = socket.getaddrinfo(
1743 'ff02::1de:c0:face:8D%' + test_interface,
1744 1234, socket.AF_INET6,
1745 socket.SOCK_DGRAM,
1746 socket.IPPROTO_UDP
1747 )
1748 # Note missing interface name part in IPv6 address
1749 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1750
Serhiy Storchaka16994912020-04-25 10:06:29 +03001751 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001752 @unittest.skipUnless(
1753 sys.platform == 'win32',
1754 'Numeric scope id does not work or undocumented')
1755 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1756 # Also works on Linux and Mac OS X, but is not documented (?)
1757 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1758 ifindex = 42
1759 ((*_, sockaddr),) = socket.getaddrinfo(
1760 'ff02::1de:c0:face:8D%' + str(ifindex),
1761 1234, socket.AF_INET6,
1762 socket.SOCK_DGRAM,
1763 socket.IPPROTO_UDP
1764 )
1765 # Note missing interface name part in IPv6 address
1766 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1767
Serhiy Storchaka16994912020-04-25 10:06:29 +03001768 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001769 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001770 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001771 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1772 # Just pick up any network interface.
1773 (ifindex, test_interface) = socket.if_nameindex()[0]
1774 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1775 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1776 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1777
Serhiy Storchaka16994912020-04-25 10:06:29 +03001778 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001779 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001780 'Numeric scope id does not work or undocumented')
1781 def test_getnameinfo_ipv6_scopeid_numeric(self):
1782 # Also works on Linux (undocumented), but does not work on Mac OS X
1783 # Windows and Linux allow nonexistent interface numbers here.
1784 ifindex = 42
1785 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1786 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1787 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1788
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001789 def test_str_for_enums(self):
1790 # Make sure that the AF_* and SOCK_* constants have enum-like string
1791 # reprs.
1792 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1793 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001794 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001795
Yury Selivanov98181422017-12-18 20:02:54 -05001796 def test_socket_consistent_sock_type(self):
1797 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1798 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1799 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1800
1801 with socket.socket(socket.AF_INET, sock_type) as s:
1802 self.assertEqual(s.type, socket.SOCK_STREAM)
1803 s.settimeout(1)
1804 self.assertEqual(s.type, socket.SOCK_STREAM)
1805 s.settimeout(0)
1806 self.assertEqual(s.type, socket.SOCK_STREAM)
1807 s.setblocking(True)
1808 self.assertEqual(s.type, socket.SOCK_STREAM)
1809 s.setblocking(False)
1810 self.assertEqual(s.type, socket.SOCK_STREAM)
1811
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001812 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001813 # Test that when created with a family that's not one of the known
1814 # AF_*/SOCK_* constants, socket.family just returns the number.
1815 #
1816 # To do this we fool socket.socket into believing it already has an
1817 # open fd because on this path it doesn't actually verify the family and
1818 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001819 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1820 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001821 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1822
1823 unknown_type = max(
1824 kind
1825 for name, kind in socket.SocketKind.__members__.items()
1826 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1827 ) + 1
1828
1829 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001830 family=unknown_family, type=unknown_type, proto=23,
1831 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001832 self.assertEqual(s.family, unknown_family)
1833 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001834 # some OS like macOS ignore proto
1835 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001836
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001837 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1838 def test__sendfile_use_sendfile(self):
1839 class File:
1840 def __init__(self, fd):
1841 self.fd = fd
1842
1843 def fileno(self):
1844 return self.fd
1845 with socket.socket() as sock:
1846 fd = os.open(os.curdir, os.O_RDONLY)
1847 os.close(fd)
1848 with self.assertRaises(socket._GiveupOnSendfile):
1849 sock._sendfile_use_sendfile(File(fd))
1850 with self.assertRaises(OverflowError):
1851 sock._sendfile_use_sendfile(File(2**1000))
1852 with self.assertRaises(TypeError):
1853 sock._sendfile_use_sendfile(File(None))
1854
Christian Heimesb6e43af2018-01-29 22:37:58 +01001855 def _test_socket_fileno(self, s, family, stype):
1856 self.assertEqual(s.family, family)
1857 self.assertEqual(s.type, stype)
1858
1859 fd = s.fileno()
1860 s2 = socket.socket(fileno=fd)
1861 self.addCleanup(s2.close)
1862 # detach old fd to avoid double close
1863 s.detach()
1864 self.assertEqual(s2.family, family)
1865 self.assertEqual(s2.type, stype)
1866 self.assertEqual(s2.fileno(), fd)
1867
1868 def test_socket_fileno(self):
1869 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1870 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001871 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001872 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1873
1874 if hasattr(socket, "SOCK_DGRAM"):
1875 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1876 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001877 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001878 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1879
Serhiy Storchaka16994912020-04-25 10:06:29 +03001880 if socket_helper.IPV6_ENABLED:
Christian Heimesb6e43af2018-01-29 22:37:58 +01001881 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1882 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001883 s.bind((socket_helper.HOSTv6, 0, 0, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001884 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1885
1886 if hasattr(socket, "AF_UNIX"):
1887 tmpdir = tempfile.mkdtemp()
1888 self.addCleanup(shutil.rmtree, tmpdir)
1889 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1890 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001891 try:
1892 s.bind(os.path.join(tmpdir, 'socket'))
1893 except PermissionError:
1894 pass
1895 else:
1896 self._test_socket_fileno(s, socket.AF_UNIX,
1897 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001898
Dima Tisneke9912702018-12-17 22:07:55 +09001899 def test_socket_fileno_rejects_float(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001900 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001901 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1902
1903 def test_socket_fileno_rejects_other_types(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001904 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001905 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1906
1907 def test_socket_fileno_rejects_invalid_socket(self):
1908 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1909 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1910
1911 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1912 def test_socket_fileno_rejects_negative(self):
1913 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1914 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1915
1916 def test_socket_fileno_requires_valid_fd(self):
1917 WSAENOTSOCK = 10038
1918 with self.assertRaises(OSError) as cm:
1919 socket.socket(fileno=support.make_bad_fd())
1920 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1921
1922 with self.assertRaises(OSError) as cm:
1923 socket.socket(
1924 socket.AF_INET,
1925 socket.SOCK_STREAM,
1926 fileno=support.make_bad_fd())
1927 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1928
1929 def test_socket_fileno_requires_socket_fd(self):
1930 with tempfile.NamedTemporaryFile() as afile:
1931 with self.assertRaises(OSError):
1932 socket.socket(fileno=afile.fileno())
1933
1934 with self.assertRaises(OSError) as cm:
1935 socket.socket(
1936 socket.AF_INET,
1937 socket.SOCK_STREAM,
1938 fileno=afile.fileno())
1939 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1940
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001941
Charles-François Natali47413c12011-10-06 19:47:44 +02001942@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1943class BasicCANTest(unittest.TestCase):
1944
1945 def testCrucialConstants(self):
1946 socket.AF_CAN
1947 socket.PF_CAN
1948 socket.CAN_RAW
1949
Charles-François Natali773e42d2013-02-05 19:42:01 +01001950 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1951 'socket.CAN_BCM required for this test.')
1952 def testBCMConstants(self):
1953 socket.CAN_BCM
1954
1955 # opcodes
1956 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1957 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1958 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1959 socket.CAN_BCM_TX_SEND # send one CAN frame
1960 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1961 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1962 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1963 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1964 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1965 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1966 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1967 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1968
karl ding31c4fd22019-07-31 01:47:16 -07001969 # flags
1970 socket.CAN_BCM_SETTIMER
1971 socket.CAN_BCM_STARTTIMER
1972 socket.CAN_BCM_TX_COUNTEVT
1973 socket.CAN_BCM_TX_ANNOUNCE
1974 socket.CAN_BCM_TX_CP_CAN_ID
1975 socket.CAN_BCM_RX_FILTER_ID
1976 socket.CAN_BCM_RX_CHECK_DLC
1977 socket.CAN_BCM_RX_NO_AUTOTIMER
1978 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1979 socket.CAN_BCM_TX_RESET_MULTI_IDX
1980 socket.CAN_BCM_RX_RTR_FRAME
1981
Charles-François Natali47413c12011-10-06 19:47:44 +02001982 def testCreateSocket(self):
1983 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1984 pass
1985
Charles-François Natali773e42d2013-02-05 19:42:01 +01001986 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1987 'socket.CAN_BCM required for this test.')
1988 def testCreateBCMSocket(self):
1989 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1990 pass
1991
Charles-François Natali47413c12011-10-06 19:47:44 +02001992 def testBindAny(self):
1993 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001994 address = ('', )
1995 s.bind(address)
1996 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001997
1998 def testTooLongInterfaceName(self):
1999 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2000 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002001 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02002002 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02002003
2004 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
2005 'socket.CAN_RAW_LOOPBACK required for this test.')
2006 def testLoopback(self):
2007 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2008 for loopback in (0, 1):
2009 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
2010 loopback)
2011 self.assertEqual(loopback,
2012 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
2013
2014 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
2015 'socket.CAN_RAW_FILTER required for this test.')
2016 def testFilter(self):
2017 can_id, can_mask = 0x200, 0x700
2018 can_filter = struct.pack("=II", can_id, can_mask)
2019 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2020 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
2021 self.assertEqual(can_filter,
2022 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002023 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02002024
2025
2026@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02002027class CANTest(ThreadedCANSocketTest):
2028
Charles-François Natali47413c12011-10-06 19:47:44 +02002029 def __init__(self, methodName='runTest'):
2030 ThreadedCANSocketTest.__init__(self, methodName=methodName)
2031
2032 @classmethod
2033 def build_can_frame(cls, can_id, data):
2034 """Build a CAN frame."""
2035 can_dlc = len(data)
2036 data = data.ljust(8, b'\x00')
2037 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2038
2039 @classmethod
2040 def dissect_can_frame(cls, frame):
2041 """Dissect a CAN frame."""
2042 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2043 return (can_id, can_dlc, data[:can_dlc])
2044
2045 def testSendFrame(self):
2046 cf, addr = self.s.recvfrom(self.bufsize)
2047 self.assertEqual(self.cf, cf)
2048 self.assertEqual(addr[0], self.interface)
2049 self.assertEqual(addr[1], socket.AF_CAN)
2050
2051 def _testSendFrame(self):
2052 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2053 self.cli.send(self.cf)
2054
2055 def testSendMaxFrame(self):
2056 cf, addr = self.s.recvfrom(self.bufsize)
2057 self.assertEqual(self.cf, cf)
2058
2059 def _testSendMaxFrame(self):
2060 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2061 self.cli.send(self.cf)
2062
2063 def testSendMultiFrames(self):
2064 cf, addr = self.s.recvfrom(self.bufsize)
2065 self.assertEqual(self.cf1, cf)
2066
2067 cf, addr = self.s.recvfrom(self.bufsize)
2068 self.assertEqual(self.cf2, cf)
2069
2070 def _testSendMultiFrames(self):
2071 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2072 self.cli.send(self.cf1)
2073
2074 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2075 self.cli.send(self.cf2)
2076
Charles-François Natali773e42d2013-02-05 19:42:01 +01002077 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2078 'socket.CAN_BCM required for this test.')
2079 def _testBCM(self):
2080 cf, addr = self.cli.recvfrom(self.bufsize)
2081 self.assertEqual(self.cf, cf)
2082 can_id, can_dlc, data = self.dissect_can_frame(cf)
2083 self.assertEqual(self.can_id, can_id)
2084 self.assertEqual(self.data, data)
2085
2086 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2087 'socket.CAN_BCM required for this test.')
2088 def testBCM(self):
2089 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2090 self.addCleanup(bcm.close)
2091 bcm.connect((self.interface,))
2092 self.can_id = 0x123
2093 self.data = bytes([0xc0, 0xff, 0xee])
2094 self.cf = self.build_can_frame(self.can_id, self.data)
2095 opcode = socket.CAN_BCM_TX_SEND
2096 flags = 0
2097 count = 0
2098 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2099 bcm_can_id = 0x0222
2100 nframes = 1
2101 assert len(self.cf) == 16
2102 header = struct.pack(self.bcm_cmd_msg_fmt,
2103 opcode,
2104 flags,
2105 count,
2106 ival1_seconds,
2107 ival1_usec,
2108 ival2_seconds,
2109 ival2_usec,
2110 bcm_can_id,
2111 nframes,
2112 )
2113 header_plus_frame = header + self.cf
2114 bytes_sent = bcm.send(header_plus_frame)
2115 self.assertEqual(bytes_sent, len(header_plus_frame))
2116
Charles-François Natali47413c12011-10-06 19:47:44 +02002117
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002118@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2119class ISOTPTest(unittest.TestCase):
2120
2121 def __init__(self, *args, **kwargs):
2122 super().__init__(*args, **kwargs)
2123 self.interface = "vcan0"
2124
2125 def testCrucialConstants(self):
2126 socket.AF_CAN
2127 socket.PF_CAN
2128 socket.CAN_ISOTP
2129 socket.SOCK_DGRAM
2130
2131 def testCreateSocket(self):
2132 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2133 pass
2134
2135 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2136 'socket.CAN_ISOTP required for this test.')
2137 def testCreateISOTPSocket(self):
2138 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2139 pass
2140
2141 def testTooLongInterfaceName(self):
2142 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2143 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2144 with self.assertRaisesRegex(OSError, 'interface name too long'):
2145 s.bind(('x' * 1024, 1, 2))
2146
2147 def testBind(self):
2148 try:
2149 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2150 addr = self.interface, 0x123, 0x456
2151 s.bind(addr)
2152 self.assertEqual(s.getsockname(), addr)
2153 except OSError as e:
2154 if e.errno == errno.ENODEV:
2155 self.skipTest('network interface `%s` does not exist' %
2156 self.interface)
2157 else:
2158 raise
2159
2160
karl ding360371f2020-04-29 15:31:19 -07002161@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2162class J1939Test(unittest.TestCase):
2163
2164 def __init__(self, *args, **kwargs):
2165 super().__init__(*args, **kwargs)
2166 self.interface = "vcan0"
2167
2168 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2169 'socket.CAN_J1939 required for this test.')
2170 def testJ1939Constants(self):
2171 socket.CAN_J1939
2172
2173 socket.J1939_MAX_UNICAST_ADDR
2174 socket.J1939_IDLE_ADDR
2175 socket.J1939_NO_ADDR
2176 socket.J1939_NO_NAME
2177 socket.J1939_PGN_REQUEST
2178 socket.J1939_PGN_ADDRESS_CLAIMED
2179 socket.J1939_PGN_ADDRESS_COMMANDED
2180 socket.J1939_PGN_PDU1_MAX
2181 socket.J1939_PGN_MAX
2182 socket.J1939_NO_PGN
2183
2184 # J1939 socket options
2185 socket.SO_J1939_FILTER
2186 socket.SO_J1939_PROMISC
2187 socket.SO_J1939_SEND_PRIO
2188 socket.SO_J1939_ERRQUEUE
2189
2190 socket.SCM_J1939_DEST_ADDR
2191 socket.SCM_J1939_DEST_NAME
2192 socket.SCM_J1939_PRIO
2193 socket.SCM_J1939_ERRQUEUE
2194
2195 socket.J1939_NLA_PAD
2196 socket.J1939_NLA_BYTES_ACKED
2197
2198 socket.J1939_EE_INFO_NONE
2199 socket.J1939_EE_INFO_TX_ABORT
2200
2201 socket.J1939_FILTER_MAX
2202
2203 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2204 'socket.CAN_J1939 required for this test.')
2205 def testCreateJ1939Socket(self):
2206 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2207 pass
2208
2209 def testBind(self):
2210 try:
2211 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2212 addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2213 s.bind(addr)
2214 self.assertEqual(s.getsockname(), addr)
2215 except OSError as e:
2216 if e.errno == errno.ENODEV:
2217 self.skipTest('network interface `%s` does not exist' %
2218 self.interface)
2219 else:
2220 raise
2221
2222
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002223@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2224class BasicRDSTest(unittest.TestCase):
2225
2226 def testCrucialConstants(self):
2227 socket.AF_RDS
2228 socket.PF_RDS
2229
2230 def testCreateSocket(self):
2231 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2232 pass
2233
2234 def testSocketBufferSize(self):
2235 bufsize = 16384
2236 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2237 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2238 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2239
2240
2241@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002242class RDSTest(ThreadedRDSSocketTest):
2243
2244 def __init__(self, methodName='runTest'):
2245 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2246
Charles-François Natali240c55f2011-11-10 20:33:36 +01002247 def setUp(self):
2248 super().setUp()
2249 self.evt = threading.Event()
2250
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002251 def testSendAndRecv(self):
2252 data, addr = self.serv.recvfrom(self.bufsize)
2253 self.assertEqual(self.data, data)
2254 self.assertEqual(self.cli_addr, addr)
2255
2256 def _testSendAndRecv(self):
2257 self.data = b'spam'
2258 self.cli.sendto(self.data, 0, (HOST, self.port))
2259
2260 def testPeek(self):
2261 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2262 self.assertEqual(self.data, data)
2263 data, addr = self.serv.recvfrom(self.bufsize)
2264 self.assertEqual(self.data, data)
2265
2266 def _testPeek(self):
2267 self.data = b'spam'
2268 self.cli.sendto(self.data, 0, (HOST, self.port))
2269
2270 @requireAttrs(socket.socket, 'recvmsg')
2271 def testSendAndRecvMsg(self):
2272 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2273 self.assertEqual(self.data, data)
2274
2275 @requireAttrs(socket.socket, 'sendmsg')
2276 def _testSendAndRecvMsg(self):
2277 self.data = b'hello ' * 10
2278 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2279
2280 def testSendAndRecvMulti(self):
2281 data, addr = self.serv.recvfrom(self.bufsize)
2282 self.assertEqual(self.data1, data)
2283
2284 data, addr = self.serv.recvfrom(self.bufsize)
2285 self.assertEqual(self.data2, data)
2286
2287 def _testSendAndRecvMulti(self):
2288 self.data1 = b'bacon'
2289 self.cli.sendto(self.data1, 0, (HOST, self.port))
2290
2291 self.data2 = b'egg'
2292 self.cli.sendto(self.data2, 0, (HOST, self.port))
2293
2294 def testSelect(self):
2295 r, w, x = select.select([self.serv], [], [], 3.0)
2296 self.assertIn(self.serv, r)
2297 data, addr = self.serv.recvfrom(self.bufsize)
2298 self.assertEqual(self.data, data)
2299
2300 def _testSelect(self):
2301 self.data = b'select'
2302 self.cli.sendto(self.data, 0, (HOST, self.port))
2303
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002304@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2305 'QIPCRTR sockets required for this test.')
2306class BasicQIPCRTRTest(unittest.TestCase):
2307
2308 def testCrucialConstants(self):
2309 socket.AF_QIPCRTR
2310
2311 def testCreateSocket(self):
2312 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2313 pass
2314
2315 def testUnbound(self):
2316 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2317 self.assertEqual(s.getsockname()[1], 0)
2318
2319 def testBindSock(self):
2320 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002321 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002322 self.assertNotEqual(s.getsockname()[1], 0)
2323
2324 def testInvalidBindSock(self):
2325 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002326 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002327
2328 def testAutoBindSock(self):
2329 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2330 s.connect((123, 123))
2331 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002332
caaveryeffc12f2017-09-06 18:18:10 -04002333@unittest.skipIf(fcntl is None, "need fcntl")
2334@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2335 'VSOCK sockets required for this test.')
2336class BasicVSOCKTest(unittest.TestCase):
2337
2338 def testCrucialConstants(self):
2339 socket.AF_VSOCK
2340
2341 def testVSOCKConstants(self):
2342 socket.SO_VM_SOCKETS_BUFFER_SIZE
2343 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2344 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2345 socket.VMADDR_CID_ANY
2346 socket.VMADDR_PORT_ANY
2347 socket.VMADDR_CID_HOST
2348 socket.VM_SOCKETS_INVALID_VERSION
2349 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2350
2351 def testCreateSocket(self):
2352 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2353 pass
2354
2355 def testSocketBufferSize(self):
2356 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2357 orig_max = s.getsockopt(socket.AF_VSOCK,
2358 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2359 orig = s.getsockopt(socket.AF_VSOCK,
2360 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2361 orig_min = s.getsockopt(socket.AF_VSOCK,
2362 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2363
2364 s.setsockopt(socket.AF_VSOCK,
2365 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2366 s.setsockopt(socket.AF_VSOCK,
2367 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2368 s.setsockopt(socket.AF_VSOCK,
2369 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2370
2371 self.assertEqual(orig_max * 2,
2372 s.getsockopt(socket.AF_VSOCK,
2373 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2374 self.assertEqual(orig * 2,
2375 s.getsockopt(socket.AF_VSOCK,
2376 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2377 self.assertEqual(orig_min * 2,
2378 s.getsockopt(socket.AF_VSOCK,
2379 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2380
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002381
Greg Bowser8fbece12019-08-02 16:29:52 -04002382@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2383 'Bluetooth sockets required for this test.')
2384class BasicBluetoothTest(unittest.TestCase):
2385
2386 def testBluetoothConstants(self):
2387 socket.BDADDR_ANY
2388 socket.BDADDR_LOCAL
2389 socket.AF_BLUETOOTH
2390 socket.BTPROTO_RFCOMM
2391
2392 if sys.platform != "win32":
2393 socket.BTPROTO_HCI
2394 socket.SOL_HCI
2395 socket.BTPROTO_L2CAP
2396
2397 if not sys.platform.startswith("freebsd"):
2398 socket.BTPROTO_SCO
2399
2400 def testCreateRfcommSocket(self):
2401 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2402 pass
2403
2404 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2405 def testCreateL2capSocket(self):
2406 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2407 pass
2408
2409 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2410 def testCreateHciSocket(self):
2411 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2412 pass
2413
2414 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2415 "windows and freebsd do not support SCO sockets")
2416 def testCreateScoSocket(self):
2417 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2418 pass
2419
2420
Guido van Rossum24e4af82002-06-12 19:18:08 +00002421class BasicTCPTest(SocketConnectedTest):
2422
2423 def __init__(self, methodName='runTest'):
2424 SocketConnectedTest.__init__(self, methodName=methodName)
2425
2426 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002427 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002428 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002429 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002430
2431 def _testRecv(self):
2432 self.serv_conn.send(MSG)
2433
2434 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002435 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002436 seg1 = self.cli_conn.recv(len(MSG) - 3)
2437 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002438 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002439 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002440
2441 def _testOverFlowRecv(self):
2442 self.serv_conn.send(MSG)
2443
2444 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002445 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002446 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002447 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002448
2449 def _testRecvFrom(self):
2450 self.serv_conn.send(MSG)
2451
2452 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002453 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002454 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2455 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002456 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002457 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002458
2459 def _testOverFlowRecvFrom(self):
2460 self.serv_conn.send(MSG)
2461
2462 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002463 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002464 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002465 while 1:
2466 read = self.cli_conn.recv(1024)
2467 if not read:
2468 break
Guido van Rossume531e292002-08-08 20:28:34 +00002469 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002470 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002471
2472 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002473 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002474 self.serv_conn.sendall(big_chunk)
2475
2476 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002477 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002478 fd = self.cli_conn.fileno()
2479 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002480 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002481 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002482 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002483 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002484
2485 def _testFromFd(self):
2486 self.serv_conn.send(MSG)
2487
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002488 def testDup(self):
2489 # Testing dup()
2490 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002491 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002492 msg = sock.recv(1024)
2493 self.assertEqual(msg, MSG)
2494
2495 def _testDup(self):
2496 self.serv_conn.send(MSG)
2497
Guido van Rossum24e4af82002-06-12 19:18:08 +00002498 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002499 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002500 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002501 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002502 # wait for _testShutdown to finish: on OS X, when the server
2503 # closes the connection the client also becomes disconnected,
2504 # and the client's shutdown call will fail. (Issue #4397.)
2505 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002506
2507 def _testShutdown(self):
2508 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002509 self.serv_conn.shutdown(2)
2510
2511 testShutdown_overflow = support.cpython_only(testShutdown)
2512
2513 @support.cpython_only
2514 def _testShutdown_overflow(self):
2515 import _testcapi
2516 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002517 # Issue 15989
2518 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2519 _testcapi.INT_MAX + 1)
2520 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2521 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002522 self.serv_conn.shutdown(2)
2523
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002524 def testDetach(self):
2525 # Testing detach()
2526 fileno = self.cli_conn.fileno()
2527 f = self.cli_conn.detach()
2528 self.assertEqual(f, fileno)
2529 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002530 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002531 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002532 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002533 # ...but we can create another socket using the (still open)
2534 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002535 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002536 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002537 msg = sock.recv(1024)
2538 self.assertEqual(msg, MSG)
2539
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002540 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002541 self.serv_conn.send(MSG)
2542
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002543
Guido van Rossum24e4af82002-06-12 19:18:08 +00002544class BasicUDPTest(ThreadedUDPSocketTest):
2545
2546 def __init__(self, methodName='runTest'):
2547 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2548
2549 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002550 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002551 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002552 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002553
2554 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002555 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002556
Guido van Rossum1c938012002-06-12 21:17:20 +00002557 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002558 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002559 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002560 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002561
Guido van Rossum1c938012002-06-12 21:17:20 +00002562 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002563 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002564
Guido van Rossumd8faa362007-04-27 19:54:29 +00002565 def testRecvFromNegative(self):
2566 # Negative lengths passed to recvfrom should give ValueError.
2567 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2568
2569 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002570 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002571
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002572
2573@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2574 'UDPLITE sockets required for this test.')
2575class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2576
2577 def __init__(self, methodName='runTest'):
2578 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2579
2580 def testSendtoAndRecv(self):
2581 # Testing sendto() and Recv() over UDPLITE
2582 msg = self.serv.recv(len(MSG))
2583 self.assertEqual(msg, MSG)
2584
2585 def _testSendtoAndRecv(self):
2586 self.cli.sendto(MSG, 0, (HOST, self.port))
2587
2588 def testRecvFrom(self):
2589 # Testing recvfrom() over UDPLITE
2590 msg, addr = self.serv.recvfrom(len(MSG))
2591 self.assertEqual(msg, MSG)
2592
2593 def _testRecvFrom(self):
2594 self.cli.sendto(MSG, 0, (HOST, self.port))
2595
2596 def testRecvFromNegative(self):
2597 # Negative lengths passed to recvfrom should give ValueError.
2598 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2599
2600 def _testRecvFromNegative(self):
2601 self.cli.sendto(MSG, 0, (HOST, self.port))
2602
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002603# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2604# same test code is used with different families and types of socket
2605# (e.g. stream, datagram), and tests using recvmsg() are repeated
2606# using recvmsg_into().
2607#
2608# The generic test classes such as SendmsgTests and
2609# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2610# supplied with sockets cli_sock and serv_sock representing the
2611# client's and the server's end of the connection respectively, and
2612# attributes cli_addr and serv_addr holding their (numeric where
2613# appropriate) addresses.
2614#
2615# The final concrete test classes combine these with subclasses of
2616# SocketTestBase which set up client and server sockets of a specific
2617# type, and with subclasses of SendrecvmsgBase such as
2618# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2619# sockets to cli_sock and serv_sock and override the methods and
2620# attributes of SendrecvmsgBase to fill in destination addresses if
2621# needed when sending, check for specific flags in msg_flags, etc.
2622#
2623# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2624# recvmsg_into().
2625
2626# XXX: like the other datagram (UDP) tests in this module, the code
2627# here assumes that datagram delivery on the local machine will be
2628# reliable.
2629
2630class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2631 # Base class for sendmsg()/recvmsg() tests.
2632
2633 # Time in seconds to wait before considering a test failed, or
2634 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002635 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002636
2637 def setUp(self):
2638 self.misc_event = threading.Event()
2639 super().setUp()
2640
2641 def sendToServer(self, msg):
2642 # Send msg to the server.
2643 return self.cli_sock.send(msg)
2644
2645 # Tuple of alternative default arguments for sendmsg() when called
2646 # via sendmsgToServer() (e.g. to include a destination address).
2647 sendmsg_to_server_defaults = ()
2648
2649 def sendmsgToServer(self, *args):
2650 # Call sendmsg() on self.cli_sock with the given arguments,
2651 # filling in any arguments which are not supplied with the
2652 # corresponding items of self.sendmsg_to_server_defaults, if
2653 # any.
2654 return self.cli_sock.sendmsg(
2655 *(args + self.sendmsg_to_server_defaults[len(args):]))
2656
2657 def doRecvmsg(self, sock, bufsize, *args):
2658 # Call recvmsg() on sock with given arguments and return its
2659 # result. Should be used for tests which can use either
2660 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2661 # this method with one which emulates it using recvmsg_into(),
2662 # thus allowing the same test to be used for both methods.
2663 result = sock.recvmsg(bufsize, *args)
2664 self.registerRecvmsgResult(result)
2665 return result
2666
2667 def registerRecvmsgResult(self, result):
2668 # Called by doRecvmsg() with the return value of recvmsg() or
2669 # recvmsg_into(). Can be overridden to arrange cleanup based
2670 # on the returned ancillary data, for instance.
2671 pass
2672
2673 def checkRecvmsgAddress(self, addr1, addr2):
2674 # Called to compare the received address with the address of
2675 # the peer.
2676 self.assertEqual(addr1, addr2)
2677
2678 # Flags that are normally unset in msg_flags
2679 msg_flags_common_unset = 0
2680 for name in ("MSG_CTRUNC", "MSG_OOB"):
2681 msg_flags_common_unset |= getattr(socket, name, 0)
2682
2683 # Flags that are normally set
2684 msg_flags_common_set = 0
2685
2686 # Flags set when a complete record has been received (e.g. MSG_EOR
2687 # for SCTP)
2688 msg_flags_eor_indicator = 0
2689
2690 # Flags set when a complete record has not been received
2691 # (e.g. MSG_TRUNC for datagram sockets)
2692 msg_flags_non_eor_indicator = 0
2693
2694 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2695 # Method to check the value of msg_flags returned by recvmsg[_into]().
2696 #
2697 # Checks that all bits in msg_flags_common_set attribute are
2698 # set in "flags" and all bits in msg_flags_common_unset are
2699 # unset.
2700 #
2701 # The "eor" argument specifies whether the flags should
2702 # indicate that a full record (or datagram) has been received.
2703 # If "eor" is None, no checks are done; otherwise, checks
2704 # that:
2705 #
2706 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2707 # set and all bits in msg_flags_non_eor_indicator are unset
2708 #
2709 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2710 # are set and all bits in msg_flags_eor_indicator are unset
2711 #
2712 # If "checkset" and/or "checkunset" are supplied, they require
2713 # the given bits to be set or unset respectively, overriding
2714 # what the attributes require for those bits.
2715 #
2716 # If any bits are set in "ignore", they will not be checked,
2717 # regardless of the other inputs.
2718 #
2719 # Will raise Exception if the inputs require a bit to be both
2720 # set and unset, and it is not ignored.
2721
2722 defaultset = self.msg_flags_common_set
2723 defaultunset = self.msg_flags_common_unset
2724
2725 if eor:
2726 defaultset |= self.msg_flags_eor_indicator
2727 defaultunset |= self.msg_flags_non_eor_indicator
2728 elif eor is not None:
2729 defaultset |= self.msg_flags_non_eor_indicator
2730 defaultunset |= self.msg_flags_eor_indicator
2731
2732 # Function arguments override defaults
2733 defaultset &= ~checkunset
2734 defaultunset &= ~checkset
2735
2736 # Merge arguments with remaining defaults, and check for conflicts
2737 checkset |= defaultset
2738 checkunset |= defaultunset
2739 inboth = checkset & checkunset & ~ignore
2740 if inboth:
2741 raise Exception("contradictory set, unset requirements for flags "
2742 "{0:#x}".format(inboth))
2743
2744 # Compare with given msg_flags value
2745 mask = (checkset | checkunset) & ~ignore
2746 self.assertEqual(flags & mask, checkset & mask)
2747
2748
2749class RecvmsgIntoMixin(SendrecvmsgBase):
2750 # Mixin to implement doRecvmsg() using recvmsg_into().
2751
2752 def doRecvmsg(self, sock, bufsize, *args):
2753 buf = bytearray(bufsize)
2754 result = sock.recvmsg_into([buf], *args)
2755 self.registerRecvmsgResult(result)
2756 self.assertGreaterEqual(result[0], 0)
2757 self.assertLessEqual(result[0], bufsize)
2758 return (bytes(buf[:result[0]]),) + result[1:]
2759
2760
2761class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2762 # Defines flags to be checked in msg_flags for datagram sockets.
2763
2764 @property
2765 def msg_flags_non_eor_indicator(self):
2766 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2767
2768
2769class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2770 # Defines flags to be checked in msg_flags for SCTP sockets.
2771
2772 @property
2773 def msg_flags_eor_indicator(self):
2774 return super().msg_flags_eor_indicator | socket.MSG_EOR
2775
2776
2777class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2778 # Base class for tests on connectionless-mode sockets. Users must
2779 # supply sockets on attributes cli and serv to be mapped to
2780 # cli_sock and serv_sock respectively.
2781
2782 @property
2783 def serv_sock(self):
2784 return self.serv
2785
2786 @property
2787 def cli_sock(self):
2788 return self.cli
2789
2790 @property
2791 def sendmsg_to_server_defaults(self):
2792 return ([], [], 0, self.serv_addr)
2793
2794 def sendToServer(self, msg):
2795 return self.cli_sock.sendto(msg, self.serv_addr)
2796
2797
2798class SendrecvmsgConnectedBase(SendrecvmsgBase):
2799 # Base class for tests on connected sockets. Users must supply
2800 # sockets on attributes serv_conn and cli_conn (representing the
2801 # connections *to* the server and the client), to be mapped to
2802 # cli_sock and serv_sock respectively.
2803
2804 @property
2805 def serv_sock(self):
2806 return self.cli_conn
2807
2808 @property
2809 def cli_sock(self):
2810 return self.serv_conn
2811
2812 def checkRecvmsgAddress(self, addr1, addr2):
2813 # Address is currently "unspecified" for a connected socket,
2814 # so we don't examine it
2815 pass
2816
2817
2818class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2819 # Base class to set a timeout on server's socket.
2820
2821 def setUp(self):
2822 super().setUp()
2823 self.serv_sock.settimeout(self.fail_timeout)
2824
2825
2826class SendmsgTests(SendrecvmsgServerTimeoutBase):
2827 # Tests for sendmsg() which can use any socket type and do not
2828 # involve recvmsg() or recvmsg_into().
2829
2830 def testSendmsg(self):
2831 # Send a simple message with sendmsg().
2832 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2833
2834 def _testSendmsg(self):
2835 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2836
2837 def testSendmsgDataGenerator(self):
2838 # Send from buffer obtained from a generator (not a sequence).
2839 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2840
2841 def _testSendmsgDataGenerator(self):
2842 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2843 len(MSG))
2844
2845 def testSendmsgAncillaryGenerator(self):
2846 # Gather (empty) ancillary data from a generator.
2847 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2848
2849 def _testSendmsgAncillaryGenerator(self):
2850 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2851 len(MSG))
2852
2853 def testSendmsgArray(self):
2854 # Send data from an array instead of the usual bytes object.
2855 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2856
2857 def _testSendmsgArray(self):
2858 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2859 len(MSG))
2860
2861 def testSendmsgGather(self):
2862 # Send message data from more than one buffer (gather write).
2863 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2864
2865 def _testSendmsgGather(self):
2866 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2867
2868 def testSendmsgBadArgs(self):
2869 # Check that sendmsg() rejects invalid arguments.
2870 self.assertEqual(self.serv_sock.recv(1000), b"done")
2871
2872 def _testSendmsgBadArgs(self):
2873 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2874 self.assertRaises(TypeError, self.sendmsgToServer,
2875 b"not in an iterable")
2876 self.assertRaises(TypeError, self.sendmsgToServer,
2877 object())
2878 self.assertRaises(TypeError, self.sendmsgToServer,
2879 [object()])
2880 self.assertRaises(TypeError, self.sendmsgToServer,
2881 [MSG, object()])
2882 self.assertRaises(TypeError, self.sendmsgToServer,
2883 [MSG], object())
2884 self.assertRaises(TypeError, self.sendmsgToServer,
2885 [MSG], [], object())
2886 self.assertRaises(TypeError, self.sendmsgToServer,
2887 [MSG], [], 0, object())
2888 self.sendToServer(b"done")
2889
2890 def testSendmsgBadCmsg(self):
2891 # Check that invalid ancillary data items are rejected.
2892 self.assertEqual(self.serv_sock.recv(1000), b"done")
2893
2894 def _testSendmsgBadCmsg(self):
2895 self.assertRaises(TypeError, self.sendmsgToServer,
2896 [MSG], [object()])
2897 self.assertRaises(TypeError, self.sendmsgToServer,
2898 [MSG], [(object(), 0, b"data")])
2899 self.assertRaises(TypeError, self.sendmsgToServer,
2900 [MSG], [(0, object(), b"data")])
2901 self.assertRaises(TypeError, self.sendmsgToServer,
2902 [MSG], [(0, 0, object())])
2903 self.assertRaises(TypeError, self.sendmsgToServer,
2904 [MSG], [(0, 0)])
2905 self.assertRaises(TypeError, self.sendmsgToServer,
2906 [MSG], [(0, 0, b"data", 42)])
2907 self.sendToServer(b"done")
2908
2909 @requireAttrs(socket, "CMSG_SPACE")
2910 def testSendmsgBadMultiCmsg(self):
2911 # Check that invalid ancillary data items are rejected when
2912 # more than one item is present.
2913 self.assertEqual(self.serv_sock.recv(1000), b"done")
2914
2915 @testSendmsgBadMultiCmsg.client_skip
2916 def _testSendmsgBadMultiCmsg(self):
2917 self.assertRaises(TypeError, self.sendmsgToServer,
2918 [MSG], [0, 0, b""])
2919 self.assertRaises(TypeError, self.sendmsgToServer,
2920 [MSG], [(0, 0, b""), object()])
2921 self.sendToServer(b"done")
2922
2923 def testSendmsgExcessCmsgReject(self):
2924 # Check that sendmsg() rejects excess ancillary data items
2925 # when the number that can be sent is limited.
2926 self.assertEqual(self.serv_sock.recv(1000), b"done")
2927
2928 def _testSendmsgExcessCmsgReject(self):
2929 if not hasattr(socket, "CMSG_SPACE"):
2930 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002931 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002932 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2933 self.assertIsNone(cm.exception.errno)
2934 self.sendToServer(b"done")
2935
2936 def testSendmsgAfterClose(self):
2937 # Check that sendmsg() fails on a closed socket.
2938 pass
2939
2940 def _testSendmsgAfterClose(self):
2941 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002942 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002943
2944
2945class SendmsgStreamTests(SendmsgTests):
2946 # Tests for sendmsg() which require a stream socket and do not
2947 # involve recvmsg() or recvmsg_into().
2948
2949 def testSendmsgExplicitNoneAddr(self):
2950 # Check that peer address can be specified as None.
2951 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2952
2953 def _testSendmsgExplicitNoneAddr(self):
2954 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2955
2956 def testSendmsgTimeout(self):
2957 # Check that timeout works with sendmsg().
2958 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2959 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2960
2961 def _testSendmsgTimeout(self):
2962 try:
2963 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002964 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002965 while True:
2966 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002967 except socket.timeout:
2968 pass
2969 except OSError as exc:
2970 if exc.errno != errno.ENOMEM:
2971 raise
2972 # bpo-33937 the test randomly fails on Travis CI with
2973 # "OSError: [Errno 12] Cannot allocate memory"
2974 else:
2975 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002976 finally:
2977 self.misc_event.set()
2978
2979 # XXX: would be nice to have more tests for sendmsg flags argument.
2980
2981 # Linux supports MSG_DONTWAIT when sending, but in general, it
2982 # only works when receiving. Could add other platforms if they
2983 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002984 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002985 "MSG_DONTWAIT not known to work on this platform when "
2986 "sending")
2987 def testSendmsgDontWait(self):
2988 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2989 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2990 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2991
2992 @testSendmsgDontWait.client_skip
2993 def _testSendmsgDontWait(self):
2994 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002995 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002996 while True:
2997 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002998 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2999 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003000 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07003001 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003002 finally:
3003 self.misc_event.set()
3004
3005
3006class SendmsgConnectionlessTests(SendmsgTests):
3007 # Tests for sendmsg() which require a connectionless-mode
3008 # (e.g. datagram) socket, and do not involve recvmsg() or
3009 # recvmsg_into().
3010
3011 def testSendmsgNoDestAddr(self):
3012 # Check that sendmsg() fails when no destination address is
3013 # given for unconnected socket.
3014 pass
3015
3016 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003017 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003018 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003019 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003020 [MSG], [], 0, None)
3021
3022
3023class RecvmsgGenericTests(SendrecvmsgBase):
3024 # Tests for recvmsg() which can also be emulated using
3025 # recvmsg_into(), and can use any socket type.
3026
3027 def testRecvmsg(self):
3028 # Receive a simple message with recvmsg[_into]().
3029 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3030 self.assertEqual(msg, MSG)
3031 self.checkRecvmsgAddress(addr, self.cli_addr)
3032 self.assertEqual(ancdata, [])
3033 self.checkFlags(flags, eor=True)
3034
3035 def _testRecvmsg(self):
3036 self.sendToServer(MSG)
3037
3038 def testRecvmsgExplicitDefaults(self):
3039 # Test recvmsg[_into]() with default arguments provided explicitly.
3040 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3041 len(MSG), 0, 0)
3042 self.assertEqual(msg, MSG)
3043 self.checkRecvmsgAddress(addr, self.cli_addr)
3044 self.assertEqual(ancdata, [])
3045 self.checkFlags(flags, eor=True)
3046
3047 def _testRecvmsgExplicitDefaults(self):
3048 self.sendToServer(MSG)
3049
3050 def testRecvmsgShorter(self):
3051 # Receive a message smaller than buffer.
3052 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3053 len(MSG) + 42)
3054 self.assertEqual(msg, MSG)
3055 self.checkRecvmsgAddress(addr, self.cli_addr)
3056 self.assertEqual(ancdata, [])
3057 self.checkFlags(flags, eor=True)
3058
3059 def _testRecvmsgShorter(self):
3060 self.sendToServer(MSG)
3061
3062 def testRecvmsgTrunc(self):
3063 # Receive part of message, check for truncation indicators.
3064 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3065 len(MSG) - 3)
3066 self.assertEqual(msg, MSG[:-3])
3067 self.checkRecvmsgAddress(addr, self.cli_addr)
3068 self.assertEqual(ancdata, [])
3069 self.checkFlags(flags, eor=False)
3070
3071 def _testRecvmsgTrunc(self):
3072 self.sendToServer(MSG)
3073
3074 def testRecvmsgShortAncillaryBuf(self):
3075 # Test ancillary data buffer too small to hold any ancillary data.
3076 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3077 len(MSG), 1)
3078 self.assertEqual(msg, MSG)
3079 self.checkRecvmsgAddress(addr, self.cli_addr)
3080 self.assertEqual(ancdata, [])
3081 self.checkFlags(flags, eor=True)
3082
3083 def _testRecvmsgShortAncillaryBuf(self):
3084 self.sendToServer(MSG)
3085
3086 def testRecvmsgLongAncillaryBuf(self):
3087 # Test large ancillary data buffer.
3088 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3089 len(MSG), 10240)
3090 self.assertEqual(msg, MSG)
3091 self.checkRecvmsgAddress(addr, self.cli_addr)
3092 self.assertEqual(ancdata, [])
3093 self.checkFlags(flags, eor=True)
3094
3095 def _testRecvmsgLongAncillaryBuf(self):
3096 self.sendToServer(MSG)
3097
3098 def testRecvmsgAfterClose(self):
3099 # Check that recvmsg[_into]() fails on a closed socket.
3100 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003101 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003102
3103 def _testRecvmsgAfterClose(self):
3104 pass
3105
3106 def testRecvmsgTimeout(self):
3107 # Check that timeout works.
3108 try:
3109 self.serv_sock.settimeout(0.03)
3110 self.assertRaises(socket.timeout,
3111 self.doRecvmsg, self.serv_sock, len(MSG))
3112 finally:
3113 self.misc_event.set()
3114
3115 def _testRecvmsgTimeout(self):
3116 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3117
3118 @requireAttrs(socket, "MSG_PEEK")
3119 def testRecvmsgPeek(self):
3120 # Check that MSG_PEEK in flags enables examination of pending
3121 # data without consuming it.
3122
3123 # Receive part of data with MSG_PEEK.
3124 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3125 len(MSG) - 3, 0,
3126 socket.MSG_PEEK)
3127 self.assertEqual(msg, MSG[:-3])
3128 self.checkRecvmsgAddress(addr, self.cli_addr)
3129 self.assertEqual(ancdata, [])
3130 # Ignoring MSG_TRUNC here (so this test is the same for stream
3131 # and datagram sockets). Some wording in POSIX seems to
3132 # suggest that it needn't be set when peeking, but that may
3133 # just be a slip.
3134 self.checkFlags(flags, eor=False,
3135 ignore=getattr(socket, "MSG_TRUNC", 0))
3136
3137 # Receive all data with MSG_PEEK.
3138 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3139 len(MSG), 0,
3140 socket.MSG_PEEK)
3141 self.assertEqual(msg, MSG)
3142 self.checkRecvmsgAddress(addr, self.cli_addr)
3143 self.assertEqual(ancdata, [])
3144 self.checkFlags(flags, eor=True)
3145
3146 # Check that the same data can still be received normally.
3147 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3148 self.assertEqual(msg, MSG)
3149 self.checkRecvmsgAddress(addr, self.cli_addr)
3150 self.assertEqual(ancdata, [])
3151 self.checkFlags(flags, eor=True)
3152
3153 @testRecvmsgPeek.client_skip
3154 def _testRecvmsgPeek(self):
3155 self.sendToServer(MSG)
3156
3157 @requireAttrs(socket.socket, "sendmsg")
3158 def testRecvmsgFromSendmsg(self):
3159 # Test receiving with recvmsg[_into]() when message is sent
3160 # using sendmsg().
3161 self.serv_sock.settimeout(self.fail_timeout)
3162 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3163 self.assertEqual(msg, MSG)
3164 self.checkRecvmsgAddress(addr, self.cli_addr)
3165 self.assertEqual(ancdata, [])
3166 self.checkFlags(flags, eor=True)
3167
3168 @testRecvmsgFromSendmsg.client_skip
3169 def _testRecvmsgFromSendmsg(self):
3170 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3171
3172
3173class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3174 # Tests which require a stream socket and can use either recvmsg()
3175 # or recvmsg_into().
3176
3177 def testRecvmsgEOF(self):
3178 # Receive end-of-stream indicator (b"", peer socket closed).
3179 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3180 self.assertEqual(msg, b"")
3181 self.checkRecvmsgAddress(addr, self.cli_addr)
3182 self.assertEqual(ancdata, [])
3183 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3184
3185 def _testRecvmsgEOF(self):
3186 self.cli_sock.close()
3187
3188 def testRecvmsgOverflow(self):
3189 # Receive a message in more than one chunk.
3190 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3191 len(MSG) - 3)
3192 self.checkRecvmsgAddress(addr, self.cli_addr)
3193 self.assertEqual(ancdata, [])
3194 self.checkFlags(flags, eor=False)
3195
3196 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3197 self.checkRecvmsgAddress(addr, self.cli_addr)
3198 self.assertEqual(ancdata, [])
3199 self.checkFlags(flags, eor=True)
3200
3201 msg = seg1 + seg2
3202 self.assertEqual(msg, MSG)
3203
3204 def _testRecvmsgOverflow(self):
3205 self.sendToServer(MSG)
3206
3207
3208class RecvmsgTests(RecvmsgGenericTests):
3209 # Tests for recvmsg() which can use any socket type.
3210
3211 def testRecvmsgBadArgs(self):
3212 # Check that recvmsg() rejects invalid arguments.
3213 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3214 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3215 -1, 0, 0)
3216 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3217 len(MSG), -1, 0)
3218 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3219 [bytearray(10)], 0, 0)
3220 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3221 object(), 0, 0)
3222 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3223 len(MSG), object(), 0)
3224 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3225 len(MSG), 0, object())
3226
3227 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3228 self.assertEqual(msg, MSG)
3229 self.checkRecvmsgAddress(addr, self.cli_addr)
3230 self.assertEqual(ancdata, [])
3231 self.checkFlags(flags, eor=True)
3232
3233 def _testRecvmsgBadArgs(self):
3234 self.sendToServer(MSG)
3235
3236
3237class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3238 # Tests for recvmsg_into() which can use any socket type.
3239
3240 def testRecvmsgIntoBadArgs(self):
3241 # Check that recvmsg_into() rejects invalid arguments.
3242 buf = bytearray(len(MSG))
3243 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3244 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3245 len(MSG), 0, 0)
3246 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3247 buf, 0, 0)
3248 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3249 [object()], 0, 0)
3250 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3251 [b"I'm not writable"], 0, 0)
3252 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3253 [buf, object()], 0, 0)
3254 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3255 [buf], -1, 0)
3256 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3257 [buf], object(), 0)
3258 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3259 [buf], 0, object())
3260
3261 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3262 self.assertEqual(nbytes, len(MSG))
3263 self.assertEqual(buf, bytearray(MSG))
3264 self.checkRecvmsgAddress(addr, self.cli_addr)
3265 self.assertEqual(ancdata, [])
3266 self.checkFlags(flags, eor=True)
3267
3268 def _testRecvmsgIntoBadArgs(self):
3269 self.sendToServer(MSG)
3270
3271 def testRecvmsgIntoGenerator(self):
3272 # Receive into buffer obtained from a generator (not a sequence).
3273 buf = bytearray(len(MSG))
3274 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3275 (o for o in [buf]))
3276 self.assertEqual(nbytes, len(MSG))
3277 self.assertEqual(buf, bytearray(MSG))
3278 self.checkRecvmsgAddress(addr, self.cli_addr)
3279 self.assertEqual(ancdata, [])
3280 self.checkFlags(flags, eor=True)
3281
3282 def _testRecvmsgIntoGenerator(self):
3283 self.sendToServer(MSG)
3284
3285 def testRecvmsgIntoArray(self):
3286 # Receive into an array rather than the usual bytearray.
3287 buf = array.array("B", [0] * len(MSG))
3288 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3289 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003290 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003291 self.checkRecvmsgAddress(addr, self.cli_addr)
3292 self.assertEqual(ancdata, [])
3293 self.checkFlags(flags, eor=True)
3294
3295 def _testRecvmsgIntoArray(self):
3296 self.sendToServer(MSG)
3297
3298 def testRecvmsgIntoScatter(self):
3299 # Receive into multiple buffers (scatter write).
3300 b1 = bytearray(b"----")
3301 b2 = bytearray(b"0123456789")
3302 b3 = bytearray(b"--------------")
3303 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3304 [b1, memoryview(b2)[2:9], b3])
3305 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3306 self.assertEqual(b1, bytearray(b"Mary"))
3307 self.assertEqual(b2, bytearray(b"01 had a 9"))
3308 self.assertEqual(b3, bytearray(b"little lamb---"))
3309 self.checkRecvmsgAddress(addr, self.cli_addr)
3310 self.assertEqual(ancdata, [])
3311 self.checkFlags(flags, eor=True)
3312
3313 def _testRecvmsgIntoScatter(self):
3314 self.sendToServer(b"Mary had a little lamb")
3315
3316
3317class CmsgMacroTests(unittest.TestCase):
3318 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3319 # assumptions used by sendmsg() and recvmsg[_into](), which share
3320 # code with these functions.
3321
3322 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003323 try:
3324 import _testcapi
3325 except ImportError:
3326 socklen_t_limit = 0x7fffffff
3327 else:
3328 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003329
3330 @requireAttrs(socket, "CMSG_LEN")
3331 def testCMSG_LEN(self):
3332 # Test CMSG_LEN() with various valid and invalid values,
3333 # checking the assumptions used by recvmsg() and sendmsg().
3334 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3335 values = list(range(257)) + list(range(toobig - 257, toobig))
3336
3337 # struct cmsghdr has at least three members, two of which are ints
3338 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3339 for n in values:
3340 ret = socket.CMSG_LEN(n)
3341 # This is how recvmsg() calculates the data size
3342 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3343 self.assertLessEqual(ret, self.socklen_t_limit)
3344
3345 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3346 # sendmsg() shares code with these functions, and requires
3347 # that it reject values over the limit.
3348 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3349 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3350
3351 @requireAttrs(socket, "CMSG_SPACE")
3352 def testCMSG_SPACE(self):
3353 # Test CMSG_SPACE() with various valid and invalid values,
3354 # checking the assumptions used by sendmsg().
3355 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3356 values = list(range(257)) + list(range(toobig - 257, toobig))
3357
3358 last = socket.CMSG_SPACE(0)
3359 # struct cmsghdr has at least three members, two of which are ints
3360 self.assertGreater(last, array.array("i").itemsize * 2)
3361 for n in values:
3362 ret = socket.CMSG_SPACE(n)
3363 self.assertGreaterEqual(ret, last)
3364 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3365 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3366 self.assertLessEqual(ret, self.socklen_t_limit)
3367 last = ret
3368
3369 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3370 # sendmsg() shares code with these functions, and requires
3371 # that it reject values over the limit.
3372 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3373 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3374
3375
3376class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3377 # Tests for file descriptor passing on Unix-domain sockets.
3378
3379 # Invalid file descriptor value that's unlikely to evaluate to a
3380 # real FD even if one of its bytes is replaced with a different
3381 # value (which shouldn't actually happen).
3382 badfd = -0x5555
3383
3384 def newFDs(self, n):
3385 # Return a list of n file descriptors for newly-created files
3386 # containing their list indices as ASCII numbers.
3387 fds = []
3388 for i in range(n):
3389 fd, path = tempfile.mkstemp()
3390 self.addCleanup(os.unlink, path)
3391 self.addCleanup(os.close, fd)
3392 os.write(fd, str(i).encode())
3393 fds.append(fd)
3394 return fds
3395
3396 def checkFDs(self, fds):
3397 # Check that the file descriptors in the given list contain
3398 # their correct list indices as ASCII numbers.
3399 for n, fd in enumerate(fds):
3400 os.lseek(fd, 0, os.SEEK_SET)
3401 self.assertEqual(os.read(fd, 1024), str(n).encode())
3402
3403 def registerRecvmsgResult(self, result):
3404 self.addCleanup(self.closeRecvmsgFDs, result)
3405
3406 def closeRecvmsgFDs(self, recvmsg_result):
3407 # Close all file descriptors specified in the ancillary data
3408 # of the given return value from recvmsg() or recvmsg_into().
3409 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3410 if (cmsg_level == socket.SOL_SOCKET and
3411 cmsg_type == socket.SCM_RIGHTS):
3412 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003413 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003414 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3415 for fd in fds:
3416 os.close(fd)
3417
3418 def createAndSendFDs(self, n):
3419 # Send n new file descriptors created by newFDs() to the
3420 # server, with the constant MSG as the non-ancillary data.
3421 self.assertEqual(
3422 self.sendmsgToServer([MSG],
3423 [(socket.SOL_SOCKET,
3424 socket.SCM_RIGHTS,
3425 array.array("i", self.newFDs(n)))]),
3426 len(MSG))
3427
3428 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3429 # Check that constant MSG was received with numfds file
3430 # descriptors in a maximum of maxcmsgs control messages (which
3431 # must contain only complete integers). By default, check
3432 # that MSG_CTRUNC is unset, but ignore any flags in
3433 # ignoreflags.
3434 msg, ancdata, flags, addr = result
3435 self.assertEqual(msg, MSG)
3436 self.checkRecvmsgAddress(addr, self.cli_addr)
3437 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3438 ignore=ignoreflags)
3439
3440 self.assertIsInstance(ancdata, list)
3441 self.assertLessEqual(len(ancdata), maxcmsgs)
3442 fds = array.array("i")
3443 for item in ancdata:
3444 self.assertIsInstance(item, tuple)
3445 cmsg_level, cmsg_type, cmsg_data = item
3446 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3447 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3448 self.assertIsInstance(cmsg_data, bytes)
3449 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003450 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451
3452 self.assertEqual(len(fds), numfds)
3453 self.checkFDs(fds)
3454
3455 def testFDPassSimple(self):
3456 # Pass a single FD (array read from bytes object).
3457 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3458 len(MSG), 10240))
3459
3460 def _testFDPassSimple(self):
3461 self.assertEqual(
3462 self.sendmsgToServer(
3463 [MSG],
3464 [(socket.SOL_SOCKET,
3465 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003466 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003467 len(MSG))
3468
3469 def testMultipleFDPass(self):
3470 # Pass multiple FDs in a single array.
3471 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3472 len(MSG), 10240))
3473
3474 def _testMultipleFDPass(self):
3475 self.createAndSendFDs(4)
3476
3477 @requireAttrs(socket, "CMSG_SPACE")
3478 def testFDPassCMSG_SPACE(self):
3479 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3480 self.checkRecvmsgFDs(
3481 4, self.doRecvmsg(self.serv_sock, len(MSG),
3482 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3483
3484 @testFDPassCMSG_SPACE.client_skip
3485 def _testFDPassCMSG_SPACE(self):
3486 self.createAndSendFDs(4)
3487
3488 def testFDPassCMSG_LEN(self):
3489 # Test using CMSG_LEN() to calculate ancillary buffer size.
3490 self.checkRecvmsgFDs(1,
3491 self.doRecvmsg(self.serv_sock, len(MSG),
3492 socket.CMSG_LEN(4 * SIZEOF_INT)),
3493 # RFC 3542 says implementations may set
3494 # MSG_CTRUNC if there isn't enough space
3495 # for trailing padding.
3496 ignoreflags=socket.MSG_CTRUNC)
3497
3498 def _testFDPassCMSG_LEN(self):
3499 self.createAndSendFDs(1)
3500
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003501 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003502 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003503 @requireAttrs(socket, "CMSG_SPACE")
3504 def testFDPassSeparate(self):
3505 # Pass two FDs in two separate arrays. Arrays may be combined
3506 # into a single control message by the OS.
3507 self.checkRecvmsgFDs(2,
3508 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3509 maxcmsgs=2)
3510
3511 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003512 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003513 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003514 def _testFDPassSeparate(self):
3515 fd0, fd1 = self.newFDs(2)
3516 self.assertEqual(
3517 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3518 socket.SCM_RIGHTS,
3519 array.array("i", [fd0])),
3520 (socket.SOL_SOCKET,
3521 socket.SCM_RIGHTS,
3522 array.array("i", [fd1]))]),
3523 len(MSG))
3524
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003525 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003526 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003527 @requireAttrs(socket, "CMSG_SPACE")
3528 def testFDPassSeparateMinSpace(self):
3529 # Pass two FDs in two separate arrays, receiving them into the
3530 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003531 num_fds = 2
3532 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003533 self.doRecvmsg(self.serv_sock, len(MSG),
3534 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003535 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003536 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3537
3538 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003539 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003540 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003541 def _testFDPassSeparateMinSpace(self):
3542 fd0, fd1 = self.newFDs(2)
3543 self.assertEqual(
3544 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3545 socket.SCM_RIGHTS,
3546 array.array("i", [fd0])),
3547 (socket.SOL_SOCKET,
3548 socket.SCM_RIGHTS,
3549 array.array("i", [fd1]))]),
3550 len(MSG))
3551
3552 def sendAncillaryIfPossible(self, msg, ancdata):
3553 # Try to send msg and ancdata to server, but if the system
3554 # call fails, just send msg with no ancillary data.
3555 try:
3556 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003557 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003558 # Check that it was the system call that failed
3559 self.assertIsInstance(e.errno, int)
3560 nbytes = self.sendmsgToServer([msg])
3561 self.assertEqual(nbytes, len(msg))
3562
Brett Cannon3bbad122015-12-28 17:21:44 -08003563 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003564 def testFDPassEmpty(self):
3565 # Try to pass an empty FD array. Can receive either no array
3566 # or an empty array.
3567 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3568 len(MSG), 10240),
3569 ignoreflags=socket.MSG_CTRUNC)
3570
3571 def _testFDPassEmpty(self):
3572 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3573 socket.SCM_RIGHTS,
3574 b"")])
3575
3576 def testFDPassPartialInt(self):
3577 # Try to pass a truncated FD array.
3578 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3579 len(MSG), 10240)
3580 self.assertEqual(msg, MSG)
3581 self.checkRecvmsgAddress(addr, self.cli_addr)
3582 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3583 self.assertLessEqual(len(ancdata), 1)
3584 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3585 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3586 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3587 self.assertLess(len(cmsg_data), SIZEOF_INT)
3588
3589 def _testFDPassPartialInt(self):
3590 self.sendAncillaryIfPossible(
3591 MSG,
3592 [(socket.SOL_SOCKET,
3593 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003594 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003595
3596 @requireAttrs(socket, "CMSG_SPACE")
3597 def testFDPassPartialIntInMiddle(self):
3598 # Try to pass two FD arrays, the first of which is truncated.
3599 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3600 len(MSG), 10240)
3601 self.assertEqual(msg, MSG)
3602 self.checkRecvmsgAddress(addr, self.cli_addr)
3603 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3604 self.assertLessEqual(len(ancdata), 2)
3605 fds = array.array("i")
3606 # Arrays may have been combined in a single control message
3607 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3608 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3609 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003610 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003611 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3612 self.assertLessEqual(len(fds), 2)
3613 self.checkFDs(fds)
3614
3615 @testFDPassPartialIntInMiddle.client_skip
3616 def _testFDPassPartialIntInMiddle(self):
3617 fd0, fd1 = self.newFDs(2)
3618 self.sendAncillaryIfPossible(
3619 MSG,
3620 [(socket.SOL_SOCKET,
3621 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003622 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003623 (socket.SOL_SOCKET,
3624 socket.SCM_RIGHTS,
3625 array.array("i", [fd1]))])
3626
3627 def checkTruncatedHeader(self, result, ignoreflags=0):
3628 # Check that no ancillary data items are returned when data is
3629 # truncated inside the cmsghdr structure.
3630 msg, ancdata, flags, addr = result
3631 self.assertEqual(msg, MSG)
3632 self.checkRecvmsgAddress(addr, self.cli_addr)
3633 self.assertEqual(ancdata, [])
3634 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3635 ignore=ignoreflags)
3636
3637 def testCmsgTruncNoBufSize(self):
3638 # Check that no ancillary data is received when no buffer size
3639 # is specified.
3640 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3641 # BSD seems to set MSG_CTRUNC only
3642 # if an item has been partially
3643 # received.
3644 ignoreflags=socket.MSG_CTRUNC)
3645
3646 def _testCmsgTruncNoBufSize(self):
3647 self.createAndSendFDs(1)
3648
3649 def testCmsgTrunc0(self):
3650 # Check that no ancillary data is received when buffer size is 0.
3651 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3652 ignoreflags=socket.MSG_CTRUNC)
3653
3654 def _testCmsgTrunc0(self):
3655 self.createAndSendFDs(1)
3656
3657 # Check that no ancillary data is returned for various non-zero
3658 # (but still too small) buffer sizes.
3659
3660 def testCmsgTrunc1(self):
3661 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3662
3663 def _testCmsgTrunc1(self):
3664 self.createAndSendFDs(1)
3665
3666 def testCmsgTrunc2Int(self):
3667 # The cmsghdr structure has at least three members, two of
3668 # which are ints, so we still shouldn't see any ancillary
3669 # data.
3670 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3671 SIZEOF_INT * 2))
3672
3673 def _testCmsgTrunc2Int(self):
3674 self.createAndSendFDs(1)
3675
3676 def testCmsgTruncLen0Minus1(self):
3677 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3678 socket.CMSG_LEN(0) - 1))
3679
3680 def _testCmsgTruncLen0Minus1(self):
3681 self.createAndSendFDs(1)
3682
3683 # The following tests try to truncate the control message in the
3684 # middle of the FD array.
3685
3686 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3687 # Check that file descriptor data is truncated to between
3688 # mindata and maxdata bytes when received with buffer size
3689 # ancbuf, and that any complete file descriptor numbers are
3690 # valid.
3691 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3692 len(MSG), ancbuf)
3693 self.assertEqual(msg, MSG)
3694 self.checkRecvmsgAddress(addr, self.cli_addr)
3695 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3696
3697 if mindata == 0 and ancdata == []:
3698 return
3699 self.assertEqual(len(ancdata), 1)
3700 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3701 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3702 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3703 self.assertGreaterEqual(len(cmsg_data), mindata)
3704 self.assertLessEqual(len(cmsg_data), maxdata)
3705 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003706 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003707 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3708 self.checkFDs(fds)
3709
3710 def testCmsgTruncLen0(self):
3711 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3712
3713 def _testCmsgTruncLen0(self):
3714 self.createAndSendFDs(1)
3715
3716 def testCmsgTruncLen0Plus1(self):
3717 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3718
3719 def _testCmsgTruncLen0Plus1(self):
3720 self.createAndSendFDs(2)
3721
3722 def testCmsgTruncLen1(self):
3723 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3724 maxdata=SIZEOF_INT)
3725
3726 def _testCmsgTruncLen1(self):
3727 self.createAndSendFDs(2)
3728
3729 def testCmsgTruncLen2Minus1(self):
3730 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3731 maxdata=(2 * SIZEOF_INT) - 1)
3732
3733 def _testCmsgTruncLen2Minus1(self):
3734 self.createAndSendFDs(2)
3735
3736
3737class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3738 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3739 # features of the RFC 3542 Advanced Sockets API for IPv6.
3740 # Currently we can only handle certain data items (e.g. traffic
3741 # class, hop limit, MTU discovery and fragmentation settings)
3742 # without resorting to unportable means such as the struct module,
3743 # but the tests here are aimed at testing the ancillary data
3744 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3745 # itself.
3746
3747 # Test value to use when setting hop limit of packet
3748 hop_limit = 2
3749
3750 # Test value to use when setting traffic class of packet.
3751 # -1 means "use kernel default".
3752 traffic_class = -1
3753
3754 def ancillaryMapping(self, ancdata):
3755 # Given ancillary data list ancdata, return a mapping from
3756 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3757 # Check that no (level, type) pair appears more than once.
3758 d = {}
3759 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3760 self.assertNotIn((cmsg_level, cmsg_type), d)
3761 d[(cmsg_level, cmsg_type)] = cmsg_data
3762 return d
3763
3764 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3765 # Receive hop limit into ancbufsize bytes of ancillary data
3766 # space. Check that data is MSG, ancillary data is not
3767 # truncated (but ignore any flags in ignoreflags), and hop
3768 # limit is between 0 and maxhop inclusive.
3769 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3770 socket.IPV6_RECVHOPLIMIT, 1)
3771 self.misc_event.set()
3772 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3773 len(MSG), ancbufsize)
3774
3775 self.assertEqual(msg, MSG)
3776 self.checkRecvmsgAddress(addr, self.cli_addr)
3777 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3778 ignore=ignoreflags)
3779
3780 self.assertEqual(len(ancdata), 1)
3781 self.assertIsInstance(ancdata[0], tuple)
3782 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3783 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3784 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3785 self.assertIsInstance(cmsg_data, bytes)
3786 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3787 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003788 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003789 self.assertGreaterEqual(a[0], 0)
3790 self.assertLessEqual(a[0], maxhop)
3791
3792 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3793 def testRecvHopLimit(self):
3794 # Test receiving the packet hop limit as ancillary data.
3795 self.checkHopLimit(ancbufsize=10240)
3796
3797 @testRecvHopLimit.client_skip
3798 def _testRecvHopLimit(self):
3799 # Need to wait until server has asked to receive ancillary
3800 # data, as implementations are not required to buffer it
3801 # otherwise.
3802 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3803 self.sendToServer(MSG)
3804
3805 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3806 def testRecvHopLimitCMSG_SPACE(self):
3807 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3808 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3809
3810 @testRecvHopLimitCMSG_SPACE.client_skip
3811 def _testRecvHopLimitCMSG_SPACE(self):
3812 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3813 self.sendToServer(MSG)
3814
3815 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3816 # 3542 says portable applications must provide space for trailing
3817 # padding. Implementations may set MSG_CTRUNC if there isn't
3818 # enough space for the padding.
3819
3820 @requireAttrs(socket.socket, "sendmsg")
3821 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3822 def testSetHopLimit(self):
3823 # Test setting hop limit on outgoing packet and receiving it
3824 # at the other end.
3825 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3826
3827 @testSetHopLimit.client_skip
3828 def _testSetHopLimit(self):
3829 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3830 self.assertEqual(
3831 self.sendmsgToServer([MSG],
3832 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3833 array.array("i", [self.hop_limit]))]),
3834 len(MSG))
3835
3836 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3837 ignoreflags=0):
3838 # Receive traffic class and hop limit into ancbufsize bytes of
3839 # ancillary data space. Check that data is MSG, ancillary
3840 # data is not truncated (but ignore any flags in ignoreflags),
3841 # and traffic class and hop limit are in range (hop limit no
3842 # more than maxhop).
3843 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3844 socket.IPV6_RECVHOPLIMIT, 1)
3845 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3846 socket.IPV6_RECVTCLASS, 1)
3847 self.misc_event.set()
3848 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3849 len(MSG), ancbufsize)
3850
3851 self.assertEqual(msg, MSG)
3852 self.checkRecvmsgAddress(addr, self.cli_addr)
3853 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3854 ignore=ignoreflags)
3855 self.assertEqual(len(ancdata), 2)
3856 ancmap = self.ancillaryMapping(ancdata)
3857
3858 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3859 self.assertEqual(len(tcdata), SIZEOF_INT)
3860 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003861 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003862 self.assertGreaterEqual(a[0], 0)
3863 self.assertLessEqual(a[0], 255)
3864
3865 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3866 self.assertEqual(len(hldata), SIZEOF_INT)
3867 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003868 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869 self.assertGreaterEqual(a[0], 0)
3870 self.assertLessEqual(a[0], maxhop)
3871
3872 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3873 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3874 def testRecvTrafficClassAndHopLimit(self):
3875 # Test receiving traffic class and hop limit as ancillary data.
3876 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3877
3878 @testRecvTrafficClassAndHopLimit.client_skip
3879 def _testRecvTrafficClassAndHopLimit(self):
3880 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3881 self.sendToServer(MSG)
3882
3883 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3884 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3885 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3886 # Test receiving traffic class and hop limit, using
3887 # CMSG_SPACE() to calculate buffer size.
3888 self.checkTrafficClassAndHopLimit(
3889 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3890
3891 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3892 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3893 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3894 self.sendToServer(MSG)
3895
3896 @requireAttrs(socket.socket, "sendmsg")
3897 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3898 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3899 def testSetTrafficClassAndHopLimit(self):
3900 # Test setting traffic class and hop limit on outgoing packet,
3901 # and receiving them at the other end.
3902 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3903 maxhop=self.hop_limit)
3904
3905 @testSetTrafficClassAndHopLimit.client_skip
3906 def _testSetTrafficClassAndHopLimit(self):
3907 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3908 self.assertEqual(
3909 self.sendmsgToServer([MSG],
3910 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3911 array.array("i", [self.traffic_class])),
3912 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3913 array.array("i", [self.hop_limit]))]),
3914 len(MSG))
3915
3916 @requireAttrs(socket.socket, "sendmsg")
3917 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3918 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3919 def testOddCmsgSize(self):
3920 # Try to send ancillary data with first item one byte too
3921 # long. Fall back to sending with correct size if this fails,
3922 # and check that second item was handled correctly.
3923 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3924 maxhop=self.hop_limit)
3925
3926 @testOddCmsgSize.client_skip
3927 def _testOddCmsgSize(self):
3928 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3929 try:
3930 nbytes = self.sendmsgToServer(
3931 [MSG],
3932 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003933 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003934 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3935 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003936 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003937 self.assertIsInstance(e.errno, int)
3938 nbytes = self.sendmsgToServer(
3939 [MSG],
3940 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3941 array.array("i", [self.traffic_class])),
3942 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3943 array.array("i", [self.hop_limit]))])
3944 self.assertEqual(nbytes, len(MSG))
3945
3946 # Tests for proper handling of truncated ancillary data
3947
3948 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3949 # Receive hop limit into ancbufsize bytes of ancillary data
3950 # space, which should be too small to contain the ancillary
3951 # data header (if ancbufsize is None, pass no second argument
3952 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3953 # (unless included in ignoreflags), and no ancillary data is
3954 # returned.
3955 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3956 socket.IPV6_RECVHOPLIMIT, 1)
3957 self.misc_event.set()
3958 args = () if ancbufsize is None else (ancbufsize,)
3959 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3960 len(MSG), *args)
3961
3962 self.assertEqual(msg, MSG)
3963 self.checkRecvmsgAddress(addr, self.cli_addr)
3964 self.assertEqual(ancdata, [])
3965 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3966 ignore=ignoreflags)
3967
3968 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3969 def testCmsgTruncNoBufSize(self):
3970 # Check that no ancillary data is received when no ancillary
3971 # buffer size is provided.
3972 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3973 # BSD seems to set
3974 # MSG_CTRUNC only if an item
3975 # has been partially
3976 # received.
3977 ignoreflags=socket.MSG_CTRUNC)
3978
3979 @testCmsgTruncNoBufSize.client_skip
3980 def _testCmsgTruncNoBufSize(self):
3981 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3982 self.sendToServer(MSG)
3983
3984 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3985 def testSingleCmsgTrunc0(self):
3986 # Check that no ancillary data is received when ancillary
3987 # buffer size is zero.
3988 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3989 ignoreflags=socket.MSG_CTRUNC)
3990
3991 @testSingleCmsgTrunc0.client_skip
3992 def _testSingleCmsgTrunc0(self):
3993 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3994 self.sendToServer(MSG)
3995
3996 # Check that no ancillary data is returned for various non-zero
3997 # (but still too small) buffer sizes.
3998
3999 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4000 def testSingleCmsgTrunc1(self):
4001 self.checkHopLimitTruncatedHeader(ancbufsize=1)
4002
4003 @testSingleCmsgTrunc1.client_skip
4004 def _testSingleCmsgTrunc1(self):
4005 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4006 self.sendToServer(MSG)
4007
4008 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4009 def testSingleCmsgTrunc2Int(self):
4010 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
4011
4012 @testSingleCmsgTrunc2Int.client_skip
4013 def _testSingleCmsgTrunc2Int(self):
4014 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4015 self.sendToServer(MSG)
4016
4017 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4018 def testSingleCmsgTruncLen0Minus1(self):
4019 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
4020
4021 @testSingleCmsgTruncLen0Minus1.client_skip
4022 def _testSingleCmsgTruncLen0Minus1(self):
4023 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4024 self.sendToServer(MSG)
4025
4026 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4027 def testSingleCmsgTruncInData(self):
4028 # Test truncation of a control message inside its associated
4029 # data. The message may be returned with its data truncated,
4030 # or not returned at all.
4031 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4032 socket.IPV6_RECVHOPLIMIT, 1)
4033 self.misc_event.set()
4034 msg, ancdata, flags, addr = self.doRecvmsg(
4035 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4036
4037 self.assertEqual(msg, MSG)
4038 self.checkRecvmsgAddress(addr, self.cli_addr)
4039 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4040
4041 self.assertLessEqual(len(ancdata), 1)
4042 if ancdata:
4043 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4044 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4045 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4046 self.assertLess(len(cmsg_data), SIZEOF_INT)
4047
4048 @testSingleCmsgTruncInData.client_skip
4049 def _testSingleCmsgTruncInData(self):
4050 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4051 self.sendToServer(MSG)
4052
4053 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4054 # Receive traffic class and hop limit into ancbufsize bytes of
4055 # ancillary data space, which should be large enough to
4056 # contain the first item, but too small to contain the header
4057 # of the second. Check that data is MSG, MSG_CTRUNC is set
4058 # (unless included in ignoreflags), and only one ancillary
4059 # data item is returned.
4060 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4061 socket.IPV6_RECVHOPLIMIT, 1)
4062 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4063 socket.IPV6_RECVTCLASS, 1)
4064 self.misc_event.set()
4065 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4066 len(MSG), ancbufsize)
4067
4068 self.assertEqual(msg, MSG)
4069 self.checkRecvmsgAddress(addr, self.cli_addr)
4070 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4071 ignore=ignoreflags)
4072
4073 self.assertEqual(len(ancdata), 1)
4074 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4075 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4076 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4077 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4078 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004079 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004080 self.assertGreaterEqual(a[0], 0)
4081 self.assertLessEqual(a[0], 255)
4082
4083 # Try the above test with various buffer sizes.
4084
4085 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4086 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4087 def testSecondCmsgTrunc0(self):
4088 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4089 ignoreflags=socket.MSG_CTRUNC)
4090
4091 @testSecondCmsgTrunc0.client_skip
4092 def _testSecondCmsgTrunc0(self):
4093 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4094 self.sendToServer(MSG)
4095
4096 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4097 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4098 def testSecondCmsgTrunc1(self):
4099 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4100
4101 @testSecondCmsgTrunc1.client_skip
4102 def _testSecondCmsgTrunc1(self):
4103 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4104 self.sendToServer(MSG)
4105
4106 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4107 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4108 def testSecondCmsgTrunc2Int(self):
4109 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4110 2 * SIZEOF_INT)
4111
4112 @testSecondCmsgTrunc2Int.client_skip
4113 def _testSecondCmsgTrunc2Int(self):
4114 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4115 self.sendToServer(MSG)
4116
4117 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4118 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4119 def testSecondCmsgTruncLen0Minus1(self):
4120 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4121 socket.CMSG_LEN(0) - 1)
4122
4123 @testSecondCmsgTruncLen0Minus1.client_skip
4124 def _testSecondCmsgTruncLen0Minus1(self):
4125 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4126 self.sendToServer(MSG)
4127
4128 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4129 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4130 def testSecomdCmsgTruncInData(self):
4131 # Test truncation of the second of two control messages inside
4132 # its associated data.
4133 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4134 socket.IPV6_RECVHOPLIMIT, 1)
4135 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4136 socket.IPV6_RECVTCLASS, 1)
4137 self.misc_event.set()
4138 msg, ancdata, flags, addr = self.doRecvmsg(
4139 self.serv_sock, len(MSG),
4140 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4141
4142 self.assertEqual(msg, MSG)
4143 self.checkRecvmsgAddress(addr, self.cli_addr)
4144 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4145
4146 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4147
4148 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4149 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4150 cmsg_types.remove(cmsg_type)
4151 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4152 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004153 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004154 self.assertGreaterEqual(a[0], 0)
4155 self.assertLessEqual(a[0], 255)
4156
4157 if ancdata:
4158 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4159 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4160 cmsg_types.remove(cmsg_type)
4161 self.assertLess(len(cmsg_data), SIZEOF_INT)
4162
4163 self.assertEqual(ancdata, [])
4164
4165 @testSecomdCmsgTruncInData.client_skip
4166 def _testSecomdCmsgTruncInData(self):
4167 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4168 self.sendToServer(MSG)
4169
4170
4171# Derive concrete test classes for different socket types.
4172
4173class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4174 SendrecvmsgConnectionlessBase,
4175 ThreadedSocketTestMixin, UDPTestBase):
4176 pass
4177
4178@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004179class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4180 pass
4181
4182@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004183class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4184 pass
4185
4186@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004187class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4188 pass
4189
4190
4191class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4192 SendrecvmsgConnectionlessBase,
4193 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004194
4195 def checkRecvmsgAddress(self, addr1, addr2):
4196 # Called to compare the received address with the address of
4197 # the peer, ignoring scope ID
4198 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004199
4200@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004201@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004202@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004203class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4204 pass
4205
4206@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004207@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004208@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004209class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4210 pass
4211
4212@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004213@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004214@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004215class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4216 pass
4217
4218@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004219@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004220@requireAttrs(socket, "IPPROTO_IPV6")
4221@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004222class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4223 SendrecvmsgUDP6TestBase):
4224 pass
4225
4226@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004227@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004228@requireAttrs(socket, "IPPROTO_IPV6")
4229@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004230class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4231 RFC3542AncillaryTest,
4232 SendrecvmsgUDP6TestBase):
4233 pass
4234
4235
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004236@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4237 'UDPLITE sockets required for this test.')
4238class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4239 SendrecvmsgConnectionlessBase,
4240 ThreadedSocketTestMixin, UDPLITETestBase):
4241 pass
4242
4243@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4244 'UDPLITE sockets required for this test.')
4245@requireAttrs(socket.socket, "sendmsg")
4246class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4247 pass
4248
4249@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4250 'UDPLITE sockets required for this test.')
4251@requireAttrs(socket.socket, "recvmsg")
4252class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4253 pass
4254
4255@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4256 'UDPLITE sockets required for this test.')
4257@requireAttrs(socket.socket, "recvmsg_into")
4258class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4259 pass
4260
4261
4262@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4263 'UDPLITE sockets required for this test.')
4264class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4265 SendrecvmsgConnectionlessBase,
4266 ThreadedSocketTestMixin, UDPLITE6TestBase):
4267
4268 def checkRecvmsgAddress(self, addr1, addr2):
4269 # Called to compare the received address with the address of
4270 # the peer, ignoring scope ID
4271 self.assertEqual(addr1[:-1], addr2[:-1])
4272
4273@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004274@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004275@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4276 'UDPLITE sockets required for this test.')
4277@requireSocket("AF_INET6", "SOCK_DGRAM")
4278class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4279 pass
4280
4281@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004282@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004283@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4284 'UDPLITE sockets required for this test.')
4285@requireSocket("AF_INET6", "SOCK_DGRAM")
4286class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4287 pass
4288
4289@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004290@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004291@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4292 'UDPLITE sockets required for this test.')
4293@requireSocket("AF_INET6", "SOCK_DGRAM")
4294class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4295 pass
4296
4297@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004298@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004299@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4300 'UDPLITE sockets required for this test.')
4301@requireAttrs(socket, "IPPROTO_IPV6")
4302@requireSocket("AF_INET6", "SOCK_DGRAM")
4303class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4304 SendrecvmsgUDPLITE6TestBase):
4305 pass
4306
4307@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004308@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004309@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4310 'UDPLITE sockets required for this test.')
4311@requireAttrs(socket, "IPPROTO_IPV6")
4312@requireSocket("AF_INET6", "SOCK_DGRAM")
4313class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4314 RFC3542AncillaryTest,
4315 SendrecvmsgUDPLITE6TestBase):
4316 pass
4317
4318
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004319class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4320 ConnectedStreamTestMixin, TCPTestBase):
4321 pass
4322
4323@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004324class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4325 pass
4326
4327@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004328class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4329 SendrecvmsgTCPTestBase):
4330 pass
4331
4332@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004333class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4334 SendrecvmsgTCPTestBase):
4335 pass
4336
4337
4338class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4339 SendrecvmsgConnectedBase,
4340 ConnectedStreamTestMixin, SCTPStreamBase):
4341 pass
4342
4343@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004344@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004345@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004346class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4347 pass
4348
4349@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004350@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004351@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004352class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4353 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004354
4355 def testRecvmsgEOF(self):
4356 try:
4357 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4358 except OSError as e:
4359 if e.errno != errno.ENOTCONN:
4360 raise
4361 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004362
4363@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004364@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004365@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004366class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4367 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004368
4369 def testRecvmsgEOF(self):
4370 try:
4371 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4372 except OSError as e:
4373 if e.errno != errno.ENOTCONN:
4374 raise
4375 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004376
4377
4378class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4379 ConnectedStreamTestMixin, UnixStreamBase):
4380 pass
4381
4382@requireAttrs(socket.socket, "sendmsg")
4383@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004384class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4385 pass
4386
4387@requireAttrs(socket.socket, "recvmsg")
4388@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004389class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4390 SendrecvmsgUnixStreamTestBase):
4391 pass
4392
4393@requireAttrs(socket.socket, "recvmsg_into")
4394@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004395class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4396 SendrecvmsgUnixStreamTestBase):
4397 pass
4398
4399@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4400@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004401class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4402 pass
4403
4404@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4405@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004406class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4407 SendrecvmsgUnixStreamTestBase):
4408 pass
4409
4410
4411# Test interrupting the interruptible send/receive methods with a
4412# signal when a timeout is set. These tests avoid having multiple
4413# threads alive during the test so that the OS cannot deliver the
4414# signal to the wrong one.
4415
4416class InterruptedTimeoutBase(unittest.TestCase):
4417 # Base class for interrupted send/receive tests. Installs an
4418 # empty handler for SIGALRM and removes it on teardown, along with
4419 # any scheduled alarms.
4420
4421 def setUp(self):
4422 super().setUp()
4423 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004424 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004426
4427 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004428 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004429
4430 # Provide setAlarm() method to schedule delivery of SIGALRM after
4431 # given number of seconds, or cancel it if zero, and an
4432 # appropriate time value to use. Use setitimer() if available.
4433 if hasattr(signal, "setitimer"):
4434 alarm_time = 0.05
4435
4436 def setAlarm(self, seconds):
4437 signal.setitimer(signal.ITIMER_REAL, seconds)
4438 else:
4439 # Old systems may deliver the alarm up to one second early
4440 alarm_time = 2
4441
4442 def setAlarm(self, seconds):
4443 signal.alarm(seconds)
4444
4445
4446# Require siginterrupt() in order to ensure that system calls are
4447# interrupted by default.
4448@requireAttrs(signal, "siginterrupt")
4449@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4450 "Don't have signal.alarm or signal.setitimer")
4451class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4452 # Test interrupting the recv*() methods with signals when a
4453 # timeout is set.
4454
4455 def setUp(self):
4456 super().setUp()
4457 self.serv.settimeout(self.timeout)
4458
4459 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004460 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004461 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004462 try:
4463 self.setAlarm(self.alarm_time)
4464 with self.assertRaises(ZeroDivisionError) as cm:
4465 func(*args, **kwargs)
4466 finally:
4467 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004468
4469 def testInterruptedRecvTimeout(self):
4470 self.checkInterruptedRecv(self.serv.recv, 1024)
4471
4472 def testInterruptedRecvIntoTimeout(self):
4473 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4474
4475 def testInterruptedRecvfromTimeout(self):
4476 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4477
4478 def testInterruptedRecvfromIntoTimeout(self):
4479 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4480
4481 @requireAttrs(socket.socket, "recvmsg")
4482 def testInterruptedRecvmsgTimeout(self):
4483 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4484
4485 @requireAttrs(socket.socket, "recvmsg_into")
4486 def testInterruptedRecvmsgIntoTimeout(self):
4487 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4488
4489
4490# Require siginterrupt() in order to ensure that system calls are
4491# interrupted by default.
4492@requireAttrs(signal, "siginterrupt")
4493@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4494 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004495class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4496 ThreadSafeCleanupTestCase,
4497 SocketListeningTestMixin, TCPTestBase):
4498 # Test interrupting the interruptible send*() methods with signals
4499 # when a timeout is set.
4500
4501 def setUp(self):
4502 super().setUp()
4503 self.serv_conn = self.newSocket()
4504 self.addCleanup(self.serv_conn.close)
4505 # Use a thread to complete the connection, but wait for it to
4506 # terminate before running the test, so that there is only one
4507 # thread to accept the signal.
4508 cli_thread = threading.Thread(target=self.doConnect)
4509 cli_thread.start()
4510 self.cli_conn, addr = self.serv.accept()
4511 self.addCleanup(self.cli_conn.close)
4512 cli_thread.join()
4513 self.serv_conn.settimeout(self.timeout)
4514
4515 def doConnect(self):
4516 self.serv_conn.connect(self.serv_addr)
4517
4518 def checkInterruptedSend(self, func, *args, **kwargs):
4519 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004520 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004521 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004522 try:
4523 with self.assertRaises(ZeroDivisionError) as cm:
4524 while True:
4525 self.setAlarm(self.alarm_time)
4526 func(*args, **kwargs)
4527 finally:
4528 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004529
Ned Deilyc5640382014-02-03 13:58:31 -08004530 # Issue #12958: The following tests have problems on OS X prior to 10.7
4531 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004532 def testInterruptedSendTimeout(self):
4533 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4534
Ned Deilyc5640382014-02-03 13:58:31 -08004535 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004536 def testInterruptedSendtoTimeout(self):
4537 # Passing an actual address here as Python's wrapper for
4538 # sendto() doesn't allow passing a zero-length one; POSIX
4539 # requires that the address is ignored since the socket is
4540 # connection-mode, however.
4541 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4542 self.serv_addr)
4543
Ned Deilyc5640382014-02-03 13:58:31 -08004544 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004545 @requireAttrs(socket.socket, "sendmsg")
4546 def testInterruptedSendmsgTimeout(self):
4547 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4548
4549
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004550class TCPCloserTest(ThreadedTCPSocketTest):
4551
4552 def testClose(self):
4553 conn, addr = self.serv.accept()
4554 conn.close()
4555
4556 sd = self.cli
4557 read, write, err = select.select([sd], [], [], 1.0)
4558 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004559 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004560
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004561 # Calling close() many times should be safe.
4562 conn.close()
4563 conn.close()
4564
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004565 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004566 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004567 time.sleep(1.0)
4568
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004569
Dave Cole331708b2004-08-09 04:51:41 +00004570class BasicSocketPairTest(SocketPairTest):
4571
4572 def __init__(self, methodName='runTest'):
4573 SocketPairTest.__init__(self, methodName=methodName)
4574
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004575 def _check_defaults(self, sock):
4576 self.assertIsInstance(sock, socket.socket)
4577 if hasattr(socket, 'AF_UNIX'):
4578 self.assertEqual(sock.family, socket.AF_UNIX)
4579 else:
4580 self.assertEqual(sock.family, socket.AF_INET)
4581 self.assertEqual(sock.type, socket.SOCK_STREAM)
4582 self.assertEqual(sock.proto, 0)
4583
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004584 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004585 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004586
4587 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004588 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004589
Dave Cole331708b2004-08-09 04:51:41 +00004590 def testRecv(self):
4591 msg = self.serv.recv(1024)
4592 self.assertEqual(msg, MSG)
4593
4594 def _testRecv(self):
4595 self.cli.send(MSG)
4596
4597 def testSend(self):
4598 self.serv.send(MSG)
4599
4600 def _testSend(self):
4601 msg = self.cli.recv(1024)
4602 self.assertEqual(msg, MSG)
4603
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004604
Guido van Rossum24e4af82002-06-12 19:18:08 +00004605class NonBlockingTCPTests(ThreadedTCPSocketTest):
4606
4607 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004608 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004609 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4610
Victor Stinner304315d2018-11-30 13:22:44 +01004611 def assert_sock_timeout(self, sock, timeout):
4612 self.assertEqual(self.serv.gettimeout(), timeout)
4613
4614 blocking = (timeout != 0.0)
4615 self.assertEqual(sock.getblocking(), blocking)
4616
4617 if fcntl is not None:
4618 # When a Python socket has a non-zero timeout, it's switched
4619 # internally to a non-blocking mode. Later, sock.sendall(),
4620 # sock.recv(), and other socket operations use a select() call and
4621 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4622 # timeouts are enforced.
4623 fd_blocking = (timeout is None)
4624
4625 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4626 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4627
Guido van Rossum24e4af82002-06-12 19:18:08 +00004628 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004629 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004630 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004631 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004632
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004633 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004634 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004635
4636 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004637 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004638
4639 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004640 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004641
4642 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004643 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004644
4645 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004646 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004647
4648 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004649 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004650
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004651 @support.cpython_only
4652 def testSetBlocking_overflow(self):
4653 # Issue 15989
4654 import _testcapi
4655 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4656 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004657
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004658 self.serv.setblocking(False)
4659 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004660
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004661 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4662 self.assertIsNone(self.serv.gettimeout())
4663
4664 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4665
Serhiy Storchaka43767632013-11-03 21:31:38 +02004666 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4667 'test needs socket.SOCK_NONBLOCK')
4668 @support.requires_linux_version(2, 6, 28)
4669 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004670 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004671 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004672 self.serv = socket.socket(socket.AF_INET,
4673 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4674 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004675
4676 def _testInitNonBlocking(self):
4677 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004678
Victor Stinner304315d2018-11-30 13:22:44 +01004679 def testInheritFlagsBlocking(self):
4680 # bpo-7995: accept() on a listening socket with a timeout and the
4681 # default timeout is None, the resulting socket must be blocking.
4682 with socket_setdefaulttimeout(None):
4683 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004684 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004685 self.addCleanup(conn.close)
4686 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004687
Victor Stinner304315d2018-11-30 13:22:44 +01004688 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004689 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004690
4691 def testInheritFlagsTimeout(self):
4692 # bpo-7995: accept() on a listening socket with a timeout and the
4693 # default timeout is None, the resulting socket must inherit
4694 # the default timeout.
4695 default_timeout = 20.0
4696 with socket_setdefaulttimeout(default_timeout):
4697 self.serv.settimeout(10)
4698 conn, addr = self.serv.accept()
4699 self.addCleanup(conn.close)
4700 self.assertEqual(conn.gettimeout(), default_timeout)
4701
4702 def _testInheritFlagsTimeout(self):
4703 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004704
Guido van Rossum24e4af82002-06-12 19:18:08 +00004705 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004706 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004707 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004708
4709 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004710 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004711 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004712 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004713 dt = time.monotonic() - start_time
4714 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004715
4716 self.event.set()
4717
Victor Stinner24c62582019-10-30 12:41:43 +01004718 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004719 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004720 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004721
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004722 # connect() completed: non-blocking accept() doesn't block
4723 conn, addr = self.serv.accept()
4724 self.addCleanup(conn.close)
4725 self.assertIsNone(conn.gettimeout())
4726
Guido van Rossum24e4af82002-06-12 19:18:08 +00004727 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004728 # don't connect before event is set to check
4729 # that non-blocking accept() raises BlockingIOError
4730 self.event.wait()
4731
Christian Heimes5e696852008-04-09 08:37:03 +00004732 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004733
Guido van Rossum24e4af82002-06-12 19:18:08 +00004734 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004735 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004736 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004737 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004738 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004739
4740 # the server didn't send data yet: non-blocking recv() fails
4741 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004742 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004743
4744 self.event.set()
4745
Victor Stinner24c62582019-10-30 12:41:43 +01004746 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004747 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004748 self.fail("Error during select call to non-blocking socket.")
4749
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004750 # the server sent data yet: non-blocking recv() doesn't block
4751 msg = conn.recv(len(MSG))
4752 self.assertEqual(msg, MSG)
4753
Guido van Rossum24e4af82002-06-12 19:18:08 +00004754 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004755 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004756
4757 # don't send anything before event is set to check
4758 # that non-blocking recv() raises BlockingIOError
4759 self.event.wait()
4760
4761 # send data: recv() will no longer block
4762 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004763
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004764
Guido van Rossum24e4af82002-06-12 19:18:08 +00004765class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004766 """Unit tests for the object returned by socket.makefile()
4767
Antoine Pitrou834bd812010-10-13 16:17:14 +00004768 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004769 the client connection. You can read from this file to
4770 get output from the server.
4771
Antoine Pitrou834bd812010-10-13 16:17:14 +00004772 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004773 server connection. You can write to this file to send output
4774 to the client.
4775 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004776
Guido van Rossume9f66142002-08-07 15:46:19 +00004777 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004778 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004779 errors = 'strict'
4780 newline = None
4781
4782 read_mode = 'rb'
4783 read_msg = MSG
4784 write_mode = 'wb'
4785 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004786
Guido van Rossum24e4af82002-06-12 19:18:08 +00004787 def __init__(self, methodName='runTest'):
4788 SocketConnectedTest.__init__(self, methodName=methodName)
4789
4790 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004791 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4792 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004793 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004794 self.read_file = self.cli_conn.makefile(
4795 self.read_mode, self.bufsize,
4796 encoding = self.encoding,
4797 errors = self.errors,
4798 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004799
4800 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004801 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004802 self.read_file.close()
4803 self.assertTrue(self.read_file.closed)
4804 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004805 SocketConnectedTest.tearDown(self)
4806
4807 def clientSetUp(self):
4808 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004809 self.write_file = self.serv_conn.makefile(
4810 self.write_mode, self.bufsize,
4811 encoding = self.encoding,
4812 errors = self.errors,
4813 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004814
4815 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004816 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004817 self.write_file.close()
4818 self.assertTrue(self.write_file.closed)
4819 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004820 SocketConnectedTest.clientTearDown(self)
4821
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004822 def testReadAfterTimeout(self):
4823 # Issue #7322: A file object must disallow further reads
4824 # after a timeout has occurred.
4825 self.cli_conn.settimeout(1)
4826 self.read_file.read(3)
4827 # First read raises a timeout
4828 self.assertRaises(socket.timeout, self.read_file.read, 1)
4829 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004830 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004831 self.read_file.read(1)
4832 self.assertIn("cannot read from timed out object", str(ctx.exception))
4833
4834 def _testReadAfterTimeout(self):
4835 self.write_file.write(self.write_msg[0:3])
4836 self.write_file.flush()
4837 self.serv_finished.wait()
4838
Guido van Rossum24e4af82002-06-12 19:18:08 +00004839 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004840 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004841 first_seg = self.read_file.read(len(self.read_msg)-3)
4842 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004843 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004844 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004845
4846 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004847 self.write_file.write(self.write_msg)
4848 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004849
Guido van Rossum8c943832002-08-08 01:00:28 +00004850 def testFullRead(self):
4851 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004852 msg = self.read_file.read()
4853 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004854
4855 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004856 self.write_file.write(self.write_msg)
4857 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004858
Guido van Rossum24e4af82002-06-12 19:18:08 +00004859 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004860 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004861 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004862 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004863 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004864 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004865 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004866 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004867 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004868
4869 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004870 self.write_file.write(self.write_msg)
4871 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004872
4873 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004874 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004875 line = self.read_file.readline()
4876 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004877
4878 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004879 self.write_file.write(self.write_msg)
4880 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004881
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004882 def testCloseAfterMakefile(self):
4883 # The file returned by makefile should keep the socket open.
4884 self.cli_conn.close()
4885 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004886 msg = self.read_file.read()
4887 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004888
4889 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004890 self.write_file.write(self.write_msg)
4891 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004892
4893 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004894 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004895 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004896 if isinstance(self.read_msg, str):
4897 msg = msg.decode()
4898 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004899
4900 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004901 self.write_file.write(self.write_msg)
4902 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004903
Tim Peters116d83c2004-03-28 02:20:45 +00004904 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004905 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004906
4907 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004908 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004909
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004910 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004911 self.assertEqual(self.read_file.mode, self.read_mode)
4912 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004913
4914 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004915 self.assertEqual(self.write_file.mode, self.write_mode)
4916 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004917
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004918 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004919 self.read_file.close()
4920 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004921 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004922 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004923
4924 def _testRealClose(self):
4925 pass
4926
4927
Guido van Rossume9f66142002-08-07 15:46:19 +00004928class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4929
4930 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004931
Guido van Rossume9f66142002-08-07 15:46:19 +00004932 In this case (and in this case only), it should be possible to
4933 create a file object, read a line from it, create another file
4934 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004935 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004936 when reading multiple requests from the same socket."""
4937
4938 bufsize = 0 # Use unbuffered mode
4939
4940 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004941 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004942 line = self.read_file.readline() # first line
4943 self.assertEqual(line, b"A. " + self.write_msg) # first line
4944 self.read_file = self.cli_conn.makefile('rb', 0)
4945 line = self.read_file.readline() # second line
4946 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004947
4948 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004949 self.write_file.write(b"A. " + self.write_msg)
4950 self.write_file.write(b"B. " + self.write_msg)
4951 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004952
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004953 def testMakefileClose(self):
4954 # The file returned by makefile should keep the socket open...
4955 self.cli_conn.close()
4956 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004957 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004958 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004959 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004960 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004961
4962 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004963 self.write_file.write(self.write_msg)
4964 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004965
4966 def testMakefileCloseSocketDestroy(self):
4967 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004968 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004969 refcount_after = sys.getrefcount(self.cli_conn)
4970 self.assertEqual(refcount_before - 1, refcount_after)
4971
4972 def _testMakefileCloseSocketDestroy(self):
4973 pass
4974
Antoine Pitrou98b46702010-09-18 22:59:00 +00004975 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004976 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004977 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4978
4979 def testSmallReadNonBlocking(self):
4980 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004981 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4982 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004983 self.evt1.set()
4984 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004985 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004986 if first_seg is None:
4987 # Data not arrived (can happen under Windows), wait a bit
4988 time.sleep(0.5)
4989 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004990 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004991 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004992 self.assertEqual(n, 3)
4993 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004994 self.assertEqual(msg, self.read_msg)
4995 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4996 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004997
4998 def _testSmallReadNonBlocking(self):
4999 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005000 self.write_file.write(self.write_msg)
5001 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00005002 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03005003 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00005004 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
5005 self.serv_finished.wait(5.0)
5006
5007 def testWriteNonBlocking(self):
5008 self.cli_finished.wait(5.0)
5009 # The client thread can't skip directly - the SkipTest exception
5010 # would appear as a failure.
5011 if self.serv_skipped:
5012 self.skipTest(self.serv_skipped)
5013
5014 def _testWriteNonBlocking(self):
5015 self.serv_skipped = None
5016 self.serv_conn.setblocking(False)
5017 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02005018 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00005019 LIMIT = 10
5020 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00005021 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005022 self.assertGreater(n, 0)
5023 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005024 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005025 if n is None:
5026 # Succeeded
5027 break
5028 self.assertGreater(n, 0)
5029 else:
5030 # Let us know that this test didn't manage to establish
5031 # the expected conditions. This is not a failure in itself but,
5032 # if it happens repeatedly, the test should be fixed.
5033 self.serv_skipped = "failed to saturate the socket buffer"
5034
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005035
Guido van Rossum8c943832002-08-08 01:00:28 +00005036class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5037
5038 bufsize = 1 # Default-buffered for reading; line-buffered for writing
5039
5040
5041class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5042
5043 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00005044
Thomas Woutersb2137042007-02-01 18:02:27 +00005045
Antoine Pitrou834bd812010-10-13 16:17:14 +00005046class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5047 """Tests for socket.makefile() in text mode (rather than binary)"""
5048
5049 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005050 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005051 write_mode = 'wb'
5052 write_msg = MSG
5053 newline = ''
5054
5055
5056class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5057 """Tests for socket.makefile() in text mode (rather than binary)"""
5058
5059 read_mode = 'rb'
5060 read_msg = MSG
5061 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005062 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005063 newline = ''
5064
5065
5066class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5067 """Tests for socket.makefile() in text mode (rather than binary)"""
5068
5069 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005070 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005071 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005072 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005073 newline = ''
5074
5075
Guido van Rossumd8faa362007-04-27 19:54:29 +00005076class NetworkConnectionTest(object):
5077 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005078
Guido van Rossumd8faa362007-04-27 19:54:29 +00005079 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005080 # We're inherited below by BasicTCPTest2, which also inherits
5081 # BasicTCPTest, which defines self.port referenced below.
5082 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005083 self.serv_conn = self.cli
5084
5085class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5086 """Tests that NetworkConnection does not break existing TCP functionality.
5087 """
5088
5089class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005090
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005091 class MockSocket(socket.socket):
5092 def connect(self, *args):
5093 raise socket.timeout('timed out')
5094
5095 @contextlib.contextmanager
5096 def mocked_socket_module(self):
5097 """Return a socket which times out on connect"""
5098 old_socket = socket.socket
5099 socket.socket = self.MockSocket
5100 try:
5101 yield
5102 finally:
5103 socket.socket = old_socket
5104
5105 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005106 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005107 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005108 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005109 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005110 cli.connect((HOST, port))
5111 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5112
5113 def test_create_connection(self):
5114 # Issue #9792: errors raised by create_connection() should have
5115 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005116 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005117 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005118 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005119
5120 # Issue #16257: create_connection() calls getaddrinfo() against
5121 # 'localhost'. This may result in an IPV6 addr being returned
5122 # as well as an IPV4 one:
5123 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5124 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5125 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5126 #
5127 # create_connection() enumerates through all the addresses returned
5128 # and if it doesn't successfully bind to any of them, it propagates
5129 # the last exception it encountered.
5130 #
5131 # On Solaris, ENETUNREACH is returned in this circumstance instead
5132 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5133 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005134 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005135 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005136
5137 def test_create_connection_timeout(self):
5138 # Issue #9792: create_connection() should not recast timeout errors
5139 # as generic socket errors.
5140 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005141 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005142 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005143 except socket.timeout:
5144 pass
5145 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005146 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005147 raise
5148 else:
5149 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005150
Guido van Rossumd8faa362007-04-27 19:54:29 +00005151
5152class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5153
5154 def __init__(self, methodName='runTest'):
5155 SocketTCPTest.__init__(self, methodName=methodName)
5156 ThreadableTest.__init__(self)
5157
5158 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005159 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005160
5161 def clientTearDown(self):
5162 self.cli.close()
5163 self.cli = None
5164 ThreadableTest.clientTearDown(self)
5165
5166 def _justAccept(self):
5167 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005168 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005169
5170 testFamily = _justAccept
5171 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005172 self.cli = socket.create_connection((HOST, self.port),
5173 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005174 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005175 self.assertEqual(self.cli.family, 2)
5176
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005177 testSourceAddress = _justAccept
5178 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005179 self.cli = socket.create_connection((HOST, self.port),
5180 timeout=support.LOOPBACK_TIMEOUT,
5181 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005182 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005183 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005184 # The port number being used is sufficient to show that the bind()
5185 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005186
Guido van Rossumd8faa362007-04-27 19:54:29 +00005187 testTimeoutDefault = _justAccept
5188 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005189 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005190 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005191 socket.setdefaulttimeout(42)
5192 try:
5193 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005194 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005195 finally:
5196 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005197 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005198
5199 testTimeoutNone = _justAccept
5200 def _testTimeoutNone(self):
5201 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005202 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005203 socket.setdefaulttimeout(30)
5204 try:
5205 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005206 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005207 finally:
5208 socket.setdefaulttimeout(None)
5209 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005210
5211 testTimeoutValueNamed = _justAccept
5212 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005213 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005214 self.assertEqual(self.cli.gettimeout(), 30)
5215
5216 testTimeoutValueNonamed = _justAccept
5217 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005218 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005219 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005220 self.assertEqual(self.cli.gettimeout(), 30)
5221
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005222
Guido van Rossumd8faa362007-04-27 19:54:29 +00005223class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5224
5225 def __init__(self, methodName='runTest'):
5226 SocketTCPTest.__init__(self, methodName=methodName)
5227 ThreadableTest.__init__(self)
5228
5229 def clientSetUp(self):
5230 pass
5231
5232 def clientTearDown(self):
5233 self.cli.close()
5234 self.cli = None
5235 ThreadableTest.clientTearDown(self)
5236
5237 def testInsideTimeout(self):
5238 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005239 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005240 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005241 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005242 testOutsideTimeout = testInsideTimeout
5243
5244 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005245 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005246 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005247 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005248
5249 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005250 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005251 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005252
5253
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005254class TCPTimeoutTest(SocketTCPTest):
5255
5256 def testTCPTimeout(self):
5257 def raise_timeout(*args, **kwargs):
5258 self.serv.settimeout(1.0)
5259 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005260 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005261 "Error generating a timeout exception (TCP)")
5262
5263 def testTimeoutZero(self):
5264 ok = False
5265 try:
5266 self.serv.settimeout(0.0)
5267 foo = self.serv.accept()
5268 except socket.timeout:
5269 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005270 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005271 ok = True
5272 except:
5273 self.fail("caught unexpected exception (TCP)")
5274 if not ok:
5275 self.fail("accept() returned success when we did not expect it")
5276
Serhiy Storchaka43767632013-11-03 21:31:38 +02005277 @unittest.skipUnless(hasattr(signal, 'alarm'),
5278 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005279 def testInterruptedTimeout(self):
5280 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005281 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005282 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005283 self.serv.settimeout(5.0) # must be longer than alarm
5284 class Alarm(Exception):
5285 pass
5286 def alarm_handler(signal, frame):
5287 raise Alarm
5288 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5289 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005290 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005291 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005292 foo = self.serv.accept()
5293 except socket.timeout:
5294 self.fail("caught timeout instead of Alarm")
5295 except Alarm:
5296 pass
5297 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005298 self.fail("caught other exception instead of Alarm:"
5299 " %s(%s):\n%s" %
5300 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005301 else:
5302 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005303 finally:
5304 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005305 except Alarm:
5306 self.fail("got Alarm in wrong place")
5307 finally:
5308 # no alarm can be pending. Safe to restore old handler.
5309 signal.signal(signal.SIGALRM, old_alarm)
5310
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005311class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005312
5313 def testUDPTimeout(self):
5314 def raise_timeout(*args, **kwargs):
5315 self.serv.settimeout(1.0)
5316 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005317 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005318 "Error generating a timeout exception (UDP)")
5319
5320 def testTimeoutZero(self):
5321 ok = False
5322 try:
5323 self.serv.settimeout(0.0)
5324 foo = self.serv.recv(1024)
5325 except socket.timeout:
5326 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005327 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005328 ok = True
5329 except:
5330 self.fail("caught unexpected exception (UDP)")
5331 if not ok:
5332 self.fail("recv() returned success when we did not expect it")
5333
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005334@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5335 'UDPLITE sockets required for this test.')
5336class UDPLITETimeoutTest(SocketUDPLITETest):
5337
5338 def testUDPLITETimeout(self):
5339 def raise_timeout(*args, **kwargs):
5340 self.serv.settimeout(1.0)
5341 self.serv.recv(1024)
5342 self.assertRaises(socket.timeout, raise_timeout,
5343 "Error generating a timeout exception (UDPLITE)")
5344
5345 def testTimeoutZero(self):
5346 ok = False
5347 try:
5348 self.serv.settimeout(0.0)
5349 foo = self.serv.recv(1024)
5350 except socket.timeout:
5351 self.fail("caught timeout instead of error (UDPLITE)")
5352 except OSError:
5353 ok = True
5354 except:
5355 self.fail("caught unexpected exception (UDPLITE)")
5356 if not ok:
5357 self.fail("recv() returned success when we did not expect it")
5358
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005359class TestExceptions(unittest.TestCase):
5360
5361 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005362 self.assertTrue(issubclass(OSError, Exception))
5363 self.assertTrue(issubclass(socket.herror, OSError))
5364 self.assertTrue(issubclass(socket.gaierror, OSError))
5365 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005366
Yury Selivanovfa22b292016-10-18 16:03:52 -04005367 def test_setblocking_invalidfd(self):
5368 # Regression test for issue #28471
5369
5370 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5371 sock = socket.socket(
5372 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5373 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005374 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005375
5376 with self.assertRaises(OSError):
5377 sock.setblocking(False)
5378
5379
Serhiy Storchaka43767632013-11-03 21:31:38 +02005380@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005381class TestLinuxAbstractNamespace(unittest.TestCase):
5382
5383 UNIX_PATH_MAX = 108
5384
5385 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005386 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005387 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5388 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005389 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005390 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5391 s2.connect(s1.getsockname())
5392 with s1.accept()[0] as s3:
5393 self.assertEqual(s1.getsockname(), address)
5394 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005395
5396 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005397 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005398 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5399 s.bind(address)
5400 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005401
5402 def testNameOverflow(self):
5403 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005404 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005405 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005406
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005407 def testStrName(self):
5408 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005409 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5410 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005411 s.bind("\x00python\x00test\x00")
5412 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005413 finally:
5414 s.close()
5415
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005416 def testBytearrayName(self):
5417 # Check that an abstract name can be passed as a bytearray.
5418 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5419 s.bind(bytearray(b"\x00python\x00test\x00"))
5420 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5421
Serhiy Storchaka43767632013-11-03 21:31:38 +02005422@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005423class TestUnixDomain(unittest.TestCase):
5424
5425 def setUp(self):
5426 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5427
5428 def tearDown(self):
5429 self.sock.close()
5430
5431 def encoded(self, path):
5432 # Return the given path encoded in the file system encoding,
5433 # or skip the test if this is not possible.
5434 try:
5435 return os.fsencode(path)
5436 except UnicodeEncodeError:
5437 self.skipTest(
5438 "Pathname {0!a} cannot be represented in file "
5439 "system encoding {1!r}".format(
5440 path, sys.getfilesystemencoding()))
5441
Antoine Pitrou16374872011-12-16 15:04:12 +01005442 def bind(self, sock, path):
5443 # Bind the socket
5444 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005445 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005446 except OSError as e:
5447 if str(e) == "AF_UNIX path too long":
5448 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005449 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005450 .format(path))
5451 else:
5452 raise
5453
Antoine Pitrou495b5022017-05-02 17:20:00 +02005454 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005455 # Issue #30205 (note getsockname() can return None on OS X)
5456 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005457
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005458 def testStrAddr(self):
5459 # Test binding to and retrieving a normal string pathname.
5460 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005461 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005462 self.addCleanup(support.unlink, path)
5463 self.assertEqual(self.sock.getsockname(), path)
5464
5465 def testBytesAddr(self):
5466 # Test binding to a bytes pathname.
5467 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005468 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005469 self.addCleanup(support.unlink, path)
5470 self.assertEqual(self.sock.getsockname(), path)
5471
5472 def testSurrogateescapeBind(self):
5473 # Test binding to a valid non-ASCII pathname, with the
5474 # non-ASCII bytes supplied using surrogateescape encoding.
5475 path = os.path.abspath(support.TESTFN_UNICODE)
5476 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005477 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005478 self.addCleanup(support.unlink, path)
5479 self.assertEqual(self.sock.getsockname(), path)
5480
5481 def testUnencodableAddr(self):
5482 # Test binding to a pathname that cannot be encoded in the
5483 # file system encoding.
5484 if support.TESTFN_UNENCODABLE is None:
5485 self.skipTest("No unencodable filename available")
5486 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005487 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005488 self.addCleanup(support.unlink, path)
5489 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005490
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005491
Thomas Wouters477c8d52006-05-27 19:21:47 +00005492class BufferIOTest(SocketConnectedTest):
5493 """
5494 Test the buffer versions of socket.recv() and socket.send().
5495 """
5496 def __init__(self, methodName='runTest'):
5497 SocketConnectedTest.__init__(self, methodName=methodName)
5498
Antoine Pitrou25480782010-03-17 22:50:28 +00005499 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005500 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005501 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005502 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005503 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005504 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005505 self.assertEqual(msg, MSG)
5506
Antoine Pitrou25480782010-03-17 22:50:28 +00005507 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005508 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005509 self.serv_conn.send(buf)
5510
Antoine Pitrou25480782010-03-17 22:50:28 +00005511 def testRecvIntoBytearray(self):
5512 buf = bytearray(1024)
5513 nbytes = self.cli_conn.recv_into(buf)
5514 self.assertEqual(nbytes, len(MSG))
5515 msg = buf[:len(MSG)]
5516 self.assertEqual(msg, MSG)
5517
5518 _testRecvIntoBytearray = _testRecvIntoArray
5519
5520 def testRecvIntoMemoryview(self):
5521 buf = bytearray(1024)
5522 nbytes = self.cli_conn.recv_into(memoryview(buf))
5523 self.assertEqual(nbytes, len(MSG))
5524 msg = buf[:len(MSG)]
5525 self.assertEqual(msg, MSG)
5526
5527 _testRecvIntoMemoryview = _testRecvIntoArray
5528
5529 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005530 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005531 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005532 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005533 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005534 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005535 self.assertEqual(msg, MSG)
5536
Antoine Pitrou25480782010-03-17 22:50:28 +00005537 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005538 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005539 self.serv_conn.send(buf)
5540
Antoine Pitrou25480782010-03-17 22:50:28 +00005541 def testRecvFromIntoBytearray(self):
5542 buf = bytearray(1024)
5543 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5544 self.assertEqual(nbytes, len(MSG))
5545 msg = buf[:len(MSG)]
5546 self.assertEqual(msg, MSG)
5547
5548 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5549
5550 def testRecvFromIntoMemoryview(self):
5551 buf = bytearray(1024)
5552 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5553 self.assertEqual(nbytes, len(MSG))
5554 msg = buf[:len(MSG)]
5555 self.assertEqual(msg, MSG)
5556
5557 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5558
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005559 def testRecvFromIntoSmallBuffer(self):
5560 # See issue #20246.
5561 buf = bytearray(8)
5562 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5563
5564 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005565 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005566
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005567 def testRecvFromIntoEmptyBuffer(self):
5568 buf = bytearray()
5569 self.cli_conn.recvfrom_into(buf)
5570 self.cli_conn.recvfrom_into(buf, 0)
5571
5572 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5573
Christian Heimes043d6f62008-01-07 17:19:16 +00005574
5575TIPC_STYPE = 2000
5576TIPC_LOWER = 200
5577TIPC_UPPER = 210
5578
5579def isTipcAvailable():
5580 """Check if the TIPC module is loaded
5581
5582 The TIPC module is not loaded automatically on Ubuntu and probably
5583 other Linux distros.
5584 """
5585 if not hasattr(socket, "AF_TIPC"):
5586 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005587 try:
5588 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005589 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005590 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005591 # have not the permission to read it.
5592 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005593 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005594 for line in f:
5595 if line.startswith("tipc "):
5596 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005597 return False
5598
Serhiy Storchaka43767632013-11-03 21:31:38 +02005599@unittest.skipUnless(isTipcAvailable(),
5600 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005601class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005602 def testRDM(self):
5603 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5604 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005605 self.addCleanup(srv.close)
5606 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005607
5608 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5609 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5610 TIPC_LOWER, TIPC_UPPER)
5611 srv.bind(srvaddr)
5612
5613 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5614 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5615 cli.sendto(MSG, sendaddr)
5616
5617 msg, recvaddr = srv.recvfrom(1024)
5618
5619 self.assertEqual(cli.getsockname(), recvaddr)
5620 self.assertEqual(msg, MSG)
5621
5622
Serhiy Storchaka43767632013-11-03 21:31:38 +02005623@unittest.skipUnless(isTipcAvailable(),
5624 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005625class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005626 def __init__(self, methodName = 'runTest'):
5627 unittest.TestCase.__init__(self, methodName = methodName)
5628 ThreadableTest.__init__(self)
5629
5630 def setUp(self):
5631 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005632 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005633 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5634 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5635 TIPC_LOWER, TIPC_UPPER)
5636 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005637 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005638 self.serverExplicitReady()
5639 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005640 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005641
5642 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005643 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005644 # accept() call; sleep a little while to avoid it, otherwise
5645 # we could get an exception
5646 time.sleep(0.1)
5647 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005648 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005649 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5650 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5651 self.cli.connect(addr)
5652 self.cliaddr = self.cli.getsockname()
5653
5654 def testStream(self):
5655 msg = self.conn.recv(1024)
5656 self.assertEqual(msg, MSG)
5657 self.assertEqual(self.cliaddr, self.connaddr)
5658
5659 def _testStream(self):
5660 self.cli.send(MSG)
5661 self.cli.close()
5662
5663
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005664class ContextManagersTest(ThreadedTCPSocketTest):
5665
5666 def _testSocketClass(self):
5667 # base test
5668 with socket.socket() as sock:
5669 self.assertFalse(sock._closed)
5670 self.assertTrue(sock._closed)
5671 # close inside with block
5672 with socket.socket() as sock:
5673 sock.close()
5674 self.assertTrue(sock._closed)
5675 # exception inside with block
5676 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005677 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005678 self.assertTrue(sock._closed)
5679
5680 def testCreateConnectionBase(self):
5681 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005682 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005683 data = conn.recv(1024)
5684 conn.sendall(data)
5685
5686 def _testCreateConnectionBase(self):
5687 address = self.serv.getsockname()
5688 with socket.create_connection(address) as sock:
5689 self.assertFalse(sock._closed)
5690 sock.sendall(b'foo')
5691 self.assertEqual(sock.recv(1024), b'foo')
5692 self.assertTrue(sock._closed)
5693
5694 def testCreateConnectionClose(self):
5695 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005696 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005697 data = conn.recv(1024)
5698 conn.sendall(data)
5699
5700 def _testCreateConnectionClose(self):
5701 address = self.serv.getsockname()
5702 with socket.create_connection(address) as sock:
5703 sock.close()
5704 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005705 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005706
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005707
Victor Stinnerdaf45552013-08-28 00:53:59 +02005708class InheritanceTest(unittest.TestCase):
5709 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5710 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005711 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005712 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005713 with socket.socket(socket.AF_INET,
5714 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005715 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005716 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005717
5718 def test_default_inheritable(self):
5719 sock = socket.socket()
5720 with sock:
5721 self.assertEqual(sock.get_inheritable(), False)
5722
5723 def test_dup(self):
5724 sock = socket.socket()
5725 with sock:
5726 newsock = sock.dup()
5727 sock.close()
5728 with newsock:
5729 self.assertEqual(newsock.get_inheritable(), False)
5730
5731 def test_set_inheritable(self):
5732 sock = socket.socket()
5733 with sock:
5734 sock.set_inheritable(True)
5735 self.assertEqual(sock.get_inheritable(), True)
5736
5737 sock.set_inheritable(False)
5738 self.assertEqual(sock.get_inheritable(), False)
5739
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005740 @unittest.skipIf(fcntl is None, "need fcntl")
5741 def test_get_inheritable_cloexec(self):
5742 sock = socket.socket()
5743 with sock:
5744 fd = sock.fileno()
5745 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005746
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005747 # clear FD_CLOEXEC flag
5748 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5749 flags &= ~fcntl.FD_CLOEXEC
5750 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005751
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005752 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005753
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005754 @unittest.skipIf(fcntl is None, "need fcntl")
5755 def test_set_inheritable_cloexec(self):
5756 sock = socket.socket()
5757 with sock:
5758 fd = sock.fileno()
5759 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5760 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005761
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005762 sock.set_inheritable(True)
5763 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5764 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005765
5766
Victor Stinnerdaf45552013-08-28 00:53:59 +02005767 def test_socketpair(self):
5768 s1, s2 = socket.socketpair()
5769 self.addCleanup(s1.close)
5770 self.addCleanup(s2.close)
5771 self.assertEqual(s1.get_inheritable(), False)
5772 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005773
5774
5775@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5776 "SOCK_NONBLOCK not defined")
5777class NonblockConstantTest(unittest.TestCase):
5778 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5779 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005780 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005781 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005782 self.assertTrue(
5783 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005784 if timeout == 0:
5785 # timeout == 0: means that getblocking() must be False.
5786 self.assertFalse(s.getblocking())
5787 else:
5788 # If timeout > 0, the socket will be in a "blocking" mode
5789 # from the standpoint of the Python API. For Python socket
5790 # object, "blocking" means that operations like 'sock.recv()'
5791 # will block. Internally, file descriptors for
5792 # "blocking" Python sockets *with timeouts* are in a
5793 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5794 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5795 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005796 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005797 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005798 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005799 self.assertFalse(
5800 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005801 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005802
Charles-François Natali239bb962011-06-03 12:55:15 +02005803 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005804 def test_SOCK_NONBLOCK(self):
5805 # a lot of it seems silly and redundant, but I wanted to test that
5806 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005807 with socket.socket(socket.AF_INET,
5808 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5809 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005810 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005811 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005812 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005813 self.checkNonblock(s)
5814 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005815 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005816 s.settimeout(2.0)
5817 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005818 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005819 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005820 # defaulttimeout
5821 t = socket.getdefaulttimeout()
5822 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005823 with socket.socket() as s:
5824 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005825 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005826 with socket.socket() as s:
5827 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005828 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005829 with socket.socket() as s:
5830 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005831 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005832 with socket.socket() as s:
5833 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005834 socket.setdefaulttimeout(t)
5835
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005836
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005837@unittest.skipUnless(os.name == "nt", "Windows specific")
5838@unittest.skipUnless(multiprocessing, "need multiprocessing")
5839class TestSocketSharing(SocketTCPTest):
5840 # This must be classmethod and not staticmethod or multiprocessing
5841 # won't be able to bootstrap it.
5842 @classmethod
5843 def remoteProcessServer(cls, q):
5844 # Recreate socket from shared data
5845 sdata = q.get()
5846 message = q.get()
5847
5848 s = socket.fromshare(sdata)
5849 s2, c = s.accept()
5850
5851 # Send the message
5852 s2.sendall(message)
5853 s2.close()
5854 s.close()
5855
5856 def testShare(self):
5857 # Transfer the listening server socket to another process
5858 # and service it from there.
5859
5860 # Create process:
5861 q = multiprocessing.Queue()
5862 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5863 p.start()
5864
5865 # Get the shared socket data
5866 data = self.serv.share(p.pid)
5867
5868 # Pass the shared socket to the other process
5869 addr = self.serv.getsockname()
5870 self.serv.close()
5871 q.put(data)
5872
5873 # The data that the server will send us
5874 message = b"slapmahfro"
5875 q.put(message)
5876
5877 # Connect
5878 s = socket.create_connection(addr)
5879 # listen for the data
5880 m = []
5881 while True:
5882 data = s.recv(100)
5883 if not data:
5884 break
5885 m.append(data)
5886 s.close()
5887 received = b"".join(m)
5888 self.assertEqual(received, message)
5889 p.join()
5890
5891 def testShareLength(self):
5892 data = self.serv.share(os.getpid())
5893 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5894 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5895
5896 def compareSockets(self, org, other):
5897 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005898 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005899 self.assertEqual(org.gettimeout(), None)
5900 self.assertEqual(org.gettimeout(), other.gettimeout())
5901
5902 self.assertEqual(org.family, other.family)
5903 self.assertEqual(org.type, other.type)
5904 # If the user specified "0" for proto, then
5905 # internally windows will have picked the correct value.
5906 # Python introspection on the socket however will still return
5907 # 0. For the shared socket, the python value is recreated
5908 # from the actual value, so it may not compare correctly.
5909 if org.proto != 0:
5910 self.assertEqual(org.proto, other.proto)
5911
5912 def testShareLocal(self):
5913 data = self.serv.share(os.getpid())
5914 s = socket.fromshare(data)
5915 try:
5916 self.compareSockets(self.serv, s)
5917 finally:
5918 s.close()
5919
5920 def testTypes(self):
5921 families = [socket.AF_INET, socket.AF_INET6]
5922 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5923 for f in families:
5924 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005925 try:
5926 source = socket.socket(f, t)
5927 except OSError:
5928 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005929 try:
5930 data = source.share(os.getpid())
5931 shared = socket.fromshare(data)
5932 try:
5933 self.compareSockets(source, shared)
5934 finally:
5935 shared.close()
5936 finally:
5937 source.close()
5938
5939
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005940class SendfileUsingSendTest(ThreadedTCPSocketTest):
5941 """
5942 Test the send() implementation of socket.sendfile().
5943 """
5944
Victor Stinner8c663fd2017-11-08 14:44:44 -08005945 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005946 BUFSIZE = 8192
5947 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005948 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005949
5950 @classmethod
5951 def setUpClass(cls):
5952 def chunks(total, step):
5953 assert total >= step
5954 while total > step:
5955 yield step
5956 total -= step
5957 if total:
5958 yield total
5959
5960 chunk = b"".join([random.choice(string.ascii_letters).encode()
5961 for i in range(cls.BUFSIZE)])
5962 with open(support.TESTFN, 'wb') as f:
5963 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5964 f.write(chunk)
5965 with open(support.TESTFN, 'rb') as f:
5966 cls.FILEDATA = f.read()
5967 assert len(cls.FILEDATA) == cls.FILESIZE
5968
5969 @classmethod
5970 def tearDownClass(cls):
5971 support.unlink(support.TESTFN)
5972
5973 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005974 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005975 conn, addr = self.serv.accept()
5976 conn.settimeout(self.TIMEOUT)
5977 self.addCleanup(conn.close)
5978 return conn
5979
5980 def recv_data(self, conn):
5981 received = []
5982 while True:
5983 chunk = conn.recv(self.BUFSIZE)
5984 if not chunk:
5985 break
5986 received.append(chunk)
5987 return b''.join(received)
5988
5989 def meth_from_sock(self, sock):
5990 # Depending on the mixin class being run return either send()
5991 # or sendfile() method implementation.
5992 return getattr(sock, "_sendfile_use_send")
5993
5994 # regular file
5995
5996 def _testRegularFile(self):
5997 address = self.serv.getsockname()
5998 file = open(support.TESTFN, 'rb')
5999 with socket.create_connection(address) as sock, file as file:
6000 meth = self.meth_from_sock(sock)
6001 sent = meth(file)
6002 self.assertEqual(sent, self.FILESIZE)
6003 self.assertEqual(file.tell(), self.FILESIZE)
6004
6005 def testRegularFile(self):
6006 conn = self.accept_conn()
6007 data = self.recv_data(conn)
6008 self.assertEqual(len(data), self.FILESIZE)
6009 self.assertEqual(data, self.FILEDATA)
6010
6011 # non regular file
6012
6013 def _testNonRegularFile(self):
6014 address = self.serv.getsockname()
6015 file = io.BytesIO(self.FILEDATA)
6016 with socket.create_connection(address) as sock, file as file:
6017 sent = sock.sendfile(file)
6018 self.assertEqual(sent, self.FILESIZE)
6019 self.assertEqual(file.tell(), self.FILESIZE)
6020 self.assertRaises(socket._GiveupOnSendfile,
6021 sock._sendfile_use_sendfile, file)
6022
6023 def testNonRegularFile(self):
6024 conn = self.accept_conn()
6025 data = self.recv_data(conn)
6026 self.assertEqual(len(data), self.FILESIZE)
6027 self.assertEqual(data, self.FILEDATA)
6028
6029 # empty file
6030
6031 def _testEmptyFileSend(self):
6032 address = self.serv.getsockname()
6033 filename = support.TESTFN + "2"
6034 with open(filename, 'wb'):
6035 self.addCleanup(support.unlink, filename)
6036 file = open(filename, 'rb')
6037 with socket.create_connection(address) as sock, file as file:
6038 meth = self.meth_from_sock(sock)
6039 sent = meth(file)
6040 self.assertEqual(sent, 0)
6041 self.assertEqual(file.tell(), 0)
6042
6043 def testEmptyFileSend(self):
6044 conn = self.accept_conn()
6045 data = self.recv_data(conn)
6046 self.assertEqual(data, b"")
6047
6048 # offset
6049
6050 def _testOffset(self):
6051 address = self.serv.getsockname()
6052 file = open(support.TESTFN, 'rb')
6053 with socket.create_connection(address) as sock, file as file:
6054 meth = self.meth_from_sock(sock)
6055 sent = meth(file, offset=5000)
6056 self.assertEqual(sent, self.FILESIZE - 5000)
6057 self.assertEqual(file.tell(), self.FILESIZE)
6058
6059 def testOffset(self):
6060 conn = self.accept_conn()
6061 data = self.recv_data(conn)
6062 self.assertEqual(len(data), self.FILESIZE - 5000)
6063 self.assertEqual(data, self.FILEDATA[5000:])
6064
6065 # count
6066
6067 def _testCount(self):
6068 address = self.serv.getsockname()
6069 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006070 sock = socket.create_connection(address,
6071 timeout=support.LOOPBACK_TIMEOUT)
6072 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006073 count = 5000007
6074 meth = self.meth_from_sock(sock)
6075 sent = meth(file, count=count)
6076 self.assertEqual(sent, count)
6077 self.assertEqual(file.tell(), count)
6078
6079 def testCount(self):
6080 count = 5000007
6081 conn = self.accept_conn()
6082 data = self.recv_data(conn)
6083 self.assertEqual(len(data), count)
6084 self.assertEqual(data, self.FILEDATA[:count])
6085
6086 # count small
6087
6088 def _testCountSmall(self):
6089 address = self.serv.getsockname()
6090 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006091 sock = socket.create_connection(address,
6092 timeout=support.LOOPBACK_TIMEOUT)
6093 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006094 count = 1
6095 meth = self.meth_from_sock(sock)
6096 sent = meth(file, count=count)
6097 self.assertEqual(sent, count)
6098 self.assertEqual(file.tell(), count)
6099
6100 def testCountSmall(self):
6101 count = 1
6102 conn = self.accept_conn()
6103 data = self.recv_data(conn)
6104 self.assertEqual(len(data), count)
6105 self.assertEqual(data, self.FILEDATA[:count])
6106
6107 # count + offset
6108
6109 def _testCountWithOffset(self):
6110 address = self.serv.getsockname()
6111 file = open(support.TESTFN, 'rb')
6112 with socket.create_connection(address, timeout=2) as sock, file as file:
6113 count = 100007
6114 meth = self.meth_from_sock(sock)
6115 sent = meth(file, offset=2007, count=count)
6116 self.assertEqual(sent, count)
6117 self.assertEqual(file.tell(), count + 2007)
6118
6119 def testCountWithOffset(self):
6120 count = 100007
6121 conn = self.accept_conn()
6122 data = self.recv_data(conn)
6123 self.assertEqual(len(data), count)
6124 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6125
6126 # non blocking sockets are not supposed to work
6127
6128 def _testNonBlocking(self):
6129 address = self.serv.getsockname()
6130 file = open(support.TESTFN, 'rb')
6131 with socket.create_connection(address) as sock, file as file:
6132 sock.setblocking(False)
6133 meth = self.meth_from_sock(sock)
6134 self.assertRaises(ValueError, meth, file)
6135 self.assertRaises(ValueError, sock.sendfile, file)
6136
6137 def testNonBlocking(self):
6138 conn = self.accept_conn()
6139 if conn.recv(8192):
6140 self.fail('was not supposed to receive any data')
6141
6142 # timeout (non-triggered)
6143
6144 def _testWithTimeout(self):
6145 address = self.serv.getsockname()
6146 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006147 sock = socket.create_connection(address,
6148 timeout=support.LOOPBACK_TIMEOUT)
6149 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006150 meth = self.meth_from_sock(sock)
6151 sent = meth(file)
6152 self.assertEqual(sent, self.FILESIZE)
6153
6154 def testWithTimeout(self):
6155 conn = self.accept_conn()
6156 data = self.recv_data(conn)
6157 self.assertEqual(len(data), self.FILESIZE)
6158 self.assertEqual(data, self.FILEDATA)
6159
6160 # timeout (triggered)
6161
6162 def _testWithTimeoutTriggeredSend(self):
6163 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006164 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006165 with socket.create_connection(address) as sock:
6166 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006167 meth = self.meth_from_sock(sock)
6168 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006169
6170 def testWithTimeoutTriggeredSend(self):
6171 conn = self.accept_conn()
6172 conn.recv(88192)
6173
6174 # errors
6175
6176 def _test_errors(self):
6177 pass
6178
6179 def test_errors(self):
6180 with open(support.TESTFN, 'rb') as file:
6181 with socket.socket(type=socket.SOCK_DGRAM) as s:
6182 meth = self.meth_from_sock(s)
6183 self.assertRaisesRegex(
6184 ValueError, "SOCK_STREAM", meth, file)
6185 with open(support.TESTFN, 'rt') as file:
6186 with socket.socket() as s:
6187 meth = self.meth_from_sock(s)
6188 self.assertRaisesRegex(
6189 ValueError, "binary mode", meth, file)
6190 with open(support.TESTFN, 'rb') as file:
6191 with socket.socket() as s:
6192 meth = self.meth_from_sock(s)
6193 self.assertRaisesRegex(TypeError, "positive integer",
6194 meth, file, count='2')
6195 self.assertRaisesRegex(TypeError, "positive integer",
6196 meth, file, count=0.1)
6197 self.assertRaisesRegex(ValueError, "positive integer",
6198 meth, file, count=0)
6199 self.assertRaisesRegex(ValueError, "positive integer",
6200 meth, file, count=-1)
6201
6202
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006203@unittest.skipUnless(hasattr(os, "sendfile"),
6204 'os.sendfile() required for this test.')
6205class SendfileUsingSendfileTest(SendfileUsingSendTest):
6206 """
6207 Test the sendfile() implementation of socket.sendfile().
6208 """
6209 def meth_from_sock(self, sock):
6210 return getattr(sock, "_sendfile_use_sendfile")
6211
Christian Heimes48371412016-09-06 00:37:46 +02006212
6213@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006214class LinuxKernelCryptoAPI(unittest.TestCase):
6215 # tests for AF_ALG
6216 def create_alg(self, typ, name):
6217 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006218 try:
6219 sock.bind((typ, name))
6220 except FileNotFoundError as e:
6221 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006222 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006223 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006224 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006225 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006226
Victor Stinner86afc1f2017-11-30 13:58:43 +01006227 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6228 # at least on ppc64le architecture
6229 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006230 def test_sha256(self):
6231 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6232 "177a9cb410ff61f20015ad")
6233 with self.create_alg('hash', 'sha256') as algo:
6234 op, _ = algo.accept()
6235 with op:
6236 op.sendall(b"abc")
6237 self.assertEqual(op.recv(512), expected)
6238
6239 op, _ = algo.accept()
6240 with op:
6241 op.send(b'a', socket.MSG_MORE)
6242 op.send(b'b', socket.MSG_MORE)
6243 op.send(b'c', socket.MSG_MORE)
6244 op.send(b'')
6245 self.assertEqual(op.recv(512), expected)
6246
6247 def test_hmac_sha1(self):
6248 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6249 with self.create_alg('hash', 'hmac(sha1)') as algo:
6250 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6251 op, _ = algo.accept()
6252 with op:
6253 op.sendall(b"what do ya want for nothing?")
6254 self.assertEqual(op.recv(512), expected)
6255
Christian Heimese084f842016-09-11 20:11:30 +02006256 # Although it should work with 3.19 and newer the test blocks on
6257 # Ubuntu 15.10 with Kernel 4.2.0-19.
6258 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006259 def test_aes_cbc(self):
6260 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6261 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6262 msg = b"Single block msg"
6263 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6264 msglen = len(msg)
6265 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6266 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6267 op, _ = algo.accept()
6268 with op:
6269 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6270 flags=socket.MSG_MORE)
6271 op.sendall(msg)
6272 self.assertEqual(op.recv(msglen), ciphertext)
6273
6274 op, _ = algo.accept()
6275 with op:
6276 op.sendmsg_afalg([ciphertext],
6277 op=socket.ALG_OP_DECRYPT, iv=iv)
6278 self.assertEqual(op.recv(msglen), msg)
6279
6280 # long message
6281 multiplier = 1024
6282 longmsg = [msg] * multiplier
6283 op, _ = algo.accept()
6284 with op:
6285 op.sendmsg_afalg(longmsg,
6286 op=socket.ALG_OP_ENCRYPT, iv=iv)
6287 enc = op.recv(msglen * multiplier)
6288 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006289 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006290
6291 op, _ = algo.accept()
6292 with op:
6293 op.sendmsg_afalg([enc],
6294 op=socket.ALG_OP_DECRYPT, iv=iv)
6295 dec = op.recv(msglen * multiplier)
6296 self.assertEqual(len(dec), msglen * multiplier)
6297 self.assertEqual(dec, msg * multiplier)
6298
matejcik9764c152017-02-16 14:41:31 +01006299 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006300 def test_aead_aes_gcm(self):
6301 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6302 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6303 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6304 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6305 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6306 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6307
6308 taglen = len(expected_tag)
6309 assoclen = len(assoc)
6310
6311 with self.create_alg('aead', 'gcm(aes)') as algo:
6312 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6313 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6314 None, taglen)
6315
6316 # send assoc, plain and tag buffer in separate steps
6317 op, _ = algo.accept()
6318 with op:
6319 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6320 assoclen=assoclen, flags=socket.MSG_MORE)
6321 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006322 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006323 res = op.recv(assoclen + len(plain) + taglen)
6324 self.assertEqual(expected_ct, res[assoclen:-taglen])
6325 self.assertEqual(expected_tag, res[-taglen:])
6326
6327 # now with msg
6328 op, _ = algo.accept()
6329 with op:
matejcik9764c152017-02-16 14:41:31 +01006330 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006331 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6332 assoclen=assoclen)
6333 res = op.recv(assoclen + len(plain) + taglen)
6334 self.assertEqual(expected_ct, res[assoclen:-taglen])
6335 self.assertEqual(expected_tag, res[-taglen:])
6336
6337 # create anc data manually
6338 pack_uint32 = struct.Struct('I').pack
6339 op, _ = algo.accept()
6340 with op:
matejcik9764c152017-02-16 14:41:31 +01006341 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006342 op.sendmsg(
6343 [msg],
6344 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6345 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6346 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6347 )
6348 )
matejcik9764c152017-02-16 14:41:31 +01006349 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006350 self.assertEqual(expected_ct, res[assoclen:-taglen])
6351 self.assertEqual(expected_tag, res[-taglen:])
6352
6353 # decrypt and verify
6354 op, _ = algo.accept()
6355 with op:
6356 msg = assoc + expected_ct + expected_tag
6357 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6358 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006359 res = op.recv(len(msg) - taglen)
6360 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006361
Christian Heimese084f842016-09-11 20:11:30 +02006362 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006363 def test_drbg_pr_sha256(self):
6364 # deterministic random bit generator, prediction resistance, sha256
6365 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6366 extra_seed = os.urandom(32)
6367 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6368 op, _ = algo.accept()
6369 with op:
6370 rn = op.recv(32)
6371 self.assertEqual(len(rn), 32)
6372
6373 def test_sendmsg_afalg_args(self):
6374 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006375 with sock:
6376 with self.assertRaises(TypeError):
6377 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006378
Christian Heimes02b30352016-09-11 19:49:56 +02006379 with self.assertRaises(TypeError):
6380 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006381
Christian Heimes02b30352016-09-11 19:49:56 +02006382 with self.assertRaises(TypeError):
6383 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006384
Christian Heimes02b30352016-09-11 19:49:56 +02006385 with self.assertRaises(TypeError):
6386 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006387
Christian Heimes02b30352016-09-11 19:49:56 +02006388 with self.assertRaises(TypeError):
6389 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6390
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006391 def test_length_restriction(self):
6392 # bpo-35050, off-by-one error in length check
6393 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6394 self.addCleanup(sock.close)
6395
6396 # salg_type[14]
6397 with self.assertRaises(FileNotFoundError):
6398 sock.bind(("t" * 13, "name"))
6399 with self.assertRaisesRegex(ValueError, "type too long"):
6400 sock.bind(("t" * 14, "name"))
6401
6402 # salg_name[64]
6403 with self.assertRaises(FileNotFoundError):
6404 sock.bind(("type", "n" * 63))
6405 with self.assertRaisesRegex(ValueError, "name too long"):
6406 sock.bind(("type", "n" * 64))
6407
6408
animalize19e7d482018-02-27 02:10:36 +08006409@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6410class TestMSWindowsTCPFlags(unittest.TestCase):
6411 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006412 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006413 'TCP_MAXSEG',
6414 'TCP_NODELAY',
6415 # available starting with Windows 10 1607
6416 'TCP_FASTOPEN',
6417 # available starting with Windows 10 1703
6418 'TCP_KEEPCNT',
6419 # available starting with Windows 10 1709
6420 'TCP_KEEPIDLE',
6421 'TCP_KEEPINTVL'
6422 }
6423
6424 def test_new_tcp_flags(self):
6425 provided = [s for s in dir(socket) if s.startswith('TCP')]
6426 unknown = [s for s in provided if s not in self.knownTCPFlags]
6427
6428 self.assertEqual([], unknown,
6429 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006430
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006431
6432class CreateServerTest(unittest.TestCase):
6433
6434 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006435 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006436 with socket.create_server(("127.0.0.1", port)) as sock:
6437 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6438 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006439 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006440 with socket.create_server(("::1", port),
6441 family=socket.AF_INET6) as sock:
6442 self.assertEqual(sock.getsockname()[0], "::1")
6443 self.assertEqual(sock.getsockname()[1], port)
6444
6445 def test_family_and_type(self):
6446 with socket.create_server(("127.0.0.1", 0)) as sock:
6447 self.assertEqual(sock.family, socket.AF_INET)
6448 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006449 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006450 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6451 self.assertEqual(s.family, socket.AF_INET6)
6452 self.assertEqual(sock.type, socket.SOCK_STREAM)
6453
6454 def test_reuse_port(self):
6455 if not hasattr(socket, "SO_REUSEPORT"):
6456 with self.assertRaises(ValueError):
6457 socket.create_server(("localhost", 0), reuse_port=True)
6458 else:
6459 with socket.create_server(("localhost", 0)) as sock:
6460 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6461 self.assertEqual(opt, 0)
6462 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6463 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6464 self.assertNotEqual(opt, 0)
6465
6466 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6467 not hasattr(_socket, 'IPV6_V6ONLY'),
6468 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006469 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006470 def test_ipv6_only_default(self):
6471 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6472 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6473
6474 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6475 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006476 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006477 def test_dualstack_ipv6_family(self):
6478 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6479 dualstack_ipv6=True) as sock:
6480 self.assertEqual(sock.family, socket.AF_INET6)
6481
6482
6483class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006484 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006485
6486 def setUp(self):
6487 self.thread = None
6488
6489 def tearDown(self):
6490 if self.thread is not None:
6491 self.thread.join(self.timeout)
6492
6493 def echo_server(self, sock):
6494 def run(sock):
6495 with sock:
6496 conn, _ = sock.accept()
6497 with conn:
6498 event.wait(self.timeout)
6499 msg = conn.recv(1024)
6500 if not msg:
6501 return
6502 conn.sendall(msg)
6503
6504 event = threading.Event()
6505 sock.settimeout(self.timeout)
6506 self.thread = threading.Thread(target=run, args=(sock, ))
6507 self.thread.start()
6508 event.set()
6509
6510 def echo_client(self, addr, family):
6511 with socket.socket(family=family) as sock:
6512 sock.settimeout(self.timeout)
6513 sock.connect(addr)
6514 sock.sendall(b'foo')
6515 self.assertEqual(sock.recv(1024), b'foo')
6516
6517 def test_tcp4(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)) as sock:
6520 self.echo_server(sock)
6521 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6522
Serhiy Storchaka16994912020-04-25 10:06:29 +03006523 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006524 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006525 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006526 with socket.create_server(("", port),
6527 family=socket.AF_INET6) as sock:
6528 self.echo_server(sock)
6529 self.echo_client(("::1", port), socket.AF_INET6)
6530
6531 # --- dual stack tests
6532
6533 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6534 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006535 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006536 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006537 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006538 with socket.create_server(("", port), family=socket.AF_INET6,
6539 dualstack_ipv6=True) as sock:
6540 self.echo_server(sock)
6541 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6542
6543 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6544 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006545 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006546 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006547 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006548 with socket.create_server(("", port), family=socket.AF_INET6,
6549 dualstack_ipv6=True) as sock:
6550 self.echo_server(sock)
6551 self.echo_client(("::1", port), socket.AF_INET6)
6552
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006553@requireAttrs(socket, "send_fds")
6554@requireAttrs(socket, "recv_fds")
6555@requireAttrs(socket, "AF_UNIX")
6556class SendRecvFdsTests(unittest.TestCase):
6557 def testSendAndRecvFds(self):
6558 def close_pipes(pipes):
6559 for fd1, fd2 in pipes:
6560 os.close(fd1)
6561 os.close(fd2)
6562
6563 def close_fds(fds):
6564 for fd in fds:
6565 os.close(fd)
6566
6567 # send 10 file descriptors
6568 pipes = [os.pipe() for _ in range(10)]
6569 self.addCleanup(close_pipes, pipes)
6570 fds = [rfd for rfd, wfd in pipes]
6571
6572 # use a UNIX socket pair to exchange file descriptors locally
6573 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6574 with sock1, sock2:
6575 socket.send_fds(sock1, [MSG], fds)
6576 # request more data and file descriptors than expected
6577 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6578 self.addCleanup(close_fds, fds2)
6579
6580 self.assertEqual(msg, MSG)
6581 self.assertEqual(len(fds2), len(fds))
6582 self.assertEqual(flags, 0)
6583 # don't test addr
6584
6585 # test that file descriptors are connected
6586 for index, fds in enumerate(pipes):
6587 rfd, wfd = fds
6588 os.write(wfd, str(index).encode())
6589
6590 for index, rfd in enumerate(fds2):
6591 data = os.read(rfd, 100)
6592 self.assertEqual(data, str(index).encode())
6593
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006594
Guido van Rossumb995eb72002-07-31 16:08:40 +00006595def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006596 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006597 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006598 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6599 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006600
6601 tests.extend([
6602 NonBlockingTCPTests,
6603 FileObjectClassTestCase,
6604 UnbufferedFileObjectClassTestCase,
6605 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006606 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006607 UnicodeReadFileObjectClassTestCase,
6608 UnicodeWriteFileObjectClassTestCase,
6609 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006610 NetworkConnectionNoServer,
6611 NetworkConnectionAttributesTest,
6612 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006613 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006614 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006615 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006616 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006617 tests.append(BasicSocketPairTest)
6618 tests.append(TestUnixDomain)
6619 tests.append(TestLinuxAbstractNamespace)
6620 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006621 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006622 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006623 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006624 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006625 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006626 BasicVSOCKTest,
6627 ThreadedVSOCKSocketStreamTest,
6628 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006629 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006630 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006631 CmsgMacroTests,
6632 SendmsgUDPTest,
6633 RecvmsgUDPTest,
6634 RecvmsgIntoUDPTest,
6635 SendmsgUDP6Test,
6636 RecvmsgUDP6Test,
6637 RecvmsgRFC3542AncillaryUDP6Test,
6638 RecvmsgIntoRFC3542AncillaryUDP6Test,
6639 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006640 SendmsgUDPLITETest,
6641 RecvmsgUDPLITETest,
6642 RecvmsgIntoUDPLITETest,
6643 SendmsgUDPLITE6Test,
6644 RecvmsgUDPLITE6Test,
6645 RecvmsgRFC3542AncillaryUDPLITE6Test,
6646 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6647 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006648 SendmsgTCPTest,
6649 RecvmsgTCPTest,
6650 RecvmsgIntoTCPTest,
6651 SendmsgSCTPStreamTest,
6652 RecvmsgSCTPStreamTest,
6653 RecvmsgIntoSCTPStreamTest,
6654 SendmsgUnixStreamTest,
6655 RecvmsgUnixStreamTest,
6656 RecvmsgIntoUnixStreamTest,
6657 RecvmsgSCMRightsStreamTest,
6658 RecvmsgIntoSCMRightsStreamTest,
6659 # These are slow when setitimer() is not available
6660 InterruptedRecvTimeoutTest,
6661 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006662 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006663 SendfileUsingSendTest,
6664 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006665 ])
animalize19e7d482018-02-27 02:10:36 +08006666 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006667
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006668 thread_info = support.threading_setup()
6669 support.run_unittest(*tests)
6670 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006671
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006672
Guido van Rossum24e4af82002-06-12 19:18:08 +00006673if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006674 test_main()