blob: 5f57ab2f89d8d3902700eb1dba654f9171d22bb7 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Hai Shideb01622020-07-06 20:29:49 +08003from test.support import os_helper
Serhiy Storchaka16994912020-04-25 10:06:29 +03004from test.support import socket_helper
Hai Shie80697d2020-05-28 06:10:27 +08005from test.support import threading_helper
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006
Christian Heimes5e696852008-04-09 08:37:03 +00007import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00008import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01009import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +000010import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +000011import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100012import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000013import time
14import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000015import queue
Jack Jansen522e7692002-09-06 21:57:50 +000016import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000017import os
Michael Felt56614592018-12-26 04:34:37 +010018import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000019import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000020import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000021from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000022import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000023import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010024import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020025import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020026import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010027import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020028import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020029import _thread as thread
30import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000031try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000032 import multiprocessing
33except ImportError:
34 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020035try:
36 import fcntl
37except ImportError:
38 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000039
Serhiy Storchaka16994912020-04-25 10:06:29 +030040HOST = socket_helper.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010041# test unicode string and carriage return
42MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Barry Warsawcf3d4b51997-01-03 20:03:32 +000043
caaveryeffc12f2017-09-06 18:18:10 -040044VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010045AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040046
Victor Stinner45df8202010-04-28 22:31:17 +000047try:
Victor Stinnere254e532014-07-26 14:36:55 +020048 import _socket
49except ImportError:
50 _socket = None
51
caaveryeffc12f2017-09-06 18:18:10 -040052def get_cid():
53 if fcntl is None:
54 return None
Pablo Galindo6eb96192020-04-01 01:48:37 +010055 if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
56 return None
caaveryeffc12f2017-09-06 18:18:10 -040057 try:
58 with open("/dev/vsock", "rb") as f:
59 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
60 except OSError:
61 return None
62 else:
63 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000064
Charles-François Natali47413c12011-10-06 19:47:44 +020065def _have_socket_can():
66 """Check whether CAN sockets are supported on this host."""
67 try:
68 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020069 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020070 return False
71 else:
72 s.close()
73 return True
74
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040075def _have_socket_can_isotp():
76 """Check whether CAN ISOTP sockets are supported on this host."""
77 try:
78 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
79 except (AttributeError, OSError):
80 return False
81 else:
82 s.close()
83 return True
84
karl ding360371f2020-04-29 15:31:19 -070085def _have_socket_can_j1939():
86 """Check whether CAN J1939 sockets are supported on this host."""
87 try:
88 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
89 except (AttributeError, OSError):
90 return False
91 else:
92 s.close()
93 return True
94
Charles-François Natali10b8cf42011-11-10 19:21:37 +010095def _have_socket_rds():
96 """Check whether RDS sockets are supported on this host."""
97 try:
98 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
99 except (AttributeError, OSError):
100 return False
101 else:
102 s.close()
103 return True
104
Christian Heimes48371412016-09-06 00:37:46 +0200105def _have_socket_alg():
106 """Check whether AF_ALG sockets are supported on this host."""
107 try:
108 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
109 except (AttributeError, OSError):
110 return False
111 else:
112 s.close()
113 return True
114
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700115def _have_socket_qipcrtr():
116 """Check whether AF_QIPCRTR sockets are supported on this host."""
117 try:
118 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
119 except (AttributeError, OSError):
120 return False
121 else:
122 s.close()
123 return True
124
caaveryeffc12f2017-09-06 18:18:10 -0400125def _have_socket_vsock():
126 """Check whether AF_VSOCK sockets are supported on this host."""
127 ret = get_cid() is not None
128 return ret
129
Yury Selivanovf11b4602018-01-28 17:27:38 -0500130
Greg Bowser8fbece12019-08-02 16:29:52 -0400131def _have_socket_bluetooth():
132 """Check whether AF_BLUETOOTH sockets are supported on this host."""
133 try:
134 # RFCOMM is supported by all platforms with bluetooth support. Windows
135 # does not support omitting the protocol.
136 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
137 except (AttributeError, OSError):
138 return False
139 else:
140 s.close()
141 return True
142
143
Victor Stinner304315d2018-11-30 13:22:44 +0100144@contextlib.contextmanager
145def socket_setdefaulttimeout(timeout):
146 old_timeout = socket.getdefaulttimeout()
147 try:
148 socket.setdefaulttimeout(timeout)
149 yield
150 finally:
151 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500152
153
Charles-François Natali47413c12011-10-06 19:47:44 +0200154HAVE_SOCKET_CAN = _have_socket_can()
155
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400156HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
157
karl ding360371f2020-04-29 15:31:19 -0700158HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939()
159
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100160HAVE_SOCKET_RDS = _have_socket_rds()
161
Christian Heimes48371412016-09-06 00:37:46 +0200162HAVE_SOCKET_ALG = _have_socket_alg()
163
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700164HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
165
caaveryeffc12f2017-09-06 18:18:10 -0400166HAVE_SOCKET_VSOCK = _have_socket_vsock()
167
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700168HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
169
Greg Bowser8fbece12019-08-02 16:29:52 -0400170HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
171
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000172# Size in bytes of the int type
173SIZEOF_INT = array.array("i").itemsize
174
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000176
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177 def setUp(self):
178 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300179 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100180 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000181
Guido van Rossum24e4af82002-06-12 19:18:08 +0000182 def tearDown(self):
183 self.serv.close()
184 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000185
Guido van Rossum24e4af82002-06-12 19:18:08 +0000186class SocketUDPTest(unittest.TestCase):
187
188 def setUp(self):
189 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300190 self.port = socket_helper.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000191
192 def tearDown(self):
193 self.serv.close()
194 self.serv = None
195
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700196class SocketUDPLITETest(SocketUDPTest):
197
198 def setUp(self):
199 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300200 self.port = socket_helper.bind_port(self.serv)
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700201
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000202class ThreadSafeCleanupTestCase(unittest.TestCase):
203 """Subclass of unittest.TestCase with thread-safe cleanup methods.
204
205 This subclass protects the addCleanup() and doCleanups() methods
206 with a recursive lock.
207 """
208
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200209 def __init__(self, *args, **kwargs):
210 super().__init__(*args, **kwargs)
211 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000212
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200213 def addCleanup(self, *args, **kwargs):
214 with self._cleanup_lock:
215 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000216
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200217 def doCleanups(self, *args, **kwargs):
218 with self._cleanup_lock:
219 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000220
Charles-François Natali47413c12011-10-06 19:47:44 +0200221class SocketCANTest(unittest.TestCase):
222
223 """To be able to run this test, a `vcan0` CAN interface can be created with
224 the following commands:
225 # modprobe vcan
226 # ip link add dev vcan0 type vcan
227 # ifconfig vcan0 up
228 """
229 interface = 'vcan0'
230 bufsize = 128
231
Charles-François Natali773e42d2013-02-05 19:42:01 +0100232 """The CAN frame structure is defined in <linux/can.h>:
233
234 struct can_frame {
235 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
236 __u8 can_dlc; /* data length code: 0 .. 8 */
237 __u8 data[8] __attribute__((aligned(8)));
238 };
239 """
240 can_frame_fmt = "=IB3x8s"
241 can_frame_size = struct.calcsize(can_frame_fmt)
242
243 """The Broadcast Management Command frame structure is defined
244 in <linux/can/bcm.h>:
245
246 struct bcm_msg_head {
247 __u32 opcode;
248 __u32 flags;
249 __u32 count;
250 struct timeval ival1, ival2;
251 canid_t can_id;
252 __u32 nframes;
253 struct can_frame frames[0];
254 }
255
256 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
257 `struct can_frame` definition). Must use native not standard types for packing.
258 """
259 bcm_cmd_msg_fmt = "@3I4l2I"
260 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
261
Charles-François Natali47413c12011-10-06 19:47:44 +0200262 def setUp(self):
263 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200264 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200265 try:
266 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200267 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200268 self.skipTest('network interface `%s` does not exist' %
269 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200270
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100271
272class SocketRDSTest(unittest.TestCase):
273
274 """To be able to run this test, the `rds` kernel module must be loaded:
275 # modprobe rds
276 """
277 bufsize = 8192
278
279 def setUp(self):
280 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
281 self.addCleanup(self.serv.close)
282 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +0300283 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100284 except OSError:
285 self.skipTest('unable to bind RDS socket')
286
287
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000289 """Threadable Test class
290
291 The ThreadableTest class makes it easy to create a threaded
292 client/server pair from an existing unit test. To create a
293 new threaded class from an existing unit test, use multiple
294 inheritance:
295
296 class NewClass (OldClass, ThreadableTest):
297 pass
298
299 This class defines two new fixture functions with obvious
300 purposes for overriding:
301
302 clientSetUp ()
303 clientTearDown ()
304
305 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000306 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000307 '_' to indicate the client portion of the test. Ex:
308
309 def testFoo(self):
310 # Server portion
311
312 def _testFoo(self):
313 # Client portion
314
315 Any exceptions raised by the clients during their tests
316 are caught and transferred to the main thread to alert
317 the testing framework.
318
319 Note, the server setup function cannot call any blocking
320 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000321 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000322 the blocking call (such as in setting up a client/server
323 connection and performing the accept() in setUp().
324 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325
326 def __init__(self):
327 # Swap the true setup function
328 self.__setUp = self.setUp
329 self.__tearDown = self.tearDown
330 self.setUp = self._setUp
331 self.tearDown = self._tearDown
332
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000333 def serverExplicitReady(self):
334 """This method allows the server to explicitly indicate that
335 it wants the client thread to proceed. This is useful if the
336 server is about to execute a blocking routine that is
337 dependent upon the client thread during its setup routine."""
338 self.server_ready.set()
339
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340 def _setUp(self):
Hai Shie80697d2020-05-28 06:10:27 +0800341 self.wait_threads = threading_helper.wait_threads_exit()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700342 self.wait_threads.__enter__()
343
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000344 self.server_ready = threading.Event()
345 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000346 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000347 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200348 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349
350 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000351 methodname = self.id()
352 i = methodname.rfind('.')
353 methodname = methodname[i+1:]
354 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000355 self.client_thread = thread.start_new_thread(
356 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200358 try:
359 self.__setUp()
360 except:
361 self.server_crashed = True
362 raise
363 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000364 self.server_ready.set()
365 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366
367 def _tearDown(self):
368 self.__tearDown()
369 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700370 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000371
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000372 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000373 exc = self.queue.get()
374 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375
376 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000377 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100378 try:
379 self.clientSetUp()
380 except BaseException as e:
381 self.queue.put(e)
382 self.clientTearDown()
383 return
384 finally:
385 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200386 if self.server_crashed:
387 self.clientTearDown()
388 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000389 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000390 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 try:
392 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000393 except BaseException as e:
394 self.queue.put(e)
395 finally:
396 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000397
398 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000399 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000400
401 def clientTearDown(self):
402 self.done.set()
403 thread.exit()
404
405class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
406
407 def __init__(self, methodName='runTest'):
408 SocketTCPTest.__init__(self, methodName=methodName)
409 ThreadableTest.__init__(self)
410
411 def clientSetUp(self):
412 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
413
414 def clientTearDown(self):
415 self.cli.close()
416 self.cli = None
417 ThreadableTest.clientTearDown(self)
418
419class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
420
421 def __init__(self, methodName='runTest'):
422 SocketUDPTest.__init__(self, methodName=methodName)
423 ThreadableTest.__init__(self)
424
425 def clientSetUp(self):
426 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
427
Brian Curtin3beb38f2010-11-04 03:41:43 +0000428 def clientTearDown(self):
429 self.cli.close()
430 self.cli = None
431 ThreadableTest.clientTearDown(self)
432
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700433@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
434 'UDPLITE sockets required for this test.')
435class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
436
437 def __init__(self, methodName='runTest'):
438 SocketUDPLITETest.__init__(self, methodName=methodName)
439 ThreadableTest.__init__(self)
440
441 def clientSetUp(self):
442 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
443
444 def clientTearDown(self):
445 self.cli.close()
446 self.cli = None
447 ThreadableTest.clientTearDown(self)
448
Charles-François Natali47413c12011-10-06 19:47:44 +0200449class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
450
451 def __init__(self, methodName='runTest'):
452 SocketCANTest.__init__(self, methodName=methodName)
453 ThreadableTest.__init__(self)
454
455 def clientSetUp(self):
456 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
457 try:
458 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200459 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200460 # skipTest should not be called here, and will be called in the
461 # server instead
462 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200463
464 def clientTearDown(self):
465 self.cli.close()
466 self.cli = None
467 ThreadableTest.clientTearDown(self)
468
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100469class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
470
471 def __init__(self, methodName='runTest'):
472 SocketRDSTest.__init__(self, methodName=methodName)
473 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100474
475 def clientSetUp(self):
476 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
477 try:
478 # RDS sockets must be bound explicitly to send or receive data
479 self.cli.bind((HOST, 0))
480 self.cli_addr = self.cli.getsockname()
481 except OSError:
482 # skipTest should not be called here, and will be called in the
483 # server instead
484 pass
485
486 def clientTearDown(self):
487 self.cli.close()
488 self.cli = None
489 ThreadableTest.clientTearDown(self)
490
caaveryeffc12f2017-09-06 18:18:10 -0400491@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400492@unittest.skipUnless(HAVE_SOCKET_VSOCK,
493 'VSOCK sockets required for this test.')
494@unittest.skipUnless(get_cid() != 2,
495 "This test can only be run on a virtual guest.")
496class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
497
498 def __init__(self, methodName='runTest'):
499 unittest.TestCase.__init__(self, methodName=methodName)
500 ThreadableTest.__init__(self)
501
502 def setUp(self):
503 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
504 self.addCleanup(self.serv.close)
505 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
506 self.serv.listen()
507 self.serverExplicitReady()
508 self.conn, self.connaddr = self.serv.accept()
509 self.addCleanup(self.conn.close)
510
511 def clientSetUp(self):
512 time.sleep(0.1)
513 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
514 self.addCleanup(self.cli.close)
515 cid = get_cid()
516 self.cli.connect((cid, VSOCKPORT))
517
518 def testStream(self):
519 msg = self.conn.recv(1024)
520 self.assertEqual(msg, MSG)
521
522 def _testStream(self):
523 self.cli.send(MSG)
524 self.cli.close()
525
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000527 """Socket tests for client-server connection.
528
529 self.cli_conn is a client socket connected to the server. The
530 setUp() method guarantees that it is connected to the server.
531 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def __init__(self, methodName='runTest'):
534 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
535
536 def setUp(self):
537 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000538 # Indicate explicitly we're ready for the client thread to
539 # proceed and then perform the blocking call to accept
540 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000541 conn, addr = self.serv.accept()
542 self.cli_conn = conn
543
544 def tearDown(self):
545 self.cli_conn.close()
546 self.cli_conn = None
547 ThreadedTCPSocketTest.tearDown(self)
548
549 def clientSetUp(self):
550 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000551 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552 self.serv_conn = self.cli
553
554 def clientTearDown(self):
555 self.serv_conn.close()
556 self.serv_conn = None
557 ThreadedTCPSocketTest.clientTearDown(self)
558
Dave Cole331708b2004-08-09 04:51:41 +0000559class SocketPairTest(unittest.TestCase, ThreadableTest):
560
561 def __init__(self, methodName='runTest'):
562 unittest.TestCase.__init__(self, methodName=methodName)
563 ThreadableTest.__init__(self)
564
565 def setUp(self):
566 self.serv, self.cli = socket.socketpair()
567
568 def tearDown(self):
569 self.serv.close()
570 self.serv = None
571
572 def clientSetUp(self):
573 pass
574
575 def clientTearDown(self):
576 self.cli.close()
577 self.cli = None
578 ThreadableTest.clientTearDown(self)
579
Tim Peters494aaee2004-08-09 18:54:11 +0000580
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000581# The following classes are used by the sendmsg()/recvmsg() tests.
582# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
583# gives a drop-in replacement for SocketConnectedTest, but different
584# address families can be used, and the attributes serv_addr and
585# cli_addr will be set to the addresses of the endpoints.
586
587class SocketTestBase(unittest.TestCase):
588 """A base class for socket tests.
589
590 Subclasses must provide methods newSocket() to return a new socket
591 and bindSock(sock) to bind it to an unused address.
592
593 Creates a socket self.serv and sets self.serv_addr to its address.
594 """
595
596 def setUp(self):
597 self.serv = self.newSocket()
598 self.bindServer()
599
600 def bindServer(self):
601 """Bind server socket and set self.serv_addr to its address."""
602 self.bindSock(self.serv)
603 self.serv_addr = self.serv.getsockname()
604
605 def tearDown(self):
606 self.serv.close()
607 self.serv = None
608
609
610class SocketListeningTestMixin(SocketTestBase):
611 """Mixin to listen on the server socket."""
612
613 def setUp(self):
614 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100615 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000616
617
618class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
619 ThreadableTest):
620 """Mixin to add client socket and allow client/server tests.
621
622 Client socket is self.cli and its address is self.cli_addr. See
623 ThreadableTest for usage information.
624 """
625
626 def __init__(self, *args, **kwargs):
627 super().__init__(*args, **kwargs)
628 ThreadableTest.__init__(self)
629
630 def clientSetUp(self):
631 self.cli = self.newClientSocket()
632 self.bindClient()
633
634 def newClientSocket(self):
635 """Return a new socket for use as client."""
636 return self.newSocket()
637
638 def bindClient(self):
639 """Bind client socket and set self.cli_addr to its address."""
640 self.bindSock(self.cli)
641 self.cli_addr = self.cli.getsockname()
642
643 def clientTearDown(self):
644 self.cli.close()
645 self.cli = None
646 ThreadableTest.clientTearDown(self)
647
648
649class ConnectedStreamTestMixin(SocketListeningTestMixin,
650 ThreadedSocketTestMixin):
651 """Mixin to allow client/server stream tests with connected client.
652
653 Server's socket representing connection to client is self.cli_conn
654 and client's connection to server is self.serv_conn. (Based on
655 SocketConnectedTest.)
656 """
657
658 def setUp(self):
659 super().setUp()
660 # Indicate explicitly we're ready for the client thread to
661 # proceed and then perform the blocking call to accept
662 self.serverExplicitReady()
663 conn, addr = self.serv.accept()
664 self.cli_conn = conn
665
666 def tearDown(self):
667 self.cli_conn.close()
668 self.cli_conn = None
669 super().tearDown()
670
671 def clientSetUp(self):
672 super().clientSetUp()
673 self.cli.connect(self.serv_addr)
674 self.serv_conn = self.cli
675
676 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100677 try:
678 self.serv_conn.close()
679 self.serv_conn = None
680 except AttributeError:
681 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000682 super().clientTearDown()
683
684
685class UnixSocketTestBase(SocketTestBase):
686 """Base class for Unix-domain socket tests."""
687
688 # This class is used for file descriptor passing tests, so we
689 # create the sockets in a private directory so that other users
690 # can't send anything that might be problematic for a privileged
691 # user running the tests.
692
693 def setUp(self):
694 self.dir_path = tempfile.mkdtemp()
695 self.addCleanup(os.rmdir, self.dir_path)
696 super().setUp()
697
698 def bindSock(self, sock):
699 path = tempfile.mktemp(dir=self.dir_path)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300700 socket_helper.bind_unix_socket(sock, path)
Hai Shideb01622020-07-06 20:29:49 +0800701 self.addCleanup(os_helper.unlink, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000702
703class UnixStreamBase(UnixSocketTestBase):
704 """Base class for Unix-domain SOCK_STREAM tests."""
705
706 def newSocket(self):
707 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
708
709
710class InetTestBase(SocketTestBase):
711 """Base class for IPv4 socket tests."""
712
713 host = HOST
714
715 def setUp(self):
716 super().setUp()
717 self.port = self.serv_addr[1]
718
719 def bindSock(self, sock):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300720 socket_helper.bind_port(sock, host=self.host)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000721
722class TCPTestBase(InetTestBase):
723 """Base class for TCP-over-IPv4 tests."""
724
725 def newSocket(self):
726 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
727
728class UDPTestBase(InetTestBase):
729 """Base class for UDP-over-IPv4 tests."""
730
731 def newSocket(self):
732 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
733
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700734class UDPLITETestBase(InetTestBase):
735 """Base class for UDPLITE-over-IPv4 tests."""
736
737 def newSocket(self):
738 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
739
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000740class SCTPStreamBase(InetTestBase):
741 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
742
743 def newSocket(self):
744 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
745 socket.IPPROTO_SCTP)
746
747
748class Inet6TestBase(InetTestBase):
749 """Base class for IPv6 socket tests."""
750
Serhiy Storchaka16994912020-04-25 10:06:29 +0300751 host = socket_helper.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000752
753class UDP6TestBase(Inet6TestBase):
754 """Base class for UDP-over-IPv6 tests."""
755
756 def newSocket(self):
757 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
758
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700759class UDPLITE6TestBase(Inet6TestBase):
760 """Base class for UDPLITE-over-IPv6 tests."""
761
762 def newSocket(self):
763 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
764
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000765
766# Test-skipping decorators for use with ThreadableTest.
767
768def skipWithClientIf(condition, reason):
769 """Skip decorated test if condition is true, add client_skip decorator.
770
771 If the decorated object is not a class, sets its attribute
772 "client_skip" to a decorator which will return an empty function
773 if the test is to be skipped, or the original function if it is
774 not. This can be used to avoid running the client part of a
775 skipped test when using ThreadableTest.
776 """
777 def client_pass(*args, **kwargs):
778 pass
779 def skipdec(obj):
780 retval = unittest.skip(reason)(obj)
781 if not isinstance(obj, type):
782 retval.client_skip = lambda f: client_pass
783 return retval
784 def noskipdec(obj):
785 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
786 obj.client_skip = lambda f: f
787 return obj
788 return skipdec if condition else noskipdec
789
790
791def requireAttrs(obj, *attributes):
792 """Skip decorated test if obj is missing any of the given attributes.
793
794 Sets client_skip attribute as skipWithClientIf() does.
795 """
796 missing = [name for name in attributes if not hasattr(obj, name)]
797 return skipWithClientIf(
798 missing, "don't have " + ", ".join(name for name in missing))
799
800
801def requireSocket(*args):
802 """Skip decorated test if a socket cannot be created with given arguments.
803
804 When an argument is given as a string, will use the value of that
805 attribute of the socket module, or skip the test if it doesn't
806 exist. Sets client_skip attribute as skipWithClientIf() does.
807 """
808 err = None
809 missing = [obj for obj in args if
810 isinstance(obj, str) and not hasattr(socket, obj)]
811 if missing:
812 err = "don't have " + ", ".join(name for name in missing)
813 else:
814 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
815 for obj in args]
816 try:
817 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200818 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000819 # XXX: check errno?
820 err = str(e)
821 else:
822 s.close()
823 return skipWithClientIf(
824 err is not None,
825 "can't create socket({0}): {1}".format(
826 ", ".join(str(o) for o in args), err))
827
828
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829#######################################################################
830## Begin Tests
831
832class GeneralModuleTests(unittest.TestCase):
833
Ethan Furman7184bac2014-10-14 18:56:53 -0700834 def test_SocketType_is_socketobject(self):
835 import _socket
836 self.assertTrue(socket.SocketType is _socket.socket)
837 s = socket.socket()
838 self.assertIsInstance(s, socket.SocketType)
839 s.close()
840
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000841 def test_repr(self):
842 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200843 with s:
844 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000845 self.assertIn('family=%s' % socket.AF_INET, repr(s))
846 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200847 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200848 self.assertNotIn('raddr', repr(s))
849 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200850 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200851 self.assertIn(str(s.getsockname()), repr(s))
852 self.assertIn('[closed]', repr(s))
853 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000854
Victor Stinnere254e532014-07-26 14:36:55 +0200855 @unittest.skipUnless(_socket is not None, 'need _socket module')
856 def test_csocket_repr(self):
857 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
858 try:
859 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
860 % (s.fileno(), s.family, s.type, s.proto))
861 self.assertEqual(repr(s), expected)
862 finally:
863 s.close()
864 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
865 % (s.family, s.type, s.proto))
866 self.assertEqual(repr(s), expected)
867
Raymond Hettinger027bb632004-05-31 03:09:25 +0000868 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200869 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
870 p = proxy(s)
871 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000872 s = None
873 try:
874 p.fileno()
875 except ReferenceError:
876 pass
877 else:
878 self.fail('Socket proxy still exists')
879
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000881 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300882 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200883 with self.assertRaises(OSError, msg=msg % 'OSError'):
884 raise OSError
885 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200887 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889
Ezio Melotti63e42302011-05-07 19:47:48 +0300890 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000891 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300892 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
893 self.addCleanup(s.close)
894 s.bind(('', 0))
895 sockname = s.getsockname()
896 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300897 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300898 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300899 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400900 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300901 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300902 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300903 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400904 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300905 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300906 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300907 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300908 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300909 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300910 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300911 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400912 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300913 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300914 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300915 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400916 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300917 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300918 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300919 self.assertIn('not NoneType', str(cm.exception))
920 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300921 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300922 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300923 s.sendto(b'foo', None, None)
924 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300925 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300926 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300927 self.assertIn('(1 given)', str(cm.exception))
928 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300929 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300930 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300931
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100935 if socket.has_ipv6:
936 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 socket.SOCK_STREAM
938 socket.SOCK_DGRAM
939 socket.SOCK_RAW
940 socket.SOCK_RDM
941 socket.SOCK_SEQPACKET
942 socket.SOL_SOCKET
943 socket.SO_REUSEADDR
944
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100945 def testCrucialIpProtoConstants(self):
946 socket.IPPROTO_TCP
947 socket.IPPROTO_UDP
948 if socket.has_ipv6:
949 socket.IPPROTO_IPV6
950
951 @unittest.skipUnless(os.name == "nt", "Windows specific")
952 def testWindowsSpecificConstants(self):
953 socket.IPPROTO_ICLFXBM
954 socket.IPPROTO_ST
955 socket.IPPROTO_CBT
956 socket.IPPROTO_IGP
957 socket.IPPROTO_RDP
958 socket.IPPROTO_PGM
959 socket.IPPROTO_L2TP
960 socket.IPPROTO_SCTP
961
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +0200962 @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
963 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
964 def test3542SocketOptions(self):
965 # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542
966 opts = {
967 'IPV6_CHECKSUM',
968 'IPV6_DONTFRAG',
969 'IPV6_DSTOPTS',
970 'IPV6_HOPLIMIT',
971 'IPV6_HOPOPTS',
972 'IPV6_NEXTHOP',
973 'IPV6_PATHMTU',
974 'IPV6_PKTINFO',
975 'IPV6_RECVDSTOPTS',
976 'IPV6_RECVHOPLIMIT',
977 'IPV6_RECVHOPOPTS',
978 'IPV6_RECVPATHMTU',
979 'IPV6_RECVPKTINFO',
980 'IPV6_RECVRTHDR',
981 'IPV6_RECVTCLASS',
982 'IPV6_RTHDR',
983 'IPV6_RTHDRDSTOPTS',
984 'IPV6_RTHDR_TYPE_0',
985 'IPV6_TCLASS',
986 'IPV6_USE_MIN_MTU',
987 }
988 for opt in opts:
989 self.assertTrue(
990 hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'"
991 )
992
Guido van Rossum654c11e2002-06-13 20:24:17 +0000993 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000994 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000995 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000996 try:
997 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200998 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000999 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001000 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001001 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +00001002 try:
1003 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001004 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +00001005 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001006 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +00001007 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001008 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +00001009 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001010 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001011
Charles-François Natali0cc86852013-09-13 19:53:08 +02001012 def test_host_resolution(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03001013 for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014 self.assertEqual(socket.gethostbyname(addr), addr)
1015
Serhiy Storchaka16994912020-04-25 10:06:29 +03001016 # 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 +02001017 # a matching name entry (e.g. 'ip6-localhost')
Serhiy Storchaka16994912020-04-25 10:06:29 +03001018 for host in [socket_helper.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001019 self.assertIn(host, socket.gethostbyaddr(host)[2])
1020
Xiang Zhangd36a7162017-03-07 11:06:09 +08001021 def test_host_resolution_bad_address(self):
1022 # These are all malformed IP addresses and expected not to resolve to
1023 # any result. But some ISPs, e.g. AWS, may successfully resolve these
1024 # IPs.
1025 explanation = (
1026 "resolving an invalid IP address did not raise OSError; "
1027 "can be caused by a broken DNS server"
1028 )
1029 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
1030 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -04001031 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +08001032 socket.gethostbyname(addr)
1033 with self.assertRaises(OSError, msg=explanation):
1034 socket.gethostbyaddr(addr)
1035
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001036 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
1037 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
1038 def test_sethostname(self):
1039 oldhn = socket.gethostname()
1040 try:
1041 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001042 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001043 if e.errno == errno.EPERM:
1044 self.skipTest("test should be run as root")
1045 else:
1046 raise
1047 try:
1048 # running test as root!
1049 self.assertEqual(socket.gethostname(), 'new')
1050 # Should work with bytes objects too
1051 socket.sethostname(b'bar')
1052 self.assertEqual(socket.gethostname(), 'bar')
1053 finally:
1054 socket.sethostname(oldhn)
1055
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001056 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1057 'socket.if_nameindex() not available.')
1058 def testInterfaceNameIndex(self):
1059 interfaces = socket.if_nameindex()
1060 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001061 self.assertIsInstance(index, int)
1062 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001063 # interface indices are non-zero integers
1064 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001065 _index = socket.if_nametoindex(name)
1066 self.assertIsInstance(_index, int)
1067 self.assertEqual(index, _index)
1068 _name = socket.if_indextoname(index)
1069 self.assertIsInstance(_name, str)
1070 self.assertEqual(name, _name)
1071
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001072 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1073 'socket.if_indextoname() not available.')
1074 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001075 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001076 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001077
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001078 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1079 'socket.if_nametoindex() not available.')
1080 def testInvalidInterfaceNameToIndex(self):
1081 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1082 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1083
Serhiy Storchaka43767632013-11-03 21:31:38 +02001084 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1085 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001086 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001087 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001088 try:
1089 # On some versions, this loses a reference
1090 orig = sys.getrefcount(__name__)
1091 socket.getnameinfo(__name__,0)
1092 except TypeError:
1093 if sys.getrefcount(__name__) != orig:
1094 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001095
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001097 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 try:
1099 # On some versions, this crashes the interpreter.
1100 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001101 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001102 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001103
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001104 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001105 # This just checks that htons etc. are their own inverse,
1106 # when looking at the lower 16 or 32 bits.
1107 sizes = {socket.htonl: 32, socket.ntohl: 32,
1108 socket.htons: 16, socket.ntohs: 16}
1109 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001110 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001111 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1112 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001113
Guido van Rossuma2627af2002-09-14 00:58:46 +00001114 swapped = func(mask)
1115 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001116 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001117
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001118 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001119 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001120 import _testcapi
1121 s_good_values = [0, 1, 2, 0xffff]
1122 l_good_values = s_good_values + [0xffffffff]
1123 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1124 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1125 _testcapi.INT_MAX + 1]
1126 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1127 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001128 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001129 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001130 for k in l_good_values:
1131 socket.ntohl(k)
1132 socket.htonl(k)
1133 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001134 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001135 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001136 for k in l_bad_values:
1137 self.assertRaises(OverflowError, socket.ntohl, k)
1138 self.assertRaises(OverflowError, socket.htonl, k)
1139 for k in s_deprecated_values:
1140 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1141 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001142
Barry Warsaw11b91a02004-06-28 00:50:43 +00001143 def testGetServBy(self):
1144 eq = self.assertEqual
1145 # Find one service that exists, then check all the related interfaces.
1146 # I've ordered this by protocols that have both a tcp and udp
1147 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001148 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001149 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001150 # avoid the 'echo' service on this platform, as there is an
1151 # assumption breaking non-standard port/protocol entry
1152 services = ('daytime', 'qotd', 'domain')
1153 else:
1154 services = ('echo', 'daytime', 'domain')
1155 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001156 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001157 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001158 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001159 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001160 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001161 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001162 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001163 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001164 # Issue #26936: Android getservbyname() was broken before API 23.
1165 if (not hasattr(sys, 'getandroidapilevel') or
1166 sys.getandroidapilevel() >= 23):
1167 port2 = socket.getservbyname(service)
1168 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001169 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001170 try:
1171 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001172 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001173 udpport = None
1174 else:
1175 eq(udpport, port)
1176 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001177 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001178 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001179 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001180 eq(socket.getservbyport(port, 'tcp'), service)
1181 if udpport is not None:
1182 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001183 # Make sure getservbyport does not accept out of range ports.
1184 self.assertRaises(OverflowError, socket.getservbyport, -1)
1185 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001187 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001188 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001189 # The default timeout should initially be None
1190 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001191 with socket.socket() as s:
1192 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001193
1194 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001195 with socket_setdefaulttimeout(10):
1196 self.assertEqual(socket.getdefaulttimeout(), 10)
1197 with socket.socket() as sock:
1198 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001199
Victor Stinner304315d2018-11-30 13:22:44 +01001200 # Reset the default timeout to None, and see if it propagates
1201 socket.setdefaulttimeout(None)
1202 self.assertEqual(socket.getdefaulttimeout(), None)
1203 with socket.socket() as sock:
1204 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001205
1206 # Check that setting it to an invalid value raises ValueError
1207 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1208
1209 # Check that setting it to an invalid type raises TypeError
1210 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1211
Serhiy Storchaka43767632013-11-03 21:31:38 +02001212 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1213 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001214 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001215 # Test that issue1008086 and issue767150 are fixed.
1216 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001217 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1218 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001219
Serhiy Storchaka43767632013-11-03 21:31:38 +02001220 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1221 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001222 def testIPv4toString(self):
1223 from socket import inet_aton as f, inet_pton, AF_INET
1224 g = lambda a: inet_pton(AF_INET, a)
1225
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001226 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001227 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001228 )
1229
Ezio Melottib3aedd42010-11-20 19:04:17 +00001230 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1231 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1232 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1233 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1234 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001235 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001236 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001237 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001238 assertInvalid(f, '300.0.0.0')
1239 assertInvalid(f, 'a.0.0.0')
1240 assertInvalid(f, '1.2.3.4.5')
1241 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001242
Ezio Melottib3aedd42010-11-20 19:04:17 +00001243 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1244 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1245 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1246 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001247 assertInvalid(g, '0.0.0.')
1248 assertInvalid(g, '300.0.0.0')
1249 assertInvalid(g, 'a.0.0.0')
1250 assertInvalid(g, '1.2.3.4.5')
1251 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001252
Serhiy Storchaka43767632013-11-03 21:31:38 +02001253 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1254 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001255 def testIPv6toString(self):
1256 try:
1257 from socket import inet_pton, AF_INET6, has_ipv6
1258 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001259 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001260 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001261 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001262
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001263 if sys.platform == "win32":
1264 try:
1265 inet_pton(AF_INET6, '::')
1266 except OSError as e:
1267 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001268 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001269
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001270 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001271 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001272 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001273 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001274
Ezio Melottib3aedd42010-11-20 19:04:17 +00001275 self.assertEqual(b'\x00' * 16, f('::'))
1276 self.assertEqual(b'\x00' * 16, f('0::0'))
1277 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1278 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001279 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 +00001280 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1281 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001282 self.assertEqual(
1283 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1284 f('ad42:abc::127:0:254:2')
1285 )
1286 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1287 assertInvalid('0x20::')
1288 assertInvalid(':::')
1289 assertInvalid('::0::')
1290 assertInvalid('1::abc::')
1291 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001292 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001293 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001294 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001295 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001296 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001297 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001298
1299 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1300 f('::254.42.23.64')
1301 )
1302 self.assertEqual(
1303 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1304 f('42::a29b:254.42.23.64')
1305 )
1306 self.assertEqual(
1307 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1308 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1309 )
1310 assertInvalid('255.254.253.252')
1311 assertInvalid('1::260.2.3.0')
1312 assertInvalid('1::0.be.e.0')
1313 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1314 assertInvalid('::1.2.3.4:0')
1315 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001316
Serhiy Storchaka43767632013-11-03 21:31:38 +02001317 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1318 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001319 def testStringToIPv4(self):
1320 from socket import inet_ntoa as f, inet_ntop, AF_INET
1321 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001322 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001323 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001324 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001325
Ezio Melottib3aedd42010-11-20 19:04:17 +00001326 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1327 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1328 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1329 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001330 assertInvalid(f, b'\x00' * 3)
1331 assertInvalid(f, b'\x00' * 5)
1332 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001333 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001334
Ezio Melottib3aedd42010-11-20 19:04:17 +00001335 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1336 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1337 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001338 assertInvalid(g, b'\x00' * 3)
1339 assertInvalid(g, b'\x00' * 5)
1340 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001341 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001342
Serhiy Storchaka43767632013-11-03 21:31:38 +02001343 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1344 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001345 def testStringToIPv6(self):
1346 try:
1347 from socket import inet_ntop, AF_INET6, has_ipv6
1348 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001349 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001350 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001351 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001352
1353 if sys.platform == "win32":
1354 try:
1355 inet_ntop(AF_INET6, b'\x00' * 16)
1356 except OSError as e:
1357 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001358 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001359
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001360 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001361 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001362 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001363 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001364
Ezio Melottib3aedd42010-11-20 19:04:17 +00001365 self.assertEqual('::', f(b'\x00' * 16))
1366 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1367 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001368 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001369 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 +00001370 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001371 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001372
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001373 assertInvalid(b'\x12' * 15)
1374 assertInvalid(b'\x12' * 17)
1375 assertInvalid(b'\x12' * 4)
1376
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001377 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001378
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001379 def testSockName(self):
1380 # Testing getsockname()
Serhiy Storchaka16994912020-04-25 10:06:29 +03001381 port = socket_helper.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001382 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001383 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001384 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001385 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001386 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1387 # it reasonable to get the host's addr in addition to 0.0.0.0.
1388 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001389 try:
1390 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001391 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001392 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001393 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001394 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001395 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001396
1397 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001398 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001399 # We know a socket should start without reuse==0
1400 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001401 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001402 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001403 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001404
1405 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001406 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001407 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001408 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001409 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1410 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001411 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001412
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001413 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001414 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001415 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1416 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001417 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001418
Martin Panter50ab1a32016-04-11 00:38:12 +00001419 def testCloseException(self):
1420 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001421 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001422 socket.socket(fileno=sock.fileno()).close()
1423 try:
1424 sock.close()
1425 except OSError as err:
1426 # Winsock apparently raises ENOTSOCK
1427 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1428 else:
1429 self.fail("close() should raise EBADF/ENOTSOCK")
1430
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001431 def testNewAttributes(self):
1432 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001433
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001434 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1435 self.assertEqual(sock.family, socket.AF_INET)
1436 if hasattr(socket, 'SOCK_CLOEXEC'):
1437 self.assertIn(sock.type,
1438 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1439 socket.SOCK_STREAM))
1440 else:
1441 self.assertEqual(sock.type, socket.SOCK_STREAM)
1442 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001443
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001444 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001445 sock = socket.socket()
1446 self.addCleanup(sock.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001447 port = socket_helper.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001448 big_port = port + 65536
1449 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001450 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1451 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1452 # Since find_unused_port() is inherently subject to race conditions, we
1453 # call it a couple times if necessary.
1454 for i in itertools.count():
Serhiy Storchaka16994912020-04-25 10:06:29 +03001455 port = socket_helper.find_unused_port()
Charles-François Natali65708cf2014-07-25 18:44:30 +01001456 try:
1457 sock.bind((HOST, port))
1458 except OSError as e:
1459 if e.errno != errno.EADDRINUSE or i == 5:
1460 raise
1461 else:
1462 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001463
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001464 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001465 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001466 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1467 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1468 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1469 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001470 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1471 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001472 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001473 self.assertRaises(ValueError, s.ioctl, -1, None)
1474 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001475
Steve Dowerea93ac02016-06-17 12:52:18 -07001476 @unittest.skipUnless(os.name == "nt", "Windows specific")
1477 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1478 'Loopback fast path support required for this test')
1479 def test_sio_loopback_fast_path(self):
1480 s = socket.socket()
1481 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001482 try:
1483 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1484 except OSError as exc:
1485 WSAEOPNOTSUPP = 10045
1486 if exc.winerror == WSAEOPNOTSUPP:
1487 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1488 "doesn't implemented in this Windows version")
1489 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001490 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1491
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001492 def testGetaddrinfo(self):
1493 try:
1494 socket.getaddrinfo('localhost', 80)
1495 except socket.gaierror as err:
1496 if err.errno == socket.EAI_SERVICE:
1497 # see http://bugs.python.org/issue1282647
1498 self.skipTest("buggy libc version")
1499 raise
1500 # len of every sequence is supposed to be == 5
1501 for info in socket.getaddrinfo(HOST, None):
1502 self.assertEqual(len(info), 5)
1503 # host can be a domain name, a string representation of an
1504 # IPv4/v6 address or None
1505 socket.getaddrinfo('localhost', 80)
1506 socket.getaddrinfo('127.0.0.1', 80)
1507 socket.getaddrinfo(None, 80)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001508 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001509 socket.getaddrinfo('::1', 80)
1510 # port can be a string service name such as "http", a numeric
1511 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001512 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1513 if (not hasattr(sys, 'getandroidapilevel') or
1514 sys.getandroidapilevel() >= 23):
1515 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001516 socket.getaddrinfo(HOST, 80)
1517 socket.getaddrinfo(HOST, None)
1518 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001519 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1520 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001521 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001522 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1523 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001524 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001525 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1526 for _, socktype, _, _, _ in infos:
1527 self.assertEqual(socktype, socket.SOCK_STREAM)
1528 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001529 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001530 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1531 # a server willing to support both IPv4 and IPv6 will
1532 # usually do this
1533 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1534 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001535 # test keyword arguments
1536 a = socket.getaddrinfo(HOST, None)
1537 b = socket.getaddrinfo(host=HOST, port=None)
1538 self.assertEqual(a, b)
1539 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1540 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1541 self.assertEqual(a, b)
1542 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1543 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1544 self.assertEqual(a, b)
1545 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1546 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1547 self.assertEqual(a, b)
1548 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1549 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1550 self.assertEqual(a, b)
1551 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1552 socket.AI_PASSIVE)
1553 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1554 type=socket.SOCK_STREAM, proto=0,
1555 flags=socket.AI_PASSIVE)
1556 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001557 # Issue #6697.
1558 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001559
Ned Deilyb24f4812014-02-13 22:50:42 -08001560 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001561 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001562 try:
1563 # The arguments here are undefined and the call may succeed
1564 # or fail. All we care here is that it doesn't segfault.
1565 socket.getaddrinfo("localhost", None, 0, 0, 0,
1566 socket.AI_NUMERICSERV)
1567 except socket.gaierror:
1568 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001569
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001570 def test_getnameinfo(self):
1571 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001572 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001573
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001574 @unittest.skipUnless(support.is_resource_enabled('network'),
1575 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001576 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001577 # Check for internet access before running test
1578 # (issue #12804, issue #25138).
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03001579 with socket_helper.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001580 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001581
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001582 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001583 domain = 'испытание.pythontest.net'
1584 socket.gethostbyname(domain)
1585 socket.gethostbyname_ex(domain)
1586 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001587 # 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 +00001588 # have a reverse entry yet
1589 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001590
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001591 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001592 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001593 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1594 self.skipTest("signal.alarm and socket.socketpair required for this test")
1595 # Our signal handlers clobber the C errno by calling a math function
1596 # with an invalid domain value.
1597 def ok_handler(*args):
1598 self.assertRaises(ValueError, math.acosh, 0)
1599 def raising_handler(*args):
1600 self.assertRaises(ValueError, math.acosh, 0)
1601 1 // 0
1602 c, s = socket.socketpair()
1603 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1604 try:
1605 if with_timeout:
1606 # Just above the one second minimum for signal.alarm
1607 c.settimeout(1.5)
1608 with self.assertRaises(ZeroDivisionError):
1609 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001610 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001611 if with_timeout:
1612 signal.signal(signal.SIGALRM, ok_handler)
1613 signal.alarm(1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01001614 self.assertRaises(TimeoutError, c.sendall,
Charles-François Natali5fd26422013-08-29 19:01:40 +02001615 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001616 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001617 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001618 signal.signal(signal.SIGALRM, old_alarm)
1619 c.close()
1620 s.close()
1621
1622 def test_sendall_interrupted(self):
1623 self.check_sendall_interrupted(False)
1624
1625 def test_sendall_interrupted_with_timeout(self):
1626 self.check_sendall_interrupted(True)
1627
Antoine Pitroue033e062010-10-29 10:38:18 +00001628 def test_dealloc_warn(self):
1629 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1630 r = repr(sock)
1631 with self.assertWarns(ResourceWarning) as cm:
1632 sock = None
1633 support.gc_collect()
1634 self.assertIn(r, str(cm.warning.args[0]))
1635 # An open socket file object gets dereferenced after the socket
1636 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1637 f = sock.makefile('rb')
1638 r = repr(sock)
1639 sock = None
1640 support.gc_collect()
1641 with self.assertWarns(ResourceWarning):
1642 f = None
1643 support.gc_collect()
1644
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001645 def test_name_closed_socketio(self):
1646 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1647 fp = sock.makefile("rb")
1648 fp.close()
1649 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1650
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001651 def test_unusable_closed_socketio(self):
1652 with socket.socket() as sock:
1653 fp = sock.makefile("rb", buffering=0)
1654 self.assertTrue(fp.readable())
1655 self.assertFalse(fp.writable())
1656 self.assertFalse(fp.seekable())
1657 fp.close()
1658 self.assertRaises(ValueError, fp.readable)
1659 self.assertRaises(ValueError, fp.writable)
1660 self.assertRaises(ValueError, fp.seekable)
1661
Christian Heimesd0e31b92018-01-27 09:54:13 +01001662 def test_socket_close(self):
1663 sock = socket.socket()
1664 try:
1665 sock.bind((HOST, 0))
1666 socket.close(sock.fileno())
1667 with self.assertRaises(OSError):
1668 sock.listen(1)
1669 finally:
1670 with self.assertRaises(OSError):
1671 # sock.close() fails with EBADF
1672 sock.close()
1673 with self.assertRaises(TypeError):
1674 socket.close(None)
1675 with self.assertRaises(OSError):
1676 socket.close(-1)
1677
Berker Peksag3fe64d02016-02-18 17:34:00 +02001678 def test_makefile_mode(self):
1679 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1680 with self.subTest(mode=mode):
1681 with socket.socket() as sock:
1682 with sock.makefile(mode) as fp:
1683 self.assertEqual(fp.mode, mode)
1684
1685 def test_makefile_invalid_mode(self):
1686 for mode in 'rt', 'x', '+', 'a':
1687 with self.subTest(mode=mode):
1688 with socket.socket() as sock:
1689 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1690 sock.makefile(mode)
1691
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001692 def test_pickle(self):
1693 sock = socket.socket()
1694 with sock:
1695 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1696 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001697 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1698 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1699 self.assertEqual(family, socket.AF_INET)
1700 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1701 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001702
Serhiy Storchaka78980432013-01-15 01:12:17 +02001703 def test_listen_backlog(self):
1704 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001705 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1706 srv.bind((HOST, 0))
1707 srv.listen(backlog)
1708
1709 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001710 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001711 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001712
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001713 @support.cpython_only
1714 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001715 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001716 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001717 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1718 srv.bind((HOST, 0))
1719 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001720
Serhiy Storchaka16994912020-04-25 10:06:29 +03001721 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001722 def test_flowinfo(self):
1723 self.assertRaises(OverflowError, socket.getnameinfo,
Serhiy Storchaka16994912020-04-25 10:06:29 +03001724 (socket_helper.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001725 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03001726 self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001727
Serhiy Storchaka16994912020-04-25 10:06:29 +03001728 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001729 def test_getaddrinfo_ipv6_basic(self):
1730 ((*_, sockaddr),) = socket.getaddrinfo(
1731 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1732 1234, socket.AF_INET6,
1733 socket.SOCK_DGRAM,
1734 socket.IPPROTO_UDP
1735 )
1736 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1737
Serhiy Storchaka16994912020-04-25 10:06:29 +03001738 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001739 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001740 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001741 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1742 # Just pick up any network interface (Linux, Mac OS X)
1743 (ifindex, test_interface) = socket.if_nameindex()[0]
1744 ((*_, sockaddr),) = socket.getaddrinfo(
1745 'ff02::1de:c0:face:8D%' + test_interface,
1746 1234, socket.AF_INET6,
1747 socket.SOCK_DGRAM,
1748 socket.IPPROTO_UDP
1749 )
1750 # Note missing interface name part in IPv6 address
1751 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1752
Serhiy Storchaka16994912020-04-25 10:06:29 +03001753 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001754 @unittest.skipUnless(
1755 sys.platform == 'win32',
1756 'Numeric scope id does not work or undocumented')
1757 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1758 # Also works on Linux and Mac OS X, but is not documented (?)
1759 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1760 ifindex = 42
1761 ((*_, sockaddr),) = socket.getaddrinfo(
1762 'ff02::1de:c0:face:8D%' + str(ifindex),
1763 1234, socket.AF_INET6,
1764 socket.SOCK_DGRAM,
1765 socket.IPPROTO_UDP
1766 )
1767 # Note missing interface name part in IPv6 address
1768 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1769
Serhiy Storchaka16994912020-04-25 10:06:29 +03001770 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001771 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001772 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001773 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1774 # Just pick up any network interface.
1775 (ifindex, test_interface) = socket.if_nameindex()[0]
1776 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1777 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1778 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1779
Serhiy Storchaka16994912020-04-25 10:06:29 +03001780 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001781 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001782 'Numeric scope id does not work or undocumented')
1783 def test_getnameinfo_ipv6_scopeid_numeric(self):
1784 # Also works on Linux (undocumented), but does not work on Mac OS X
1785 # Windows and Linux allow nonexistent interface numbers here.
1786 ifindex = 42
1787 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1788 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1789 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1790
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001791 def test_str_for_enums(self):
1792 # Make sure that the AF_* and SOCK_* constants have enum-like string
1793 # reprs.
1794 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1795 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001796 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001797
Yury Selivanov98181422017-12-18 20:02:54 -05001798 def test_socket_consistent_sock_type(self):
1799 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1800 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1801 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1802
1803 with socket.socket(socket.AF_INET, sock_type) as s:
1804 self.assertEqual(s.type, socket.SOCK_STREAM)
1805 s.settimeout(1)
1806 self.assertEqual(s.type, socket.SOCK_STREAM)
1807 s.settimeout(0)
1808 self.assertEqual(s.type, socket.SOCK_STREAM)
1809 s.setblocking(True)
1810 self.assertEqual(s.type, socket.SOCK_STREAM)
1811 s.setblocking(False)
1812 self.assertEqual(s.type, socket.SOCK_STREAM)
1813
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001814 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001815 # Test that when created with a family that's not one of the known
1816 # AF_*/SOCK_* constants, socket.family just returns the number.
1817 #
1818 # To do this we fool socket.socket into believing it already has an
1819 # open fd because on this path it doesn't actually verify the family and
1820 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001821 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1822 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001823 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1824
1825 unknown_type = max(
1826 kind
1827 for name, kind in socket.SocketKind.__members__.items()
1828 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1829 ) + 1
1830
1831 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001832 family=unknown_family, type=unknown_type, proto=23,
1833 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001834 self.assertEqual(s.family, unknown_family)
1835 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001836 # some OS like macOS ignore proto
1837 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001838
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001839 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1840 def test__sendfile_use_sendfile(self):
1841 class File:
1842 def __init__(self, fd):
1843 self.fd = fd
1844
1845 def fileno(self):
1846 return self.fd
1847 with socket.socket() as sock:
1848 fd = os.open(os.curdir, os.O_RDONLY)
1849 os.close(fd)
1850 with self.assertRaises(socket._GiveupOnSendfile):
1851 sock._sendfile_use_sendfile(File(fd))
1852 with self.assertRaises(OverflowError):
1853 sock._sendfile_use_sendfile(File(2**1000))
1854 with self.assertRaises(TypeError):
1855 sock._sendfile_use_sendfile(File(None))
1856
Christian Heimesb6e43af2018-01-29 22:37:58 +01001857 def _test_socket_fileno(self, s, family, stype):
1858 self.assertEqual(s.family, family)
1859 self.assertEqual(s.type, stype)
1860
1861 fd = s.fileno()
1862 s2 = socket.socket(fileno=fd)
1863 self.addCleanup(s2.close)
1864 # detach old fd to avoid double close
1865 s.detach()
1866 self.assertEqual(s2.family, family)
1867 self.assertEqual(s2.type, stype)
1868 self.assertEqual(s2.fileno(), fd)
1869
1870 def test_socket_fileno(self):
1871 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1872 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001873 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001874 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1875
1876 if hasattr(socket, "SOCK_DGRAM"):
1877 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1878 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001879 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001880 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1881
Serhiy Storchaka16994912020-04-25 10:06:29 +03001882 if socket_helper.IPV6_ENABLED:
Christian Heimesb6e43af2018-01-29 22:37:58 +01001883 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1884 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001885 s.bind((socket_helper.HOSTv6, 0, 0, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001886 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1887
1888 if hasattr(socket, "AF_UNIX"):
1889 tmpdir = tempfile.mkdtemp()
1890 self.addCleanup(shutil.rmtree, tmpdir)
1891 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1892 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001893 try:
1894 s.bind(os.path.join(tmpdir, 'socket'))
1895 except PermissionError:
1896 pass
1897 else:
1898 self._test_socket_fileno(s, socket.AF_UNIX,
1899 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001900
Dima Tisneke9912702018-12-17 22:07:55 +09001901 def test_socket_fileno_rejects_float(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001902 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001903 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1904
1905 def test_socket_fileno_rejects_other_types(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001906 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001907 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1908
1909 def test_socket_fileno_rejects_invalid_socket(self):
1910 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1911 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1912
1913 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1914 def test_socket_fileno_rejects_negative(self):
1915 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1916 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1917
1918 def test_socket_fileno_requires_valid_fd(self):
1919 WSAENOTSOCK = 10038
1920 with self.assertRaises(OSError) as cm:
Hai Shideb01622020-07-06 20:29:49 +08001921 socket.socket(fileno=os_helper.make_bad_fd())
Dima Tisneke9912702018-12-17 22:07:55 +09001922 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1923
1924 with self.assertRaises(OSError) as cm:
1925 socket.socket(
1926 socket.AF_INET,
1927 socket.SOCK_STREAM,
Hai Shideb01622020-07-06 20:29:49 +08001928 fileno=os_helper.make_bad_fd())
Dima Tisneke9912702018-12-17 22:07:55 +09001929 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1930
1931 def test_socket_fileno_requires_socket_fd(self):
1932 with tempfile.NamedTemporaryFile() as afile:
1933 with self.assertRaises(OSError):
1934 socket.socket(fileno=afile.fileno())
1935
1936 with self.assertRaises(OSError) as cm:
1937 socket.socket(
1938 socket.AF_INET,
1939 socket.SOCK_STREAM,
1940 fileno=afile.fileno())
1941 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1942
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001943
Charles-François Natali47413c12011-10-06 19:47:44 +02001944@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1945class BasicCANTest(unittest.TestCase):
1946
1947 def testCrucialConstants(self):
1948 socket.AF_CAN
1949 socket.PF_CAN
1950 socket.CAN_RAW
1951
Charles-François Natali773e42d2013-02-05 19:42:01 +01001952 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1953 'socket.CAN_BCM required for this test.')
1954 def testBCMConstants(self):
1955 socket.CAN_BCM
1956
1957 # opcodes
1958 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1959 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1960 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1961 socket.CAN_BCM_TX_SEND # send one CAN frame
1962 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1963 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1964 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1965 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1966 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1967 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1968 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1969 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1970
karl ding31c4fd22019-07-31 01:47:16 -07001971 # flags
1972 socket.CAN_BCM_SETTIMER
1973 socket.CAN_BCM_STARTTIMER
1974 socket.CAN_BCM_TX_COUNTEVT
1975 socket.CAN_BCM_TX_ANNOUNCE
1976 socket.CAN_BCM_TX_CP_CAN_ID
1977 socket.CAN_BCM_RX_FILTER_ID
1978 socket.CAN_BCM_RX_CHECK_DLC
1979 socket.CAN_BCM_RX_NO_AUTOTIMER
1980 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1981 socket.CAN_BCM_TX_RESET_MULTI_IDX
1982 socket.CAN_BCM_RX_RTR_FRAME
1983
Charles-François Natali47413c12011-10-06 19:47:44 +02001984 def testCreateSocket(self):
1985 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1986 pass
1987
Charles-François Natali773e42d2013-02-05 19:42:01 +01001988 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1989 'socket.CAN_BCM required for this test.')
1990 def testCreateBCMSocket(self):
1991 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1992 pass
1993
Charles-François Natali47413c12011-10-06 19:47:44 +02001994 def testBindAny(self):
1995 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001996 address = ('', )
1997 s.bind(address)
1998 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001999
2000 def testTooLongInterfaceName(self):
2001 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2002 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002003 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02002004 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02002005
2006 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
2007 'socket.CAN_RAW_LOOPBACK required for this test.')
2008 def testLoopback(self):
2009 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2010 for loopback in (0, 1):
2011 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
2012 loopback)
2013 self.assertEqual(loopback,
2014 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
2015
2016 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
2017 'socket.CAN_RAW_FILTER required for this test.')
2018 def testFilter(self):
2019 can_id, can_mask = 0x200, 0x700
2020 can_filter = struct.pack("=II", can_id, can_mask)
2021 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2022 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
2023 self.assertEqual(can_filter,
2024 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002025 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02002026
2027
2028@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02002029class CANTest(ThreadedCANSocketTest):
2030
Charles-François Natali47413c12011-10-06 19:47:44 +02002031 def __init__(self, methodName='runTest'):
2032 ThreadedCANSocketTest.__init__(self, methodName=methodName)
2033
2034 @classmethod
2035 def build_can_frame(cls, can_id, data):
2036 """Build a CAN frame."""
2037 can_dlc = len(data)
2038 data = data.ljust(8, b'\x00')
2039 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2040
2041 @classmethod
2042 def dissect_can_frame(cls, frame):
2043 """Dissect a CAN frame."""
2044 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2045 return (can_id, can_dlc, data[:can_dlc])
2046
2047 def testSendFrame(self):
2048 cf, addr = self.s.recvfrom(self.bufsize)
2049 self.assertEqual(self.cf, cf)
2050 self.assertEqual(addr[0], self.interface)
2051 self.assertEqual(addr[1], socket.AF_CAN)
2052
2053 def _testSendFrame(self):
2054 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2055 self.cli.send(self.cf)
2056
2057 def testSendMaxFrame(self):
2058 cf, addr = self.s.recvfrom(self.bufsize)
2059 self.assertEqual(self.cf, cf)
2060
2061 def _testSendMaxFrame(self):
2062 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2063 self.cli.send(self.cf)
2064
2065 def testSendMultiFrames(self):
2066 cf, addr = self.s.recvfrom(self.bufsize)
2067 self.assertEqual(self.cf1, cf)
2068
2069 cf, addr = self.s.recvfrom(self.bufsize)
2070 self.assertEqual(self.cf2, cf)
2071
2072 def _testSendMultiFrames(self):
2073 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2074 self.cli.send(self.cf1)
2075
2076 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2077 self.cli.send(self.cf2)
2078
Charles-François Natali773e42d2013-02-05 19:42:01 +01002079 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2080 'socket.CAN_BCM required for this test.')
2081 def _testBCM(self):
2082 cf, addr = self.cli.recvfrom(self.bufsize)
2083 self.assertEqual(self.cf, cf)
2084 can_id, can_dlc, data = self.dissect_can_frame(cf)
2085 self.assertEqual(self.can_id, can_id)
2086 self.assertEqual(self.data, data)
2087
2088 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2089 'socket.CAN_BCM required for this test.')
2090 def testBCM(self):
2091 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2092 self.addCleanup(bcm.close)
2093 bcm.connect((self.interface,))
2094 self.can_id = 0x123
2095 self.data = bytes([0xc0, 0xff, 0xee])
2096 self.cf = self.build_can_frame(self.can_id, self.data)
2097 opcode = socket.CAN_BCM_TX_SEND
2098 flags = 0
2099 count = 0
2100 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2101 bcm_can_id = 0x0222
2102 nframes = 1
2103 assert len(self.cf) == 16
2104 header = struct.pack(self.bcm_cmd_msg_fmt,
2105 opcode,
2106 flags,
2107 count,
2108 ival1_seconds,
2109 ival1_usec,
2110 ival2_seconds,
2111 ival2_usec,
2112 bcm_can_id,
2113 nframes,
2114 )
2115 header_plus_frame = header + self.cf
2116 bytes_sent = bcm.send(header_plus_frame)
2117 self.assertEqual(bytes_sent, len(header_plus_frame))
2118
Charles-François Natali47413c12011-10-06 19:47:44 +02002119
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002120@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2121class ISOTPTest(unittest.TestCase):
2122
2123 def __init__(self, *args, **kwargs):
2124 super().__init__(*args, **kwargs)
2125 self.interface = "vcan0"
2126
2127 def testCrucialConstants(self):
2128 socket.AF_CAN
2129 socket.PF_CAN
2130 socket.CAN_ISOTP
2131 socket.SOCK_DGRAM
2132
2133 def testCreateSocket(self):
2134 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2135 pass
2136
2137 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2138 'socket.CAN_ISOTP required for this test.')
2139 def testCreateISOTPSocket(self):
2140 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2141 pass
2142
2143 def testTooLongInterfaceName(self):
2144 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2145 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2146 with self.assertRaisesRegex(OSError, 'interface name too long'):
2147 s.bind(('x' * 1024, 1, 2))
2148
2149 def testBind(self):
2150 try:
2151 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2152 addr = self.interface, 0x123, 0x456
2153 s.bind(addr)
2154 self.assertEqual(s.getsockname(), addr)
2155 except OSError as e:
2156 if e.errno == errno.ENODEV:
2157 self.skipTest('network interface `%s` does not exist' %
2158 self.interface)
2159 else:
2160 raise
2161
2162
karl ding360371f2020-04-29 15:31:19 -07002163@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2164class J1939Test(unittest.TestCase):
2165
2166 def __init__(self, *args, **kwargs):
2167 super().__init__(*args, **kwargs)
2168 self.interface = "vcan0"
2169
2170 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2171 'socket.CAN_J1939 required for this test.')
2172 def testJ1939Constants(self):
2173 socket.CAN_J1939
2174
2175 socket.J1939_MAX_UNICAST_ADDR
2176 socket.J1939_IDLE_ADDR
2177 socket.J1939_NO_ADDR
2178 socket.J1939_NO_NAME
2179 socket.J1939_PGN_REQUEST
2180 socket.J1939_PGN_ADDRESS_CLAIMED
2181 socket.J1939_PGN_ADDRESS_COMMANDED
2182 socket.J1939_PGN_PDU1_MAX
2183 socket.J1939_PGN_MAX
2184 socket.J1939_NO_PGN
2185
2186 # J1939 socket options
2187 socket.SO_J1939_FILTER
2188 socket.SO_J1939_PROMISC
2189 socket.SO_J1939_SEND_PRIO
2190 socket.SO_J1939_ERRQUEUE
2191
2192 socket.SCM_J1939_DEST_ADDR
2193 socket.SCM_J1939_DEST_NAME
2194 socket.SCM_J1939_PRIO
2195 socket.SCM_J1939_ERRQUEUE
2196
2197 socket.J1939_NLA_PAD
2198 socket.J1939_NLA_BYTES_ACKED
2199
2200 socket.J1939_EE_INFO_NONE
2201 socket.J1939_EE_INFO_TX_ABORT
2202
2203 socket.J1939_FILTER_MAX
2204
2205 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2206 'socket.CAN_J1939 required for this test.')
2207 def testCreateJ1939Socket(self):
2208 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2209 pass
2210
2211 def testBind(self):
2212 try:
2213 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2214 addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2215 s.bind(addr)
2216 self.assertEqual(s.getsockname(), addr)
2217 except OSError as e:
2218 if e.errno == errno.ENODEV:
2219 self.skipTest('network interface `%s` does not exist' %
2220 self.interface)
2221 else:
2222 raise
2223
2224
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002225@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2226class BasicRDSTest(unittest.TestCase):
2227
2228 def testCrucialConstants(self):
2229 socket.AF_RDS
2230 socket.PF_RDS
2231
2232 def testCreateSocket(self):
2233 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2234 pass
2235
2236 def testSocketBufferSize(self):
2237 bufsize = 16384
2238 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2239 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2240 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2241
2242
2243@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002244class RDSTest(ThreadedRDSSocketTest):
2245
2246 def __init__(self, methodName='runTest'):
2247 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2248
Charles-François Natali240c55f2011-11-10 20:33:36 +01002249 def setUp(self):
2250 super().setUp()
2251 self.evt = threading.Event()
2252
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002253 def testSendAndRecv(self):
2254 data, addr = self.serv.recvfrom(self.bufsize)
2255 self.assertEqual(self.data, data)
2256 self.assertEqual(self.cli_addr, addr)
2257
2258 def _testSendAndRecv(self):
2259 self.data = b'spam'
2260 self.cli.sendto(self.data, 0, (HOST, self.port))
2261
2262 def testPeek(self):
2263 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2264 self.assertEqual(self.data, data)
2265 data, addr = self.serv.recvfrom(self.bufsize)
2266 self.assertEqual(self.data, data)
2267
2268 def _testPeek(self):
2269 self.data = b'spam'
2270 self.cli.sendto(self.data, 0, (HOST, self.port))
2271
2272 @requireAttrs(socket.socket, 'recvmsg')
2273 def testSendAndRecvMsg(self):
2274 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2275 self.assertEqual(self.data, data)
2276
2277 @requireAttrs(socket.socket, 'sendmsg')
2278 def _testSendAndRecvMsg(self):
2279 self.data = b'hello ' * 10
2280 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2281
2282 def testSendAndRecvMulti(self):
2283 data, addr = self.serv.recvfrom(self.bufsize)
2284 self.assertEqual(self.data1, data)
2285
2286 data, addr = self.serv.recvfrom(self.bufsize)
2287 self.assertEqual(self.data2, data)
2288
2289 def _testSendAndRecvMulti(self):
2290 self.data1 = b'bacon'
2291 self.cli.sendto(self.data1, 0, (HOST, self.port))
2292
2293 self.data2 = b'egg'
2294 self.cli.sendto(self.data2, 0, (HOST, self.port))
2295
2296 def testSelect(self):
2297 r, w, x = select.select([self.serv], [], [], 3.0)
2298 self.assertIn(self.serv, r)
2299 data, addr = self.serv.recvfrom(self.bufsize)
2300 self.assertEqual(self.data, data)
2301
2302 def _testSelect(self):
2303 self.data = b'select'
2304 self.cli.sendto(self.data, 0, (HOST, self.port))
2305
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002306@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2307 'QIPCRTR sockets required for this test.')
2308class BasicQIPCRTRTest(unittest.TestCase):
2309
2310 def testCrucialConstants(self):
2311 socket.AF_QIPCRTR
2312
2313 def testCreateSocket(self):
2314 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2315 pass
2316
2317 def testUnbound(self):
2318 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2319 self.assertEqual(s.getsockname()[1], 0)
2320
2321 def testBindSock(self):
2322 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002323 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002324 self.assertNotEqual(s.getsockname()[1], 0)
2325
2326 def testInvalidBindSock(self):
2327 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002328 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002329
2330 def testAutoBindSock(self):
2331 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2332 s.connect((123, 123))
2333 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002334
caaveryeffc12f2017-09-06 18:18:10 -04002335@unittest.skipIf(fcntl is None, "need fcntl")
2336@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2337 'VSOCK sockets required for this test.')
2338class BasicVSOCKTest(unittest.TestCase):
2339
2340 def testCrucialConstants(self):
2341 socket.AF_VSOCK
2342
2343 def testVSOCKConstants(self):
2344 socket.SO_VM_SOCKETS_BUFFER_SIZE
2345 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2346 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2347 socket.VMADDR_CID_ANY
2348 socket.VMADDR_PORT_ANY
2349 socket.VMADDR_CID_HOST
2350 socket.VM_SOCKETS_INVALID_VERSION
2351 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2352
2353 def testCreateSocket(self):
2354 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2355 pass
2356
2357 def testSocketBufferSize(self):
2358 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2359 orig_max = s.getsockopt(socket.AF_VSOCK,
2360 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2361 orig = s.getsockopt(socket.AF_VSOCK,
2362 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2363 orig_min = s.getsockopt(socket.AF_VSOCK,
2364 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2365
2366 s.setsockopt(socket.AF_VSOCK,
2367 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2368 s.setsockopt(socket.AF_VSOCK,
2369 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2370 s.setsockopt(socket.AF_VSOCK,
2371 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2372
2373 self.assertEqual(orig_max * 2,
2374 s.getsockopt(socket.AF_VSOCK,
2375 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2376 self.assertEqual(orig * 2,
2377 s.getsockopt(socket.AF_VSOCK,
2378 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2379 self.assertEqual(orig_min * 2,
2380 s.getsockopt(socket.AF_VSOCK,
2381 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2382
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002383
Greg Bowser8fbece12019-08-02 16:29:52 -04002384@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2385 'Bluetooth sockets required for this test.')
2386class BasicBluetoothTest(unittest.TestCase):
2387
2388 def testBluetoothConstants(self):
2389 socket.BDADDR_ANY
2390 socket.BDADDR_LOCAL
2391 socket.AF_BLUETOOTH
2392 socket.BTPROTO_RFCOMM
2393
2394 if sys.platform != "win32":
2395 socket.BTPROTO_HCI
2396 socket.SOL_HCI
2397 socket.BTPROTO_L2CAP
2398
2399 if not sys.platform.startswith("freebsd"):
2400 socket.BTPROTO_SCO
2401
2402 def testCreateRfcommSocket(self):
2403 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2404 pass
2405
2406 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2407 def testCreateL2capSocket(self):
2408 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2409 pass
2410
2411 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2412 def testCreateHciSocket(self):
2413 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2414 pass
2415
2416 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2417 "windows and freebsd do not support SCO sockets")
2418 def testCreateScoSocket(self):
2419 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2420 pass
2421
2422
Guido van Rossum24e4af82002-06-12 19:18:08 +00002423class BasicTCPTest(SocketConnectedTest):
2424
2425 def __init__(self, methodName='runTest'):
2426 SocketConnectedTest.__init__(self, methodName=methodName)
2427
2428 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002429 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002430 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002431 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002432
2433 def _testRecv(self):
2434 self.serv_conn.send(MSG)
2435
2436 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002437 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002438 seg1 = self.cli_conn.recv(len(MSG) - 3)
2439 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002440 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002441 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002442
2443 def _testOverFlowRecv(self):
2444 self.serv_conn.send(MSG)
2445
2446 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002447 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002448 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002449 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002450
2451 def _testRecvFrom(self):
2452 self.serv_conn.send(MSG)
2453
2454 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002455 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002456 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2457 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002458 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002459 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002460
2461 def _testOverFlowRecvFrom(self):
2462 self.serv_conn.send(MSG)
2463
2464 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002465 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002466 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002467 while 1:
2468 read = self.cli_conn.recv(1024)
2469 if not read:
2470 break
Guido van Rossume531e292002-08-08 20:28:34 +00002471 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002472 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002473
2474 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002475 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002476 self.serv_conn.sendall(big_chunk)
2477
2478 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002479 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002480 fd = self.cli_conn.fileno()
2481 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002482 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002483 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002484 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002485 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002486
2487 def _testFromFd(self):
2488 self.serv_conn.send(MSG)
2489
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002490 def testDup(self):
2491 # Testing dup()
2492 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002493 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002494 msg = sock.recv(1024)
2495 self.assertEqual(msg, MSG)
2496
2497 def _testDup(self):
2498 self.serv_conn.send(MSG)
2499
Guido van Rossum24e4af82002-06-12 19:18:08 +00002500 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002501 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002502 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002503 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002504 # wait for _testShutdown to finish: on OS X, when the server
2505 # closes the connection the client also becomes disconnected,
2506 # and the client's shutdown call will fail. (Issue #4397.)
2507 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002508
2509 def _testShutdown(self):
2510 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002511 self.serv_conn.shutdown(2)
2512
2513 testShutdown_overflow = support.cpython_only(testShutdown)
2514
2515 @support.cpython_only
2516 def _testShutdown_overflow(self):
2517 import _testcapi
2518 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002519 # Issue 15989
2520 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2521 _testcapi.INT_MAX + 1)
2522 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2523 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002524 self.serv_conn.shutdown(2)
2525
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002526 def testDetach(self):
2527 # Testing detach()
2528 fileno = self.cli_conn.fileno()
2529 f = self.cli_conn.detach()
2530 self.assertEqual(f, fileno)
2531 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002532 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002533 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002534 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002535 # ...but we can create another socket using the (still open)
2536 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002537 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002538 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002539 msg = sock.recv(1024)
2540 self.assertEqual(msg, MSG)
2541
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002542 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002543 self.serv_conn.send(MSG)
2544
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002545
Guido van Rossum24e4af82002-06-12 19:18:08 +00002546class BasicUDPTest(ThreadedUDPSocketTest):
2547
2548 def __init__(self, methodName='runTest'):
2549 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2550
2551 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002552 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002553 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002554 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002555
2556 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002557 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002558
Guido van Rossum1c938012002-06-12 21:17:20 +00002559 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002560 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002561 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002562 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002563
Guido van Rossum1c938012002-06-12 21:17:20 +00002564 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002565 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002566
Guido van Rossumd8faa362007-04-27 19:54:29 +00002567 def testRecvFromNegative(self):
2568 # Negative lengths passed to recvfrom should give ValueError.
2569 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2570
2571 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002572 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002573
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002574
2575@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2576 'UDPLITE sockets required for this test.')
2577class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2578
2579 def __init__(self, methodName='runTest'):
2580 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2581
2582 def testSendtoAndRecv(self):
2583 # Testing sendto() and Recv() over UDPLITE
2584 msg = self.serv.recv(len(MSG))
2585 self.assertEqual(msg, MSG)
2586
2587 def _testSendtoAndRecv(self):
2588 self.cli.sendto(MSG, 0, (HOST, self.port))
2589
2590 def testRecvFrom(self):
2591 # Testing recvfrom() over UDPLITE
2592 msg, addr = self.serv.recvfrom(len(MSG))
2593 self.assertEqual(msg, MSG)
2594
2595 def _testRecvFrom(self):
2596 self.cli.sendto(MSG, 0, (HOST, self.port))
2597
2598 def testRecvFromNegative(self):
2599 # Negative lengths passed to recvfrom should give ValueError.
2600 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2601
2602 def _testRecvFromNegative(self):
2603 self.cli.sendto(MSG, 0, (HOST, self.port))
2604
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002605# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2606# same test code is used with different families and types of socket
2607# (e.g. stream, datagram), and tests using recvmsg() are repeated
2608# using recvmsg_into().
2609#
2610# The generic test classes such as SendmsgTests and
2611# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2612# supplied with sockets cli_sock and serv_sock representing the
2613# client's and the server's end of the connection respectively, and
2614# attributes cli_addr and serv_addr holding their (numeric where
2615# appropriate) addresses.
2616#
2617# The final concrete test classes combine these with subclasses of
2618# SocketTestBase which set up client and server sockets of a specific
2619# type, and with subclasses of SendrecvmsgBase such as
2620# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2621# sockets to cli_sock and serv_sock and override the methods and
2622# attributes of SendrecvmsgBase to fill in destination addresses if
2623# needed when sending, check for specific flags in msg_flags, etc.
2624#
2625# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2626# recvmsg_into().
2627
2628# XXX: like the other datagram (UDP) tests in this module, the code
2629# here assumes that datagram delivery on the local machine will be
2630# reliable.
2631
2632class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2633 # Base class for sendmsg()/recvmsg() tests.
2634
2635 # Time in seconds to wait before considering a test failed, or
2636 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002637 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002638
2639 def setUp(self):
2640 self.misc_event = threading.Event()
2641 super().setUp()
2642
2643 def sendToServer(self, msg):
2644 # Send msg to the server.
2645 return self.cli_sock.send(msg)
2646
2647 # Tuple of alternative default arguments for sendmsg() when called
2648 # via sendmsgToServer() (e.g. to include a destination address).
2649 sendmsg_to_server_defaults = ()
2650
2651 def sendmsgToServer(self, *args):
2652 # Call sendmsg() on self.cli_sock with the given arguments,
2653 # filling in any arguments which are not supplied with the
2654 # corresponding items of self.sendmsg_to_server_defaults, if
2655 # any.
2656 return self.cli_sock.sendmsg(
2657 *(args + self.sendmsg_to_server_defaults[len(args):]))
2658
2659 def doRecvmsg(self, sock, bufsize, *args):
2660 # Call recvmsg() on sock with given arguments and return its
2661 # result. Should be used for tests which can use either
2662 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2663 # this method with one which emulates it using recvmsg_into(),
2664 # thus allowing the same test to be used for both methods.
2665 result = sock.recvmsg(bufsize, *args)
2666 self.registerRecvmsgResult(result)
2667 return result
2668
2669 def registerRecvmsgResult(self, result):
2670 # Called by doRecvmsg() with the return value of recvmsg() or
2671 # recvmsg_into(). Can be overridden to arrange cleanup based
2672 # on the returned ancillary data, for instance.
2673 pass
2674
2675 def checkRecvmsgAddress(self, addr1, addr2):
2676 # Called to compare the received address with the address of
2677 # the peer.
2678 self.assertEqual(addr1, addr2)
2679
2680 # Flags that are normally unset in msg_flags
2681 msg_flags_common_unset = 0
2682 for name in ("MSG_CTRUNC", "MSG_OOB"):
2683 msg_flags_common_unset |= getattr(socket, name, 0)
2684
2685 # Flags that are normally set
2686 msg_flags_common_set = 0
2687
2688 # Flags set when a complete record has been received (e.g. MSG_EOR
2689 # for SCTP)
2690 msg_flags_eor_indicator = 0
2691
2692 # Flags set when a complete record has not been received
2693 # (e.g. MSG_TRUNC for datagram sockets)
2694 msg_flags_non_eor_indicator = 0
2695
2696 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2697 # Method to check the value of msg_flags returned by recvmsg[_into]().
2698 #
2699 # Checks that all bits in msg_flags_common_set attribute are
2700 # set in "flags" and all bits in msg_flags_common_unset are
2701 # unset.
2702 #
2703 # The "eor" argument specifies whether the flags should
2704 # indicate that a full record (or datagram) has been received.
2705 # If "eor" is None, no checks are done; otherwise, checks
2706 # that:
2707 #
2708 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2709 # set and all bits in msg_flags_non_eor_indicator are unset
2710 #
2711 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2712 # are set and all bits in msg_flags_eor_indicator are unset
2713 #
2714 # If "checkset" and/or "checkunset" are supplied, they require
2715 # the given bits to be set or unset respectively, overriding
2716 # what the attributes require for those bits.
2717 #
2718 # If any bits are set in "ignore", they will not be checked,
2719 # regardless of the other inputs.
2720 #
2721 # Will raise Exception if the inputs require a bit to be both
2722 # set and unset, and it is not ignored.
2723
2724 defaultset = self.msg_flags_common_set
2725 defaultunset = self.msg_flags_common_unset
2726
2727 if eor:
2728 defaultset |= self.msg_flags_eor_indicator
2729 defaultunset |= self.msg_flags_non_eor_indicator
2730 elif eor is not None:
2731 defaultset |= self.msg_flags_non_eor_indicator
2732 defaultunset |= self.msg_flags_eor_indicator
2733
2734 # Function arguments override defaults
2735 defaultset &= ~checkunset
2736 defaultunset &= ~checkset
2737
2738 # Merge arguments with remaining defaults, and check for conflicts
2739 checkset |= defaultset
2740 checkunset |= defaultunset
2741 inboth = checkset & checkunset & ~ignore
2742 if inboth:
2743 raise Exception("contradictory set, unset requirements for flags "
2744 "{0:#x}".format(inboth))
2745
2746 # Compare with given msg_flags value
2747 mask = (checkset | checkunset) & ~ignore
2748 self.assertEqual(flags & mask, checkset & mask)
2749
2750
2751class RecvmsgIntoMixin(SendrecvmsgBase):
2752 # Mixin to implement doRecvmsg() using recvmsg_into().
2753
2754 def doRecvmsg(self, sock, bufsize, *args):
2755 buf = bytearray(bufsize)
2756 result = sock.recvmsg_into([buf], *args)
2757 self.registerRecvmsgResult(result)
2758 self.assertGreaterEqual(result[0], 0)
2759 self.assertLessEqual(result[0], bufsize)
2760 return (bytes(buf[:result[0]]),) + result[1:]
2761
2762
2763class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2764 # Defines flags to be checked in msg_flags for datagram sockets.
2765
2766 @property
2767 def msg_flags_non_eor_indicator(self):
2768 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2769
2770
2771class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2772 # Defines flags to be checked in msg_flags for SCTP sockets.
2773
2774 @property
2775 def msg_flags_eor_indicator(self):
2776 return super().msg_flags_eor_indicator | socket.MSG_EOR
2777
2778
2779class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2780 # Base class for tests on connectionless-mode sockets. Users must
2781 # supply sockets on attributes cli and serv to be mapped to
2782 # cli_sock and serv_sock respectively.
2783
2784 @property
2785 def serv_sock(self):
2786 return self.serv
2787
2788 @property
2789 def cli_sock(self):
2790 return self.cli
2791
2792 @property
2793 def sendmsg_to_server_defaults(self):
2794 return ([], [], 0, self.serv_addr)
2795
2796 def sendToServer(self, msg):
2797 return self.cli_sock.sendto(msg, self.serv_addr)
2798
2799
2800class SendrecvmsgConnectedBase(SendrecvmsgBase):
2801 # Base class for tests on connected sockets. Users must supply
2802 # sockets on attributes serv_conn and cli_conn (representing the
2803 # connections *to* the server and the client), to be mapped to
2804 # cli_sock and serv_sock respectively.
2805
2806 @property
2807 def serv_sock(self):
2808 return self.cli_conn
2809
2810 @property
2811 def cli_sock(self):
2812 return self.serv_conn
2813
2814 def checkRecvmsgAddress(self, addr1, addr2):
2815 # Address is currently "unspecified" for a connected socket,
2816 # so we don't examine it
2817 pass
2818
2819
2820class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2821 # Base class to set a timeout on server's socket.
2822
2823 def setUp(self):
2824 super().setUp()
2825 self.serv_sock.settimeout(self.fail_timeout)
2826
2827
2828class SendmsgTests(SendrecvmsgServerTimeoutBase):
2829 # Tests for sendmsg() which can use any socket type and do not
2830 # involve recvmsg() or recvmsg_into().
2831
2832 def testSendmsg(self):
2833 # Send a simple message with sendmsg().
2834 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2835
2836 def _testSendmsg(self):
2837 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2838
2839 def testSendmsgDataGenerator(self):
2840 # Send from buffer obtained from a generator (not a sequence).
2841 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2842
2843 def _testSendmsgDataGenerator(self):
2844 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2845 len(MSG))
2846
2847 def testSendmsgAncillaryGenerator(self):
2848 # Gather (empty) ancillary data from a generator.
2849 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2850
2851 def _testSendmsgAncillaryGenerator(self):
2852 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2853 len(MSG))
2854
2855 def testSendmsgArray(self):
2856 # Send data from an array instead of the usual bytes object.
2857 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2858
2859 def _testSendmsgArray(self):
2860 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2861 len(MSG))
2862
2863 def testSendmsgGather(self):
2864 # Send message data from more than one buffer (gather write).
2865 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2866
2867 def _testSendmsgGather(self):
2868 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2869
2870 def testSendmsgBadArgs(self):
2871 # Check that sendmsg() rejects invalid arguments.
2872 self.assertEqual(self.serv_sock.recv(1000), b"done")
2873
2874 def _testSendmsgBadArgs(self):
2875 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2876 self.assertRaises(TypeError, self.sendmsgToServer,
2877 b"not in an iterable")
2878 self.assertRaises(TypeError, self.sendmsgToServer,
2879 object())
2880 self.assertRaises(TypeError, self.sendmsgToServer,
2881 [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], [], object())
2888 self.assertRaises(TypeError, self.sendmsgToServer,
2889 [MSG], [], 0, object())
2890 self.sendToServer(b"done")
2891
2892 def testSendmsgBadCmsg(self):
2893 # Check that invalid ancillary data items are rejected.
2894 self.assertEqual(self.serv_sock.recv(1000), b"done")
2895
2896 def _testSendmsgBadCmsg(self):
2897 self.assertRaises(TypeError, self.sendmsgToServer,
2898 [MSG], [object()])
2899 self.assertRaises(TypeError, self.sendmsgToServer,
2900 [MSG], [(object(), 0, b"data")])
2901 self.assertRaises(TypeError, self.sendmsgToServer,
2902 [MSG], [(0, object(), b"data")])
2903 self.assertRaises(TypeError, self.sendmsgToServer,
2904 [MSG], [(0, 0, object())])
2905 self.assertRaises(TypeError, self.sendmsgToServer,
2906 [MSG], [(0, 0)])
2907 self.assertRaises(TypeError, self.sendmsgToServer,
2908 [MSG], [(0, 0, b"data", 42)])
2909 self.sendToServer(b"done")
2910
2911 @requireAttrs(socket, "CMSG_SPACE")
2912 def testSendmsgBadMultiCmsg(self):
2913 # Check that invalid ancillary data items are rejected when
2914 # more than one item is present.
2915 self.assertEqual(self.serv_sock.recv(1000), b"done")
2916
2917 @testSendmsgBadMultiCmsg.client_skip
2918 def _testSendmsgBadMultiCmsg(self):
2919 self.assertRaises(TypeError, self.sendmsgToServer,
2920 [MSG], [0, 0, b""])
2921 self.assertRaises(TypeError, self.sendmsgToServer,
2922 [MSG], [(0, 0, b""), object()])
2923 self.sendToServer(b"done")
2924
2925 def testSendmsgExcessCmsgReject(self):
2926 # Check that sendmsg() rejects excess ancillary data items
2927 # when the number that can be sent is limited.
2928 self.assertEqual(self.serv_sock.recv(1000), b"done")
2929
2930 def _testSendmsgExcessCmsgReject(self):
2931 if not hasattr(socket, "CMSG_SPACE"):
2932 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002933 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002934 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2935 self.assertIsNone(cm.exception.errno)
2936 self.sendToServer(b"done")
2937
2938 def testSendmsgAfterClose(self):
2939 # Check that sendmsg() fails on a closed socket.
2940 pass
2941
2942 def _testSendmsgAfterClose(self):
2943 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002944 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002945
2946
2947class SendmsgStreamTests(SendmsgTests):
2948 # Tests for sendmsg() which require a stream socket and do not
2949 # involve recvmsg() or recvmsg_into().
2950
2951 def testSendmsgExplicitNoneAddr(self):
2952 # Check that peer address can be specified as None.
2953 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2954
2955 def _testSendmsgExplicitNoneAddr(self):
2956 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2957
2958 def testSendmsgTimeout(self):
2959 # Check that timeout works with sendmsg().
2960 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2961 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2962
2963 def _testSendmsgTimeout(self):
2964 try:
2965 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002966 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002967 while True:
2968 self.sendmsgToServer([b"a"*512])
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002969 except TimeoutError:
Victor Stinner46f40be2018-09-25 08:30:15 -07002970 pass
2971 except OSError as exc:
2972 if exc.errno != errno.ENOMEM:
2973 raise
2974 # bpo-33937 the test randomly fails on Travis CI with
2975 # "OSError: [Errno 12] Cannot allocate memory"
2976 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002977 self.fail("TimeoutError not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002978 finally:
2979 self.misc_event.set()
2980
2981 # XXX: would be nice to have more tests for sendmsg flags argument.
2982
2983 # Linux supports MSG_DONTWAIT when sending, but in general, it
2984 # only works when receiving. Could add other platforms if they
2985 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002986 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002987 "MSG_DONTWAIT not known to work on this platform when "
2988 "sending")
2989 def testSendmsgDontWait(self):
2990 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2991 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2992 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2993
2994 @testSendmsgDontWait.client_skip
2995 def _testSendmsgDontWait(self):
2996 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002997 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002998 while True:
2999 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07003000 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
3001 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003002 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07003003 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003004 finally:
3005 self.misc_event.set()
3006
3007
3008class SendmsgConnectionlessTests(SendmsgTests):
3009 # Tests for sendmsg() which require a connectionless-mode
3010 # (e.g. datagram) socket, and do not involve recvmsg() or
3011 # recvmsg_into().
3012
3013 def testSendmsgNoDestAddr(self):
3014 # Check that sendmsg() fails when no destination address is
3015 # given for unconnected socket.
3016 pass
3017
3018 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003019 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003020 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003021 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003022 [MSG], [], 0, None)
3023
3024
3025class RecvmsgGenericTests(SendrecvmsgBase):
3026 # Tests for recvmsg() which can also be emulated using
3027 # recvmsg_into(), and can use any socket type.
3028
3029 def testRecvmsg(self):
3030 # Receive a simple message with recvmsg[_into]().
3031 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3032 self.assertEqual(msg, MSG)
3033 self.checkRecvmsgAddress(addr, self.cli_addr)
3034 self.assertEqual(ancdata, [])
3035 self.checkFlags(flags, eor=True)
3036
3037 def _testRecvmsg(self):
3038 self.sendToServer(MSG)
3039
3040 def testRecvmsgExplicitDefaults(self):
3041 # Test recvmsg[_into]() with default arguments provided explicitly.
3042 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3043 len(MSG), 0, 0)
3044 self.assertEqual(msg, MSG)
3045 self.checkRecvmsgAddress(addr, self.cli_addr)
3046 self.assertEqual(ancdata, [])
3047 self.checkFlags(flags, eor=True)
3048
3049 def _testRecvmsgExplicitDefaults(self):
3050 self.sendToServer(MSG)
3051
3052 def testRecvmsgShorter(self):
3053 # Receive a message smaller than buffer.
3054 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3055 len(MSG) + 42)
3056 self.assertEqual(msg, MSG)
3057 self.checkRecvmsgAddress(addr, self.cli_addr)
3058 self.assertEqual(ancdata, [])
3059 self.checkFlags(flags, eor=True)
3060
3061 def _testRecvmsgShorter(self):
3062 self.sendToServer(MSG)
3063
3064 def testRecvmsgTrunc(self):
3065 # Receive part of message, check for truncation indicators.
3066 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3067 len(MSG) - 3)
3068 self.assertEqual(msg, MSG[:-3])
3069 self.checkRecvmsgAddress(addr, self.cli_addr)
3070 self.assertEqual(ancdata, [])
3071 self.checkFlags(flags, eor=False)
3072
3073 def _testRecvmsgTrunc(self):
3074 self.sendToServer(MSG)
3075
3076 def testRecvmsgShortAncillaryBuf(self):
3077 # Test ancillary data buffer too small to hold any ancillary data.
3078 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3079 len(MSG), 1)
3080 self.assertEqual(msg, MSG)
3081 self.checkRecvmsgAddress(addr, self.cli_addr)
3082 self.assertEqual(ancdata, [])
3083 self.checkFlags(flags, eor=True)
3084
3085 def _testRecvmsgShortAncillaryBuf(self):
3086 self.sendToServer(MSG)
3087
3088 def testRecvmsgLongAncillaryBuf(self):
3089 # Test large ancillary data buffer.
3090 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3091 len(MSG), 10240)
3092 self.assertEqual(msg, MSG)
3093 self.checkRecvmsgAddress(addr, self.cli_addr)
3094 self.assertEqual(ancdata, [])
3095 self.checkFlags(flags, eor=True)
3096
3097 def _testRecvmsgLongAncillaryBuf(self):
3098 self.sendToServer(MSG)
3099
3100 def testRecvmsgAfterClose(self):
3101 # Check that recvmsg[_into]() fails on a closed socket.
3102 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003103 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003104
3105 def _testRecvmsgAfterClose(self):
3106 pass
3107
3108 def testRecvmsgTimeout(self):
3109 # Check that timeout works.
3110 try:
3111 self.serv_sock.settimeout(0.03)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003112 self.assertRaises(TimeoutError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003113 self.doRecvmsg, self.serv_sock, len(MSG))
3114 finally:
3115 self.misc_event.set()
3116
3117 def _testRecvmsgTimeout(self):
3118 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3119
3120 @requireAttrs(socket, "MSG_PEEK")
3121 def testRecvmsgPeek(self):
3122 # Check that MSG_PEEK in flags enables examination of pending
3123 # data without consuming it.
3124
3125 # Receive part of data with MSG_PEEK.
3126 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3127 len(MSG) - 3, 0,
3128 socket.MSG_PEEK)
3129 self.assertEqual(msg, MSG[:-3])
3130 self.checkRecvmsgAddress(addr, self.cli_addr)
3131 self.assertEqual(ancdata, [])
3132 # Ignoring MSG_TRUNC here (so this test is the same for stream
3133 # and datagram sockets). Some wording in POSIX seems to
3134 # suggest that it needn't be set when peeking, but that may
3135 # just be a slip.
3136 self.checkFlags(flags, eor=False,
3137 ignore=getattr(socket, "MSG_TRUNC", 0))
3138
3139 # Receive all data with MSG_PEEK.
3140 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3141 len(MSG), 0,
3142 socket.MSG_PEEK)
3143 self.assertEqual(msg, MSG)
3144 self.checkRecvmsgAddress(addr, self.cli_addr)
3145 self.assertEqual(ancdata, [])
3146 self.checkFlags(flags, eor=True)
3147
3148 # Check that the same data can still be received normally.
3149 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3150 self.assertEqual(msg, MSG)
3151 self.checkRecvmsgAddress(addr, self.cli_addr)
3152 self.assertEqual(ancdata, [])
3153 self.checkFlags(flags, eor=True)
3154
3155 @testRecvmsgPeek.client_skip
3156 def _testRecvmsgPeek(self):
3157 self.sendToServer(MSG)
3158
3159 @requireAttrs(socket.socket, "sendmsg")
3160 def testRecvmsgFromSendmsg(self):
3161 # Test receiving with recvmsg[_into]() when message is sent
3162 # using sendmsg().
3163 self.serv_sock.settimeout(self.fail_timeout)
3164 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3165 self.assertEqual(msg, MSG)
3166 self.checkRecvmsgAddress(addr, self.cli_addr)
3167 self.assertEqual(ancdata, [])
3168 self.checkFlags(flags, eor=True)
3169
3170 @testRecvmsgFromSendmsg.client_skip
3171 def _testRecvmsgFromSendmsg(self):
3172 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3173
3174
3175class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3176 # Tests which require a stream socket and can use either recvmsg()
3177 # or recvmsg_into().
3178
3179 def testRecvmsgEOF(self):
3180 # Receive end-of-stream indicator (b"", peer socket closed).
3181 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3182 self.assertEqual(msg, b"")
3183 self.checkRecvmsgAddress(addr, self.cli_addr)
3184 self.assertEqual(ancdata, [])
3185 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3186
3187 def _testRecvmsgEOF(self):
3188 self.cli_sock.close()
3189
3190 def testRecvmsgOverflow(self):
3191 # Receive a message in more than one chunk.
3192 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3193 len(MSG) - 3)
3194 self.checkRecvmsgAddress(addr, self.cli_addr)
3195 self.assertEqual(ancdata, [])
3196 self.checkFlags(flags, eor=False)
3197
3198 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3199 self.checkRecvmsgAddress(addr, self.cli_addr)
3200 self.assertEqual(ancdata, [])
3201 self.checkFlags(flags, eor=True)
3202
3203 msg = seg1 + seg2
3204 self.assertEqual(msg, MSG)
3205
3206 def _testRecvmsgOverflow(self):
3207 self.sendToServer(MSG)
3208
3209
3210class RecvmsgTests(RecvmsgGenericTests):
3211 # Tests for recvmsg() which can use any socket type.
3212
3213 def testRecvmsgBadArgs(self):
3214 # Check that recvmsg() rejects invalid arguments.
3215 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3216 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3217 -1, 0, 0)
3218 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3219 len(MSG), -1, 0)
3220 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3221 [bytearray(10)], 0, 0)
3222 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3223 object(), 0, 0)
3224 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3225 len(MSG), object(), 0)
3226 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3227 len(MSG), 0, object())
3228
3229 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3230 self.assertEqual(msg, MSG)
3231 self.checkRecvmsgAddress(addr, self.cli_addr)
3232 self.assertEqual(ancdata, [])
3233 self.checkFlags(flags, eor=True)
3234
3235 def _testRecvmsgBadArgs(self):
3236 self.sendToServer(MSG)
3237
3238
3239class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3240 # Tests for recvmsg_into() which can use any socket type.
3241
3242 def testRecvmsgIntoBadArgs(self):
3243 # Check that recvmsg_into() rejects invalid arguments.
3244 buf = bytearray(len(MSG))
3245 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3246 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3247 len(MSG), 0, 0)
3248 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3249 buf, 0, 0)
3250 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3251 [object()], 0, 0)
3252 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3253 [b"I'm not writable"], 0, 0)
3254 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3255 [buf, object()], 0, 0)
3256 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3257 [buf], -1, 0)
3258 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3259 [buf], object(), 0)
3260 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3261 [buf], 0, object())
3262
3263 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3264 self.assertEqual(nbytes, len(MSG))
3265 self.assertEqual(buf, bytearray(MSG))
3266 self.checkRecvmsgAddress(addr, self.cli_addr)
3267 self.assertEqual(ancdata, [])
3268 self.checkFlags(flags, eor=True)
3269
3270 def _testRecvmsgIntoBadArgs(self):
3271 self.sendToServer(MSG)
3272
3273 def testRecvmsgIntoGenerator(self):
3274 # Receive into buffer obtained from a generator (not a sequence).
3275 buf = bytearray(len(MSG))
3276 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3277 (o for o in [buf]))
3278 self.assertEqual(nbytes, len(MSG))
3279 self.assertEqual(buf, bytearray(MSG))
3280 self.checkRecvmsgAddress(addr, self.cli_addr)
3281 self.assertEqual(ancdata, [])
3282 self.checkFlags(flags, eor=True)
3283
3284 def _testRecvmsgIntoGenerator(self):
3285 self.sendToServer(MSG)
3286
3287 def testRecvmsgIntoArray(self):
3288 # Receive into an array rather than the usual bytearray.
3289 buf = array.array("B", [0] * len(MSG))
3290 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3291 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003292 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003293 self.checkRecvmsgAddress(addr, self.cli_addr)
3294 self.assertEqual(ancdata, [])
3295 self.checkFlags(flags, eor=True)
3296
3297 def _testRecvmsgIntoArray(self):
3298 self.sendToServer(MSG)
3299
3300 def testRecvmsgIntoScatter(self):
3301 # Receive into multiple buffers (scatter write).
3302 b1 = bytearray(b"----")
3303 b2 = bytearray(b"0123456789")
3304 b3 = bytearray(b"--------------")
3305 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3306 [b1, memoryview(b2)[2:9], b3])
3307 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3308 self.assertEqual(b1, bytearray(b"Mary"))
3309 self.assertEqual(b2, bytearray(b"01 had a 9"))
3310 self.assertEqual(b3, bytearray(b"little lamb---"))
3311 self.checkRecvmsgAddress(addr, self.cli_addr)
3312 self.assertEqual(ancdata, [])
3313 self.checkFlags(flags, eor=True)
3314
3315 def _testRecvmsgIntoScatter(self):
3316 self.sendToServer(b"Mary had a little lamb")
3317
3318
3319class CmsgMacroTests(unittest.TestCase):
3320 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3321 # assumptions used by sendmsg() and recvmsg[_into](), which share
3322 # code with these functions.
3323
3324 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003325 try:
3326 import _testcapi
3327 except ImportError:
3328 socklen_t_limit = 0x7fffffff
3329 else:
3330 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003331
3332 @requireAttrs(socket, "CMSG_LEN")
3333 def testCMSG_LEN(self):
3334 # Test CMSG_LEN() with various valid and invalid values,
3335 # checking the assumptions used by recvmsg() and sendmsg().
3336 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3337 values = list(range(257)) + list(range(toobig - 257, toobig))
3338
3339 # struct cmsghdr has at least three members, two of which are ints
3340 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3341 for n in values:
3342 ret = socket.CMSG_LEN(n)
3343 # This is how recvmsg() calculates the data size
3344 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3345 self.assertLessEqual(ret, self.socklen_t_limit)
3346
3347 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3348 # sendmsg() shares code with these functions, and requires
3349 # that it reject values over the limit.
3350 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3351 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3352
3353 @requireAttrs(socket, "CMSG_SPACE")
3354 def testCMSG_SPACE(self):
3355 # Test CMSG_SPACE() with various valid and invalid values,
3356 # checking the assumptions used by sendmsg().
3357 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3358 values = list(range(257)) + list(range(toobig - 257, toobig))
3359
3360 last = socket.CMSG_SPACE(0)
3361 # struct cmsghdr has at least three members, two of which are ints
3362 self.assertGreater(last, array.array("i").itemsize * 2)
3363 for n in values:
3364 ret = socket.CMSG_SPACE(n)
3365 self.assertGreaterEqual(ret, last)
3366 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3367 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3368 self.assertLessEqual(ret, self.socklen_t_limit)
3369 last = ret
3370
3371 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3372 # sendmsg() shares code with these functions, and requires
3373 # that it reject values over the limit.
3374 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3375 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3376
3377
3378class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3379 # Tests for file descriptor passing on Unix-domain sockets.
3380
3381 # Invalid file descriptor value that's unlikely to evaluate to a
3382 # real FD even if one of its bytes is replaced with a different
3383 # value (which shouldn't actually happen).
3384 badfd = -0x5555
3385
3386 def newFDs(self, n):
3387 # Return a list of n file descriptors for newly-created files
3388 # containing their list indices as ASCII numbers.
3389 fds = []
3390 for i in range(n):
3391 fd, path = tempfile.mkstemp()
3392 self.addCleanup(os.unlink, path)
3393 self.addCleanup(os.close, fd)
3394 os.write(fd, str(i).encode())
3395 fds.append(fd)
3396 return fds
3397
3398 def checkFDs(self, fds):
3399 # Check that the file descriptors in the given list contain
3400 # their correct list indices as ASCII numbers.
3401 for n, fd in enumerate(fds):
3402 os.lseek(fd, 0, os.SEEK_SET)
3403 self.assertEqual(os.read(fd, 1024), str(n).encode())
3404
3405 def registerRecvmsgResult(self, result):
3406 self.addCleanup(self.closeRecvmsgFDs, result)
3407
3408 def closeRecvmsgFDs(self, recvmsg_result):
3409 # Close all file descriptors specified in the ancillary data
3410 # of the given return value from recvmsg() or recvmsg_into().
3411 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3412 if (cmsg_level == socket.SOL_SOCKET and
3413 cmsg_type == socket.SCM_RIGHTS):
3414 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003415 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003416 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3417 for fd in fds:
3418 os.close(fd)
3419
3420 def createAndSendFDs(self, n):
3421 # Send n new file descriptors created by newFDs() to the
3422 # server, with the constant MSG as the non-ancillary data.
3423 self.assertEqual(
3424 self.sendmsgToServer([MSG],
3425 [(socket.SOL_SOCKET,
3426 socket.SCM_RIGHTS,
3427 array.array("i", self.newFDs(n)))]),
3428 len(MSG))
3429
3430 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3431 # Check that constant MSG was received with numfds file
3432 # descriptors in a maximum of maxcmsgs control messages (which
3433 # must contain only complete integers). By default, check
3434 # that MSG_CTRUNC is unset, but ignore any flags in
3435 # ignoreflags.
3436 msg, ancdata, flags, addr = result
3437 self.assertEqual(msg, MSG)
3438 self.checkRecvmsgAddress(addr, self.cli_addr)
3439 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3440 ignore=ignoreflags)
3441
3442 self.assertIsInstance(ancdata, list)
3443 self.assertLessEqual(len(ancdata), maxcmsgs)
3444 fds = array.array("i")
3445 for item in ancdata:
3446 self.assertIsInstance(item, tuple)
3447 cmsg_level, cmsg_type, cmsg_data = item
3448 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3449 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3450 self.assertIsInstance(cmsg_data, bytes)
3451 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003452 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003453
3454 self.assertEqual(len(fds), numfds)
3455 self.checkFDs(fds)
3456
3457 def testFDPassSimple(self):
3458 # Pass a single FD (array read from bytes object).
3459 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3460 len(MSG), 10240))
3461
3462 def _testFDPassSimple(self):
3463 self.assertEqual(
3464 self.sendmsgToServer(
3465 [MSG],
3466 [(socket.SOL_SOCKET,
3467 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003468 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003469 len(MSG))
3470
3471 def testMultipleFDPass(self):
3472 # Pass multiple FDs in a single array.
3473 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3474 len(MSG), 10240))
3475
3476 def _testMultipleFDPass(self):
3477 self.createAndSendFDs(4)
3478
3479 @requireAttrs(socket, "CMSG_SPACE")
3480 def testFDPassCMSG_SPACE(self):
3481 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3482 self.checkRecvmsgFDs(
3483 4, self.doRecvmsg(self.serv_sock, len(MSG),
3484 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3485
3486 @testFDPassCMSG_SPACE.client_skip
3487 def _testFDPassCMSG_SPACE(self):
3488 self.createAndSendFDs(4)
3489
3490 def testFDPassCMSG_LEN(self):
3491 # Test using CMSG_LEN() to calculate ancillary buffer size.
3492 self.checkRecvmsgFDs(1,
3493 self.doRecvmsg(self.serv_sock, len(MSG),
3494 socket.CMSG_LEN(4 * SIZEOF_INT)),
3495 # RFC 3542 says implementations may set
3496 # MSG_CTRUNC if there isn't enough space
3497 # for trailing padding.
3498 ignoreflags=socket.MSG_CTRUNC)
3499
3500 def _testFDPassCMSG_LEN(self):
3501 self.createAndSendFDs(1)
3502
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003503 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003504 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505 @requireAttrs(socket, "CMSG_SPACE")
3506 def testFDPassSeparate(self):
3507 # Pass two FDs in two separate arrays. Arrays may be combined
3508 # into a single control message by the OS.
3509 self.checkRecvmsgFDs(2,
3510 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3511 maxcmsgs=2)
3512
3513 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003514 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003515 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003516 def _testFDPassSeparate(self):
3517 fd0, fd1 = self.newFDs(2)
3518 self.assertEqual(
3519 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3520 socket.SCM_RIGHTS,
3521 array.array("i", [fd0])),
3522 (socket.SOL_SOCKET,
3523 socket.SCM_RIGHTS,
3524 array.array("i", [fd1]))]),
3525 len(MSG))
3526
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003527 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003528 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003529 @requireAttrs(socket, "CMSG_SPACE")
3530 def testFDPassSeparateMinSpace(self):
3531 # Pass two FDs in two separate arrays, receiving them into the
3532 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003533 num_fds = 2
3534 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003535 self.doRecvmsg(self.serv_sock, len(MSG),
3536 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003537 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003538 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3539
3540 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003541 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003542 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003543 def _testFDPassSeparateMinSpace(self):
3544 fd0, fd1 = self.newFDs(2)
3545 self.assertEqual(
3546 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3547 socket.SCM_RIGHTS,
3548 array.array("i", [fd0])),
3549 (socket.SOL_SOCKET,
3550 socket.SCM_RIGHTS,
3551 array.array("i", [fd1]))]),
3552 len(MSG))
3553
3554 def sendAncillaryIfPossible(self, msg, ancdata):
3555 # Try to send msg and ancdata to server, but if the system
3556 # call fails, just send msg with no ancillary data.
3557 try:
3558 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003559 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003560 # Check that it was the system call that failed
3561 self.assertIsInstance(e.errno, int)
3562 nbytes = self.sendmsgToServer([msg])
3563 self.assertEqual(nbytes, len(msg))
3564
Brett Cannon3bbad122015-12-28 17:21:44 -08003565 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003566 def testFDPassEmpty(self):
3567 # Try to pass an empty FD array. Can receive either no array
3568 # or an empty array.
3569 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3570 len(MSG), 10240),
3571 ignoreflags=socket.MSG_CTRUNC)
3572
3573 def _testFDPassEmpty(self):
3574 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3575 socket.SCM_RIGHTS,
3576 b"")])
3577
3578 def testFDPassPartialInt(self):
3579 # Try to pass a truncated FD array.
3580 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3581 len(MSG), 10240)
3582 self.assertEqual(msg, MSG)
3583 self.checkRecvmsgAddress(addr, self.cli_addr)
3584 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3585 self.assertLessEqual(len(ancdata), 1)
3586 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3587 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3588 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3589 self.assertLess(len(cmsg_data), SIZEOF_INT)
3590
3591 def _testFDPassPartialInt(self):
3592 self.sendAncillaryIfPossible(
3593 MSG,
3594 [(socket.SOL_SOCKET,
3595 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003596 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003597
3598 @requireAttrs(socket, "CMSG_SPACE")
3599 def testFDPassPartialIntInMiddle(self):
3600 # Try to pass two FD arrays, the first of which is truncated.
3601 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3602 len(MSG), 10240)
3603 self.assertEqual(msg, MSG)
3604 self.checkRecvmsgAddress(addr, self.cli_addr)
3605 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3606 self.assertLessEqual(len(ancdata), 2)
3607 fds = array.array("i")
3608 # Arrays may have been combined in a single control message
3609 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3610 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3611 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003612 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003613 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3614 self.assertLessEqual(len(fds), 2)
3615 self.checkFDs(fds)
3616
3617 @testFDPassPartialIntInMiddle.client_skip
3618 def _testFDPassPartialIntInMiddle(self):
3619 fd0, fd1 = self.newFDs(2)
3620 self.sendAncillaryIfPossible(
3621 MSG,
3622 [(socket.SOL_SOCKET,
3623 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003624 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003625 (socket.SOL_SOCKET,
3626 socket.SCM_RIGHTS,
3627 array.array("i", [fd1]))])
3628
3629 def checkTruncatedHeader(self, result, ignoreflags=0):
3630 # Check that no ancillary data items are returned when data is
3631 # truncated inside the cmsghdr structure.
3632 msg, ancdata, flags, addr = result
3633 self.assertEqual(msg, MSG)
3634 self.checkRecvmsgAddress(addr, self.cli_addr)
3635 self.assertEqual(ancdata, [])
3636 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3637 ignore=ignoreflags)
3638
3639 def testCmsgTruncNoBufSize(self):
3640 # Check that no ancillary data is received when no buffer size
3641 # is specified.
3642 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3643 # BSD seems to set MSG_CTRUNC only
3644 # if an item has been partially
3645 # received.
3646 ignoreflags=socket.MSG_CTRUNC)
3647
3648 def _testCmsgTruncNoBufSize(self):
3649 self.createAndSendFDs(1)
3650
3651 def testCmsgTrunc0(self):
3652 # Check that no ancillary data is received when buffer size is 0.
3653 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3654 ignoreflags=socket.MSG_CTRUNC)
3655
3656 def _testCmsgTrunc0(self):
3657 self.createAndSendFDs(1)
3658
3659 # Check that no ancillary data is returned for various non-zero
3660 # (but still too small) buffer sizes.
3661
3662 def testCmsgTrunc1(self):
3663 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3664
3665 def _testCmsgTrunc1(self):
3666 self.createAndSendFDs(1)
3667
3668 def testCmsgTrunc2Int(self):
3669 # The cmsghdr structure has at least three members, two of
3670 # which are ints, so we still shouldn't see any ancillary
3671 # data.
3672 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3673 SIZEOF_INT * 2))
3674
3675 def _testCmsgTrunc2Int(self):
3676 self.createAndSendFDs(1)
3677
3678 def testCmsgTruncLen0Minus1(self):
3679 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3680 socket.CMSG_LEN(0) - 1))
3681
3682 def _testCmsgTruncLen0Minus1(self):
3683 self.createAndSendFDs(1)
3684
3685 # The following tests try to truncate the control message in the
3686 # middle of the FD array.
3687
3688 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3689 # Check that file descriptor data is truncated to between
3690 # mindata and maxdata bytes when received with buffer size
3691 # ancbuf, and that any complete file descriptor numbers are
3692 # valid.
3693 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3694 len(MSG), ancbuf)
3695 self.assertEqual(msg, MSG)
3696 self.checkRecvmsgAddress(addr, self.cli_addr)
3697 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3698
3699 if mindata == 0 and ancdata == []:
3700 return
3701 self.assertEqual(len(ancdata), 1)
3702 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3703 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3704 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3705 self.assertGreaterEqual(len(cmsg_data), mindata)
3706 self.assertLessEqual(len(cmsg_data), maxdata)
3707 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003708 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003709 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3710 self.checkFDs(fds)
3711
3712 def testCmsgTruncLen0(self):
3713 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3714
3715 def _testCmsgTruncLen0(self):
3716 self.createAndSendFDs(1)
3717
3718 def testCmsgTruncLen0Plus1(self):
3719 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3720
3721 def _testCmsgTruncLen0Plus1(self):
3722 self.createAndSendFDs(2)
3723
3724 def testCmsgTruncLen1(self):
3725 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3726 maxdata=SIZEOF_INT)
3727
3728 def _testCmsgTruncLen1(self):
3729 self.createAndSendFDs(2)
3730
3731 def testCmsgTruncLen2Minus1(self):
3732 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3733 maxdata=(2 * SIZEOF_INT) - 1)
3734
3735 def _testCmsgTruncLen2Minus1(self):
3736 self.createAndSendFDs(2)
3737
3738
3739class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3740 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3741 # features of the RFC 3542 Advanced Sockets API for IPv6.
3742 # Currently we can only handle certain data items (e.g. traffic
3743 # class, hop limit, MTU discovery and fragmentation settings)
3744 # without resorting to unportable means such as the struct module,
3745 # but the tests here are aimed at testing the ancillary data
3746 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3747 # itself.
3748
3749 # Test value to use when setting hop limit of packet
3750 hop_limit = 2
3751
3752 # Test value to use when setting traffic class of packet.
3753 # -1 means "use kernel default".
3754 traffic_class = -1
3755
3756 def ancillaryMapping(self, ancdata):
3757 # Given ancillary data list ancdata, return a mapping from
3758 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3759 # Check that no (level, type) pair appears more than once.
3760 d = {}
3761 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3762 self.assertNotIn((cmsg_level, cmsg_type), d)
3763 d[(cmsg_level, cmsg_type)] = cmsg_data
3764 return d
3765
3766 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3767 # Receive hop limit into ancbufsize bytes of ancillary data
3768 # space. Check that data is MSG, ancillary data is not
3769 # truncated (but ignore any flags in ignoreflags), and hop
3770 # limit is between 0 and maxhop inclusive.
3771 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3772 socket.IPV6_RECVHOPLIMIT, 1)
3773 self.misc_event.set()
3774 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3775 len(MSG), ancbufsize)
3776
3777 self.assertEqual(msg, MSG)
3778 self.checkRecvmsgAddress(addr, self.cli_addr)
3779 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3780 ignore=ignoreflags)
3781
3782 self.assertEqual(len(ancdata), 1)
3783 self.assertIsInstance(ancdata[0], tuple)
3784 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3785 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3786 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3787 self.assertIsInstance(cmsg_data, bytes)
3788 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3789 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003790 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003791 self.assertGreaterEqual(a[0], 0)
3792 self.assertLessEqual(a[0], maxhop)
3793
3794 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3795 def testRecvHopLimit(self):
3796 # Test receiving the packet hop limit as ancillary data.
3797 self.checkHopLimit(ancbufsize=10240)
3798
3799 @testRecvHopLimit.client_skip
3800 def _testRecvHopLimit(self):
3801 # Need to wait until server has asked to receive ancillary
3802 # data, as implementations are not required to buffer it
3803 # otherwise.
3804 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3805 self.sendToServer(MSG)
3806
3807 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3808 def testRecvHopLimitCMSG_SPACE(self):
3809 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3810 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3811
3812 @testRecvHopLimitCMSG_SPACE.client_skip
3813 def _testRecvHopLimitCMSG_SPACE(self):
3814 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3815 self.sendToServer(MSG)
3816
3817 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3818 # 3542 says portable applications must provide space for trailing
3819 # padding. Implementations may set MSG_CTRUNC if there isn't
3820 # enough space for the padding.
3821
3822 @requireAttrs(socket.socket, "sendmsg")
3823 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3824 def testSetHopLimit(self):
3825 # Test setting hop limit on outgoing packet and receiving it
3826 # at the other end.
3827 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3828
3829 @testSetHopLimit.client_skip
3830 def _testSetHopLimit(self):
3831 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3832 self.assertEqual(
3833 self.sendmsgToServer([MSG],
3834 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3835 array.array("i", [self.hop_limit]))]),
3836 len(MSG))
3837
3838 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3839 ignoreflags=0):
3840 # Receive traffic class and hop limit into ancbufsize bytes of
3841 # ancillary data space. Check that data is MSG, ancillary
3842 # data is not truncated (but ignore any flags in ignoreflags),
3843 # and traffic class and hop limit are in range (hop limit no
3844 # more than maxhop).
3845 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3846 socket.IPV6_RECVHOPLIMIT, 1)
3847 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3848 socket.IPV6_RECVTCLASS, 1)
3849 self.misc_event.set()
3850 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3851 len(MSG), ancbufsize)
3852
3853 self.assertEqual(msg, MSG)
3854 self.checkRecvmsgAddress(addr, self.cli_addr)
3855 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3856 ignore=ignoreflags)
3857 self.assertEqual(len(ancdata), 2)
3858 ancmap = self.ancillaryMapping(ancdata)
3859
3860 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3861 self.assertEqual(len(tcdata), SIZEOF_INT)
3862 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003863 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864 self.assertGreaterEqual(a[0], 0)
3865 self.assertLessEqual(a[0], 255)
3866
3867 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3868 self.assertEqual(len(hldata), SIZEOF_INT)
3869 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003870 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003871 self.assertGreaterEqual(a[0], 0)
3872 self.assertLessEqual(a[0], maxhop)
3873
3874 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3875 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3876 def testRecvTrafficClassAndHopLimit(self):
3877 # Test receiving traffic class and hop limit as ancillary data.
3878 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3879
3880 @testRecvTrafficClassAndHopLimit.client_skip
3881 def _testRecvTrafficClassAndHopLimit(self):
3882 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3883 self.sendToServer(MSG)
3884
3885 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3886 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3887 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3888 # Test receiving traffic class and hop limit, using
3889 # CMSG_SPACE() to calculate buffer size.
3890 self.checkTrafficClassAndHopLimit(
3891 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3892
3893 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3894 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3895 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3896 self.sendToServer(MSG)
3897
3898 @requireAttrs(socket.socket, "sendmsg")
3899 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3900 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3901 def testSetTrafficClassAndHopLimit(self):
3902 # Test setting traffic class and hop limit on outgoing packet,
3903 # and receiving them at the other end.
3904 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3905 maxhop=self.hop_limit)
3906
3907 @testSetTrafficClassAndHopLimit.client_skip
3908 def _testSetTrafficClassAndHopLimit(self):
3909 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3910 self.assertEqual(
3911 self.sendmsgToServer([MSG],
3912 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3913 array.array("i", [self.traffic_class])),
3914 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3915 array.array("i", [self.hop_limit]))]),
3916 len(MSG))
3917
3918 @requireAttrs(socket.socket, "sendmsg")
3919 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3920 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3921 def testOddCmsgSize(self):
3922 # Try to send ancillary data with first item one byte too
3923 # long. Fall back to sending with correct size if this fails,
3924 # and check that second item was handled correctly.
3925 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3926 maxhop=self.hop_limit)
3927
3928 @testOddCmsgSize.client_skip
3929 def _testOddCmsgSize(self):
3930 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3931 try:
3932 nbytes = self.sendmsgToServer(
3933 [MSG],
3934 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003935 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003936 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3937 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003938 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003939 self.assertIsInstance(e.errno, int)
3940 nbytes = self.sendmsgToServer(
3941 [MSG],
3942 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3943 array.array("i", [self.traffic_class])),
3944 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3945 array.array("i", [self.hop_limit]))])
3946 self.assertEqual(nbytes, len(MSG))
3947
3948 # Tests for proper handling of truncated ancillary data
3949
3950 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3951 # Receive hop limit into ancbufsize bytes of ancillary data
3952 # space, which should be too small to contain the ancillary
3953 # data header (if ancbufsize is None, pass no second argument
3954 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3955 # (unless included in ignoreflags), and no ancillary data is
3956 # returned.
3957 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3958 socket.IPV6_RECVHOPLIMIT, 1)
3959 self.misc_event.set()
3960 args = () if ancbufsize is None else (ancbufsize,)
3961 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3962 len(MSG), *args)
3963
3964 self.assertEqual(msg, MSG)
3965 self.checkRecvmsgAddress(addr, self.cli_addr)
3966 self.assertEqual(ancdata, [])
3967 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3968 ignore=ignoreflags)
3969
3970 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3971 def testCmsgTruncNoBufSize(self):
3972 # Check that no ancillary data is received when no ancillary
3973 # buffer size is provided.
3974 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3975 # BSD seems to set
3976 # MSG_CTRUNC only if an item
3977 # has been partially
3978 # received.
3979 ignoreflags=socket.MSG_CTRUNC)
3980
3981 @testCmsgTruncNoBufSize.client_skip
3982 def _testCmsgTruncNoBufSize(self):
3983 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3984 self.sendToServer(MSG)
3985
3986 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3987 def testSingleCmsgTrunc0(self):
3988 # Check that no ancillary data is received when ancillary
3989 # buffer size is zero.
3990 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3991 ignoreflags=socket.MSG_CTRUNC)
3992
3993 @testSingleCmsgTrunc0.client_skip
3994 def _testSingleCmsgTrunc0(self):
3995 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3996 self.sendToServer(MSG)
3997
3998 # Check that no ancillary data is returned for various non-zero
3999 # (but still too small) buffer sizes.
4000
4001 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4002 def testSingleCmsgTrunc1(self):
4003 self.checkHopLimitTruncatedHeader(ancbufsize=1)
4004
4005 @testSingleCmsgTrunc1.client_skip
4006 def _testSingleCmsgTrunc1(self):
4007 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4008 self.sendToServer(MSG)
4009
4010 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4011 def testSingleCmsgTrunc2Int(self):
4012 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
4013
4014 @testSingleCmsgTrunc2Int.client_skip
4015 def _testSingleCmsgTrunc2Int(self):
4016 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4017 self.sendToServer(MSG)
4018
4019 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4020 def testSingleCmsgTruncLen0Minus1(self):
4021 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
4022
4023 @testSingleCmsgTruncLen0Minus1.client_skip
4024 def _testSingleCmsgTruncLen0Minus1(self):
4025 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4026 self.sendToServer(MSG)
4027
4028 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4029 def testSingleCmsgTruncInData(self):
4030 # Test truncation of a control message inside its associated
4031 # data. The message may be returned with its data truncated,
4032 # or not returned at all.
4033 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4034 socket.IPV6_RECVHOPLIMIT, 1)
4035 self.misc_event.set()
4036 msg, ancdata, flags, addr = self.doRecvmsg(
4037 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4038
4039 self.assertEqual(msg, MSG)
4040 self.checkRecvmsgAddress(addr, self.cli_addr)
4041 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4042
4043 self.assertLessEqual(len(ancdata), 1)
4044 if ancdata:
4045 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4046 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4047 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4048 self.assertLess(len(cmsg_data), SIZEOF_INT)
4049
4050 @testSingleCmsgTruncInData.client_skip
4051 def _testSingleCmsgTruncInData(self):
4052 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4053 self.sendToServer(MSG)
4054
4055 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4056 # Receive traffic class and hop limit into ancbufsize bytes of
4057 # ancillary data space, which should be large enough to
4058 # contain the first item, but too small to contain the header
4059 # of the second. Check that data is MSG, MSG_CTRUNC is set
4060 # (unless included in ignoreflags), and only one ancillary
4061 # data item is returned.
4062 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4063 socket.IPV6_RECVHOPLIMIT, 1)
4064 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4065 socket.IPV6_RECVTCLASS, 1)
4066 self.misc_event.set()
4067 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4068 len(MSG), ancbufsize)
4069
4070 self.assertEqual(msg, MSG)
4071 self.checkRecvmsgAddress(addr, self.cli_addr)
4072 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4073 ignore=ignoreflags)
4074
4075 self.assertEqual(len(ancdata), 1)
4076 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4077 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4078 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4079 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4080 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004081 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004082 self.assertGreaterEqual(a[0], 0)
4083 self.assertLessEqual(a[0], 255)
4084
4085 # Try the above test with various buffer sizes.
4086
4087 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4088 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4089 def testSecondCmsgTrunc0(self):
4090 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4091 ignoreflags=socket.MSG_CTRUNC)
4092
4093 @testSecondCmsgTrunc0.client_skip
4094 def _testSecondCmsgTrunc0(self):
4095 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4096 self.sendToServer(MSG)
4097
4098 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4099 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4100 def testSecondCmsgTrunc1(self):
4101 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4102
4103 @testSecondCmsgTrunc1.client_skip
4104 def _testSecondCmsgTrunc1(self):
4105 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4106 self.sendToServer(MSG)
4107
4108 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4109 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4110 def testSecondCmsgTrunc2Int(self):
4111 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4112 2 * SIZEOF_INT)
4113
4114 @testSecondCmsgTrunc2Int.client_skip
4115 def _testSecondCmsgTrunc2Int(self):
4116 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4117 self.sendToServer(MSG)
4118
4119 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4120 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4121 def testSecondCmsgTruncLen0Minus1(self):
4122 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4123 socket.CMSG_LEN(0) - 1)
4124
4125 @testSecondCmsgTruncLen0Minus1.client_skip
4126 def _testSecondCmsgTruncLen0Minus1(self):
4127 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4128 self.sendToServer(MSG)
4129
4130 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4131 "IPV6_RECVTCLASS", "IPV6_TCLASS")
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304132 def testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004133 # Test truncation of the second of two control messages inside
4134 # its associated data.
4135 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4136 socket.IPV6_RECVHOPLIMIT, 1)
4137 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4138 socket.IPV6_RECVTCLASS, 1)
4139 self.misc_event.set()
4140 msg, ancdata, flags, addr = self.doRecvmsg(
4141 self.serv_sock, len(MSG),
4142 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4143
4144 self.assertEqual(msg, MSG)
4145 self.checkRecvmsgAddress(addr, self.cli_addr)
4146 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4147
4148 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4149
4150 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4151 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4152 cmsg_types.remove(cmsg_type)
4153 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4154 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004155 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004156 self.assertGreaterEqual(a[0], 0)
4157 self.assertLessEqual(a[0], 255)
4158
4159 if ancdata:
4160 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4161 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4162 cmsg_types.remove(cmsg_type)
4163 self.assertLess(len(cmsg_data), SIZEOF_INT)
4164
4165 self.assertEqual(ancdata, [])
4166
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304167 @testSecondCmsgTruncInData.client_skip
4168 def _testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004169 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4170 self.sendToServer(MSG)
4171
4172
4173# Derive concrete test classes for different socket types.
4174
4175class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4176 SendrecvmsgConnectionlessBase,
4177 ThreadedSocketTestMixin, UDPTestBase):
4178 pass
4179
4180@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004181class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4182 pass
4183
4184@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004185class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4186 pass
4187
4188@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004189class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4190 pass
4191
4192
4193class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4194 SendrecvmsgConnectionlessBase,
4195 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004196
4197 def checkRecvmsgAddress(self, addr1, addr2):
4198 # Called to compare the received address with the address of
4199 # the peer, ignoring scope ID
4200 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004201
4202@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004203@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004204@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004205class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4206 pass
4207
4208@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004209@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004210@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004211class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4212 pass
4213
4214@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004215@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004216@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004217class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4218 pass
4219
4220@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004221@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004222@requireAttrs(socket, "IPPROTO_IPV6")
4223@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004224class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4225 SendrecvmsgUDP6TestBase):
4226 pass
4227
4228@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004229@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004230@requireAttrs(socket, "IPPROTO_IPV6")
4231@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004232class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4233 RFC3542AncillaryTest,
4234 SendrecvmsgUDP6TestBase):
4235 pass
4236
4237
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004238@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4239 'UDPLITE sockets required for this test.')
4240class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4241 SendrecvmsgConnectionlessBase,
4242 ThreadedSocketTestMixin, UDPLITETestBase):
4243 pass
4244
4245@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4246 'UDPLITE sockets required for this test.')
4247@requireAttrs(socket.socket, "sendmsg")
4248class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4249 pass
4250
4251@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4252 'UDPLITE sockets required for this test.')
4253@requireAttrs(socket.socket, "recvmsg")
4254class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4255 pass
4256
4257@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4258 'UDPLITE sockets required for this test.')
4259@requireAttrs(socket.socket, "recvmsg_into")
4260class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4261 pass
4262
4263
4264@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4265 'UDPLITE sockets required for this test.')
4266class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4267 SendrecvmsgConnectionlessBase,
4268 ThreadedSocketTestMixin, UDPLITE6TestBase):
4269
4270 def checkRecvmsgAddress(self, addr1, addr2):
4271 # Called to compare the received address with the address of
4272 # the peer, ignoring scope ID
4273 self.assertEqual(addr1[:-1], addr2[:-1])
4274
4275@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004276@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004277@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4278 'UDPLITE sockets required for this test.')
4279@requireSocket("AF_INET6", "SOCK_DGRAM")
4280class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4281 pass
4282
4283@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004284@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004285@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4286 'UDPLITE sockets required for this test.')
4287@requireSocket("AF_INET6", "SOCK_DGRAM")
4288class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4289 pass
4290
4291@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004292@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004293@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4294 'UDPLITE sockets required for this test.')
4295@requireSocket("AF_INET6", "SOCK_DGRAM")
4296class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4297 pass
4298
4299@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004300@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004301@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4302 'UDPLITE sockets required for this test.')
4303@requireAttrs(socket, "IPPROTO_IPV6")
4304@requireSocket("AF_INET6", "SOCK_DGRAM")
4305class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4306 SendrecvmsgUDPLITE6TestBase):
4307 pass
4308
4309@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004310@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004311@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4312 'UDPLITE sockets required for this test.')
4313@requireAttrs(socket, "IPPROTO_IPV6")
4314@requireSocket("AF_INET6", "SOCK_DGRAM")
4315class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4316 RFC3542AncillaryTest,
4317 SendrecvmsgUDPLITE6TestBase):
4318 pass
4319
4320
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4322 ConnectedStreamTestMixin, TCPTestBase):
4323 pass
4324
4325@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004326class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4327 pass
4328
4329@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004330class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4331 SendrecvmsgTCPTestBase):
4332 pass
4333
4334@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004335class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4336 SendrecvmsgTCPTestBase):
4337 pass
4338
4339
4340class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4341 SendrecvmsgConnectedBase,
4342 ConnectedStreamTestMixin, SCTPStreamBase):
4343 pass
4344
4345@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004346@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004347@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004348class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4349 pass
4350
4351@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004352@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004353@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004354class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4355 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004356
4357 def testRecvmsgEOF(self):
4358 try:
4359 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4360 except OSError as e:
4361 if e.errno != errno.ENOTCONN:
4362 raise
4363 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004364
4365@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004366@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004367@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004368class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4369 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004370
4371 def testRecvmsgEOF(self):
4372 try:
4373 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4374 except OSError as e:
4375 if e.errno != errno.ENOTCONN:
4376 raise
4377 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004378
4379
4380class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4381 ConnectedStreamTestMixin, UnixStreamBase):
4382 pass
4383
4384@requireAttrs(socket.socket, "sendmsg")
4385@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004386class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4387 pass
4388
4389@requireAttrs(socket.socket, "recvmsg")
4390@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004391class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4392 SendrecvmsgUnixStreamTestBase):
4393 pass
4394
4395@requireAttrs(socket.socket, "recvmsg_into")
4396@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004397class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4398 SendrecvmsgUnixStreamTestBase):
4399 pass
4400
4401@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4402@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004403class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4404 pass
4405
4406@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4407@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004408class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4409 SendrecvmsgUnixStreamTestBase):
4410 pass
4411
4412
4413# Test interrupting the interruptible send/receive methods with a
4414# signal when a timeout is set. These tests avoid having multiple
4415# threads alive during the test so that the OS cannot deliver the
4416# signal to the wrong one.
4417
4418class InterruptedTimeoutBase(unittest.TestCase):
4419 # Base class for interrupted send/receive tests. Installs an
4420 # empty handler for SIGALRM and removes it on teardown, along with
4421 # any scheduled alarms.
4422
4423 def setUp(self):
4424 super().setUp()
4425 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004426 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004428
4429 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004430 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004431
4432 # Provide setAlarm() method to schedule delivery of SIGALRM after
4433 # given number of seconds, or cancel it if zero, and an
4434 # appropriate time value to use. Use setitimer() if available.
4435 if hasattr(signal, "setitimer"):
4436 alarm_time = 0.05
4437
4438 def setAlarm(self, seconds):
4439 signal.setitimer(signal.ITIMER_REAL, seconds)
4440 else:
4441 # Old systems may deliver the alarm up to one second early
4442 alarm_time = 2
4443
4444 def setAlarm(self, seconds):
4445 signal.alarm(seconds)
4446
4447
4448# Require siginterrupt() in order to ensure that system calls are
4449# interrupted by default.
4450@requireAttrs(signal, "siginterrupt")
4451@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4452 "Don't have signal.alarm or signal.setitimer")
4453class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4454 # Test interrupting the recv*() methods with signals when a
4455 # timeout is set.
4456
4457 def setUp(self):
4458 super().setUp()
4459 self.serv.settimeout(self.timeout)
4460
4461 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004462 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004463 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004464 try:
4465 self.setAlarm(self.alarm_time)
4466 with self.assertRaises(ZeroDivisionError) as cm:
4467 func(*args, **kwargs)
4468 finally:
4469 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004470
4471 def testInterruptedRecvTimeout(self):
4472 self.checkInterruptedRecv(self.serv.recv, 1024)
4473
4474 def testInterruptedRecvIntoTimeout(self):
4475 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4476
4477 def testInterruptedRecvfromTimeout(self):
4478 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4479
4480 def testInterruptedRecvfromIntoTimeout(self):
4481 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4482
4483 @requireAttrs(socket.socket, "recvmsg")
4484 def testInterruptedRecvmsgTimeout(self):
4485 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4486
4487 @requireAttrs(socket.socket, "recvmsg_into")
4488 def testInterruptedRecvmsgIntoTimeout(self):
4489 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4490
4491
4492# Require siginterrupt() in order to ensure that system calls are
4493# interrupted by default.
4494@requireAttrs(signal, "siginterrupt")
4495@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4496 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004497class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4498 ThreadSafeCleanupTestCase,
4499 SocketListeningTestMixin, TCPTestBase):
4500 # Test interrupting the interruptible send*() methods with signals
4501 # when a timeout is set.
4502
4503 def setUp(self):
4504 super().setUp()
4505 self.serv_conn = self.newSocket()
4506 self.addCleanup(self.serv_conn.close)
4507 # Use a thread to complete the connection, but wait for it to
4508 # terminate before running the test, so that there is only one
4509 # thread to accept the signal.
4510 cli_thread = threading.Thread(target=self.doConnect)
4511 cli_thread.start()
4512 self.cli_conn, addr = self.serv.accept()
4513 self.addCleanup(self.cli_conn.close)
4514 cli_thread.join()
4515 self.serv_conn.settimeout(self.timeout)
4516
4517 def doConnect(self):
4518 self.serv_conn.connect(self.serv_addr)
4519
4520 def checkInterruptedSend(self, func, *args, **kwargs):
4521 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004522 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004523 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004524 try:
4525 with self.assertRaises(ZeroDivisionError) as cm:
4526 while True:
4527 self.setAlarm(self.alarm_time)
4528 func(*args, **kwargs)
4529 finally:
4530 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004531
Ned Deilyc5640382014-02-03 13:58:31 -08004532 # Issue #12958: The following tests have problems on OS X prior to 10.7
4533 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004534 def testInterruptedSendTimeout(self):
4535 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4536
Ned Deilyc5640382014-02-03 13:58:31 -08004537 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004538 def testInterruptedSendtoTimeout(self):
4539 # Passing an actual address here as Python's wrapper for
4540 # sendto() doesn't allow passing a zero-length one; POSIX
4541 # requires that the address is ignored since the socket is
4542 # connection-mode, however.
4543 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4544 self.serv_addr)
4545
Ned Deilyc5640382014-02-03 13:58:31 -08004546 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004547 @requireAttrs(socket.socket, "sendmsg")
4548 def testInterruptedSendmsgTimeout(self):
4549 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4550
4551
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004552class TCPCloserTest(ThreadedTCPSocketTest):
4553
4554 def testClose(self):
4555 conn, addr = self.serv.accept()
4556 conn.close()
4557
4558 sd = self.cli
4559 read, write, err = select.select([sd], [], [], 1.0)
4560 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004561 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004562
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004563 # Calling close() many times should be safe.
4564 conn.close()
4565 conn.close()
4566
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004567 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004568 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004569 time.sleep(1.0)
4570
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004571
Dave Cole331708b2004-08-09 04:51:41 +00004572class BasicSocketPairTest(SocketPairTest):
4573
4574 def __init__(self, methodName='runTest'):
4575 SocketPairTest.__init__(self, methodName=methodName)
4576
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004577 def _check_defaults(self, sock):
4578 self.assertIsInstance(sock, socket.socket)
4579 if hasattr(socket, 'AF_UNIX'):
4580 self.assertEqual(sock.family, socket.AF_UNIX)
4581 else:
4582 self.assertEqual(sock.family, socket.AF_INET)
4583 self.assertEqual(sock.type, socket.SOCK_STREAM)
4584 self.assertEqual(sock.proto, 0)
4585
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004586 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004587 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004588
4589 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004590 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004591
Dave Cole331708b2004-08-09 04:51:41 +00004592 def testRecv(self):
4593 msg = self.serv.recv(1024)
4594 self.assertEqual(msg, MSG)
4595
4596 def _testRecv(self):
4597 self.cli.send(MSG)
4598
4599 def testSend(self):
4600 self.serv.send(MSG)
4601
4602 def _testSend(self):
4603 msg = self.cli.recv(1024)
4604 self.assertEqual(msg, MSG)
4605
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004606
Guido van Rossum24e4af82002-06-12 19:18:08 +00004607class NonBlockingTCPTests(ThreadedTCPSocketTest):
4608
4609 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004610 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004611 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4612
Victor Stinner304315d2018-11-30 13:22:44 +01004613 def assert_sock_timeout(self, sock, timeout):
4614 self.assertEqual(self.serv.gettimeout(), timeout)
4615
4616 blocking = (timeout != 0.0)
4617 self.assertEqual(sock.getblocking(), blocking)
4618
4619 if fcntl is not None:
4620 # When a Python socket has a non-zero timeout, it's switched
4621 # internally to a non-blocking mode. Later, sock.sendall(),
4622 # sock.recv(), and other socket operations use a select() call and
4623 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4624 # timeouts are enforced.
4625 fd_blocking = (timeout is None)
4626
4627 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4628 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4629
Guido van Rossum24e4af82002-06-12 19:18:08 +00004630 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004631 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004632 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004633 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004634
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004635 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004636 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004637
4638 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004639 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004640
4641 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004642 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004643
4644 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004645 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004646
4647 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004648 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004649
4650 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004651 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004652
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004653 @support.cpython_only
4654 def testSetBlocking_overflow(self):
4655 # Issue 15989
4656 import _testcapi
4657 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4658 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004659
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004660 self.serv.setblocking(False)
4661 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004662
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004663 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4664 self.assertIsNone(self.serv.gettimeout())
4665
4666 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4667
Serhiy Storchaka43767632013-11-03 21:31:38 +02004668 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4669 'test needs socket.SOCK_NONBLOCK')
4670 @support.requires_linux_version(2, 6, 28)
4671 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004672 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004673 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004674 self.serv = socket.socket(socket.AF_INET,
4675 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4676 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004677
4678 def _testInitNonBlocking(self):
4679 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004680
Victor Stinner304315d2018-11-30 13:22:44 +01004681 def testInheritFlagsBlocking(self):
4682 # bpo-7995: accept() on a listening socket with a timeout and the
4683 # default timeout is None, the resulting socket must be blocking.
4684 with socket_setdefaulttimeout(None):
4685 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004686 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004687 self.addCleanup(conn.close)
4688 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004689
Victor Stinner304315d2018-11-30 13:22:44 +01004690 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004691 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004692
4693 def testInheritFlagsTimeout(self):
4694 # bpo-7995: accept() on a listening socket with a timeout and the
4695 # default timeout is None, the resulting socket must inherit
4696 # the default timeout.
4697 default_timeout = 20.0
4698 with socket_setdefaulttimeout(default_timeout):
4699 self.serv.settimeout(10)
4700 conn, addr = self.serv.accept()
4701 self.addCleanup(conn.close)
4702 self.assertEqual(conn.gettimeout(), default_timeout)
4703
4704 def _testInheritFlagsTimeout(self):
4705 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004706
Guido van Rossum24e4af82002-06-12 19:18:08 +00004707 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004708 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004709 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004710
4711 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004712 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004713 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004714 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004715 dt = time.monotonic() - start_time
4716 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004717
4718 self.event.set()
4719
Victor Stinner24c62582019-10-30 12:41:43 +01004720 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004721 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004722 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004723
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004724 # connect() completed: non-blocking accept() doesn't block
4725 conn, addr = self.serv.accept()
4726 self.addCleanup(conn.close)
4727 self.assertIsNone(conn.gettimeout())
4728
Guido van Rossum24e4af82002-06-12 19:18:08 +00004729 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004730 # don't connect before event is set to check
4731 # that non-blocking accept() raises BlockingIOError
4732 self.event.wait()
4733
Christian Heimes5e696852008-04-09 08:37:03 +00004734 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004735
Guido van Rossum24e4af82002-06-12 19:18:08 +00004736 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004737 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004738 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004739 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004740 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004741
4742 # the server didn't send data yet: non-blocking recv() fails
4743 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004744 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004745
4746 self.event.set()
4747
Victor Stinner24c62582019-10-30 12:41:43 +01004748 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004749 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004750 self.fail("Error during select call to non-blocking socket.")
4751
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004752 # the server sent data yet: non-blocking recv() doesn't block
4753 msg = conn.recv(len(MSG))
4754 self.assertEqual(msg, MSG)
4755
Guido van Rossum24e4af82002-06-12 19:18:08 +00004756 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004757 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004758
4759 # don't send anything before event is set to check
4760 # that non-blocking recv() raises BlockingIOError
4761 self.event.wait()
4762
4763 # send data: recv() will no longer block
4764 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004765
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004766
Guido van Rossum24e4af82002-06-12 19:18:08 +00004767class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004768 """Unit tests for the object returned by socket.makefile()
4769
Antoine Pitrou834bd812010-10-13 16:17:14 +00004770 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004771 the client connection. You can read from this file to
4772 get output from the server.
4773
Antoine Pitrou834bd812010-10-13 16:17:14 +00004774 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004775 server connection. You can write to this file to send output
4776 to the client.
4777 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004778
Guido van Rossume9f66142002-08-07 15:46:19 +00004779 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004780 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004781 errors = 'strict'
4782 newline = None
4783
4784 read_mode = 'rb'
4785 read_msg = MSG
4786 write_mode = 'wb'
4787 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004788
Guido van Rossum24e4af82002-06-12 19:18:08 +00004789 def __init__(self, methodName='runTest'):
4790 SocketConnectedTest.__init__(self, methodName=methodName)
4791
4792 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004793 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4794 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004795 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004796 self.read_file = self.cli_conn.makefile(
4797 self.read_mode, self.bufsize,
4798 encoding = self.encoding,
4799 errors = self.errors,
4800 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004801
4802 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004803 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004804 self.read_file.close()
4805 self.assertTrue(self.read_file.closed)
4806 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004807 SocketConnectedTest.tearDown(self)
4808
4809 def clientSetUp(self):
4810 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004811 self.write_file = self.serv_conn.makefile(
4812 self.write_mode, self.bufsize,
4813 encoding = self.encoding,
4814 errors = self.errors,
4815 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004816
4817 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004818 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004819 self.write_file.close()
4820 self.assertTrue(self.write_file.closed)
4821 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004822 SocketConnectedTest.clientTearDown(self)
4823
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004824 def testReadAfterTimeout(self):
4825 # Issue #7322: A file object must disallow further reads
4826 # after a timeout has occurred.
4827 self.cli_conn.settimeout(1)
4828 self.read_file.read(3)
4829 # First read raises a timeout
Christian Heimes03c8ddd2020-11-20 09:26:07 +01004830 self.assertRaises(TimeoutError, self.read_file.read, 1)
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004831 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004832 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004833 self.read_file.read(1)
4834 self.assertIn("cannot read from timed out object", str(ctx.exception))
4835
4836 def _testReadAfterTimeout(self):
4837 self.write_file.write(self.write_msg[0:3])
4838 self.write_file.flush()
4839 self.serv_finished.wait()
4840
Guido van Rossum24e4af82002-06-12 19:18:08 +00004841 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004842 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004843 first_seg = self.read_file.read(len(self.read_msg)-3)
4844 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004845 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004846 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004847
4848 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004849 self.write_file.write(self.write_msg)
4850 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004851
Guido van Rossum8c943832002-08-08 01:00:28 +00004852 def testFullRead(self):
4853 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004854 msg = self.read_file.read()
4855 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004856
4857 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004858 self.write_file.write(self.write_msg)
4859 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004860
Guido van Rossum24e4af82002-06-12 19:18:08 +00004861 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004862 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004863 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004864 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004865 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004866 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004867 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004868 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004869 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004870
4871 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004872 self.write_file.write(self.write_msg)
4873 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004874
4875 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004876 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004877 line = self.read_file.readline()
4878 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004879
4880 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004881 self.write_file.write(self.write_msg)
4882 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004883
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004884 def testCloseAfterMakefile(self):
4885 # The file returned by makefile should keep the socket open.
4886 self.cli_conn.close()
4887 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004888 msg = self.read_file.read()
4889 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004890
4891 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004892 self.write_file.write(self.write_msg)
4893 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004894
4895 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004896 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004897 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004898 if isinstance(self.read_msg, str):
4899 msg = msg.decode()
4900 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004901
4902 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004903 self.write_file.write(self.write_msg)
4904 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004905
Tim Peters116d83c2004-03-28 02:20:45 +00004906 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004907 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004908
4909 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004910 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004911
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004912 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004913 self.assertEqual(self.read_file.mode, self.read_mode)
4914 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004915
4916 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004917 self.assertEqual(self.write_file.mode, self.write_mode)
4918 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004919
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004920 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004921 self.read_file.close()
4922 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004923 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004924 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004925
4926 def _testRealClose(self):
4927 pass
4928
4929
Guido van Rossume9f66142002-08-07 15:46:19 +00004930class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4931
4932 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004933
Guido van Rossume9f66142002-08-07 15:46:19 +00004934 In this case (and in this case only), it should be possible to
4935 create a file object, read a line from it, create another file
4936 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004937 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004938 when reading multiple requests from the same socket."""
4939
4940 bufsize = 0 # Use unbuffered mode
4941
4942 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004943 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004944 line = self.read_file.readline() # first line
4945 self.assertEqual(line, b"A. " + self.write_msg) # first line
4946 self.read_file = self.cli_conn.makefile('rb', 0)
4947 line = self.read_file.readline() # second line
4948 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004949
4950 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004951 self.write_file.write(b"A. " + self.write_msg)
4952 self.write_file.write(b"B. " + self.write_msg)
4953 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004954
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004955 def testMakefileClose(self):
4956 # The file returned by makefile should keep the socket open...
4957 self.cli_conn.close()
4958 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004959 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004960 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004961 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004962 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004963
4964 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004965 self.write_file.write(self.write_msg)
4966 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004967
4968 def testMakefileCloseSocketDestroy(self):
4969 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004970 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004971 refcount_after = sys.getrefcount(self.cli_conn)
4972 self.assertEqual(refcount_before - 1, refcount_after)
4973
4974 def _testMakefileCloseSocketDestroy(self):
4975 pass
4976
Antoine Pitrou98b46702010-09-18 22:59:00 +00004977 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004978 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004979 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4980
4981 def testSmallReadNonBlocking(self):
4982 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004983 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4984 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004985 self.evt1.set()
4986 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004987 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004988 if first_seg is None:
4989 # Data not arrived (can happen under Windows), wait a bit
4990 time.sleep(0.5)
4991 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004992 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004993 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004994 self.assertEqual(n, 3)
4995 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004996 self.assertEqual(msg, self.read_msg)
4997 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4998 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004999
5000 def _testSmallReadNonBlocking(self):
5001 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005002 self.write_file.write(self.write_msg)
5003 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00005004 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03005005 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00005006 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
5007 self.serv_finished.wait(5.0)
5008
5009 def testWriteNonBlocking(self):
5010 self.cli_finished.wait(5.0)
5011 # The client thread can't skip directly - the SkipTest exception
5012 # would appear as a failure.
5013 if self.serv_skipped:
5014 self.skipTest(self.serv_skipped)
5015
5016 def _testWriteNonBlocking(self):
5017 self.serv_skipped = None
5018 self.serv_conn.setblocking(False)
5019 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02005020 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00005021 LIMIT = 10
5022 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00005023 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005024 self.assertGreater(n, 0)
5025 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005026 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005027 if n is None:
5028 # Succeeded
5029 break
5030 self.assertGreater(n, 0)
5031 else:
5032 # Let us know that this test didn't manage to establish
5033 # the expected conditions. This is not a failure in itself but,
5034 # if it happens repeatedly, the test should be fixed.
5035 self.serv_skipped = "failed to saturate the socket buffer"
5036
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005037
Guido van Rossum8c943832002-08-08 01:00:28 +00005038class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5039
5040 bufsize = 1 # Default-buffered for reading; line-buffered for writing
5041
5042
5043class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5044
5045 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00005046
Thomas Woutersb2137042007-02-01 18:02:27 +00005047
Antoine Pitrou834bd812010-10-13 16:17:14 +00005048class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5049 """Tests for socket.makefile() in text mode (rather than binary)"""
5050
5051 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005052 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005053 write_mode = 'wb'
5054 write_msg = MSG
5055 newline = ''
5056
5057
5058class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5059 """Tests for socket.makefile() in text mode (rather than binary)"""
5060
5061 read_mode = 'rb'
5062 read_msg = MSG
5063 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005064 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005065 newline = ''
5066
5067
5068class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5069 """Tests for socket.makefile() in text mode (rather than binary)"""
5070
5071 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005072 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005073 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005074 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005075 newline = ''
5076
5077
Guido van Rossumd8faa362007-04-27 19:54:29 +00005078class NetworkConnectionTest(object):
5079 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005080
Guido van Rossumd8faa362007-04-27 19:54:29 +00005081 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005082 # We're inherited below by BasicTCPTest2, which also inherits
5083 # BasicTCPTest, which defines self.port referenced below.
5084 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005085 self.serv_conn = self.cli
5086
5087class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5088 """Tests that NetworkConnection does not break existing TCP functionality.
5089 """
5090
5091class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005092
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005093 class MockSocket(socket.socket):
5094 def connect(self, *args):
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005095 raise TimeoutError('timed out')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005096
5097 @contextlib.contextmanager
5098 def mocked_socket_module(self):
5099 """Return a socket which times out on connect"""
5100 old_socket = socket.socket
5101 socket.socket = self.MockSocket
5102 try:
5103 yield
5104 finally:
5105 socket.socket = old_socket
5106
5107 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005108 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005109 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005110 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005111 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005112 cli.connect((HOST, port))
5113 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5114
5115 def test_create_connection(self):
5116 # Issue #9792: errors raised by create_connection() should have
5117 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005118 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005119 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005120 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005121
5122 # Issue #16257: create_connection() calls getaddrinfo() against
5123 # 'localhost'. This may result in an IPV6 addr being returned
5124 # as well as an IPV4 one:
5125 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5126 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5127 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5128 #
5129 # create_connection() enumerates through all the addresses returned
5130 # and if it doesn't successfully bind to any of them, it propagates
5131 # the last exception it encountered.
5132 #
5133 # On Solaris, ENETUNREACH is returned in this circumstance instead
5134 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5135 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005136 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005137 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005138
5139 def test_create_connection_timeout(self):
5140 # Issue #9792: create_connection() should not recast timeout errors
5141 # as generic socket errors.
5142 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005143 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005144 socket.create_connection((HOST, 1234))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005145 except TimeoutError:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005146 pass
5147 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005148 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005149 raise
5150 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005151 self.fail('TimeoutError not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005152
Guido van Rossumd8faa362007-04-27 19:54:29 +00005153
5154class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5155
5156 def __init__(self, methodName='runTest'):
5157 SocketTCPTest.__init__(self, methodName=methodName)
5158 ThreadableTest.__init__(self)
5159
5160 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005161 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005162
5163 def clientTearDown(self):
5164 self.cli.close()
5165 self.cli = None
5166 ThreadableTest.clientTearDown(self)
5167
5168 def _justAccept(self):
5169 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005170 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005171
5172 testFamily = _justAccept
5173 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005174 self.cli = socket.create_connection((HOST, self.port),
5175 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005176 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005177 self.assertEqual(self.cli.family, 2)
5178
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005179 testSourceAddress = _justAccept
5180 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005181 self.cli = socket.create_connection((HOST, self.port),
5182 timeout=support.LOOPBACK_TIMEOUT,
5183 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005184 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005185 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005186 # The port number being used is sufficient to show that the bind()
5187 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005188
Guido van Rossumd8faa362007-04-27 19:54:29 +00005189 testTimeoutDefault = _justAccept
5190 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005191 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005192 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005193 socket.setdefaulttimeout(42)
5194 try:
5195 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005196 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005197 finally:
5198 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005199 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005200
5201 testTimeoutNone = _justAccept
5202 def _testTimeoutNone(self):
5203 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005204 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005205 socket.setdefaulttimeout(30)
5206 try:
5207 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005208 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005209 finally:
5210 socket.setdefaulttimeout(None)
5211 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005212
5213 testTimeoutValueNamed = _justAccept
5214 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005215 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005216 self.assertEqual(self.cli.gettimeout(), 30)
5217
5218 testTimeoutValueNonamed = _justAccept
5219 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005220 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005221 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005222 self.assertEqual(self.cli.gettimeout(), 30)
5223
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005224
Guido van Rossumd8faa362007-04-27 19:54:29 +00005225class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5226
5227 def __init__(self, methodName='runTest'):
5228 SocketTCPTest.__init__(self, methodName=methodName)
5229 ThreadableTest.__init__(self)
5230
5231 def clientSetUp(self):
5232 pass
5233
5234 def clientTearDown(self):
5235 self.cli.close()
5236 self.cli = None
5237 ThreadableTest.clientTearDown(self)
5238
5239 def testInsideTimeout(self):
5240 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005241 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005242 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005243 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005244 testOutsideTimeout = testInsideTimeout
5245
5246 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005247 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005248 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005249 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005250
5251 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005252 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005253 self.assertRaises(TimeoutError, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005254
5255
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005256class TCPTimeoutTest(SocketTCPTest):
5257
5258 def testTCPTimeout(self):
5259 def raise_timeout(*args, **kwargs):
5260 self.serv.settimeout(1.0)
5261 self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005262 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005263 "Error generating a timeout exception (TCP)")
5264
5265 def testTimeoutZero(self):
5266 ok = False
5267 try:
5268 self.serv.settimeout(0.0)
5269 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005270 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005271 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005272 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005273 ok = True
5274 except:
5275 self.fail("caught unexpected exception (TCP)")
5276 if not ok:
5277 self.fail("accept() returned success when we did not expect it")
5278
Serhiy Storchaka43767632013-11-03 21:31:38 +02005279 @unittest.skipUnless(hasattr(signal, 'alarm'),
5280 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005281 def testInterruptedTimeout(self):
5282 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005283 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005284 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005285 self.serv.settimeout(5.0) # must be longer than alarm
5286 class Alarm(Exception):
5287 pass
5288 def alarm_handler(signal, frame):
5289 raise Alarm
5290 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5291 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005292 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005293 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005294 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005295 except TimeoutError:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005296 self.fail("caught timeout instead of Alarm")
5297 except Alarm:
5298 pass
5299 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005300 self.fail("caught other exception instead of Alarm:"
5301 " %s(%s):\n%s" %
5302 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005303 else:
5304 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005305 finally:
5306 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005307 except Alarm:
5308 self.fail("got Alarm in wrong place")
5309 finally:
5310 # no alarm can be pending. Safe to restore old handler.
5311 signal.signal(signal.SIGALRM, old_alarm)
5312
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005313class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005314
5315 def testUDPTimeout(self):
5316 def raise_timeout(*args, **kwargs):
5317 self.serv.settimeout(1.0)
5318 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005319 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005320 "Error generating a timeout exception (UDP)")
5321
5322 def testTimeoutZero(self):
5323 ok = False
5324 try:
5325 self.serv.settimeout(0.0)
5326 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005327 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005328 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005329 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005330 ok = True
5331 except:
5332 self.fail("caught unexpected exception (UDP)")
5333 if not ok:
5334 self.fail("recv() returned success when we did not expect it")
5335
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005336@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5337 'UDPLITE sockets required for this test.')
5338class UDPLITETimeoutTest(SocketUDPLITETest):
5339
5340 def testUDPLITETimeout(self):
5341 def raise_timeout(*args, **kwargs):
5342 self.serv.settimeout(1.0)
5343 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005344 self.assertRaises(TimeoutError, raise_timeout,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005345 "Error generating a timeout exception (UDPLITE)")
5346
5347 def testTimeoutZero(self):
5348 ok = False
5349 try:
5350 self.serv.settimeout(0.0)
5351 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005352 except TimeoutError:
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005353 self.fail("caught timeout instead of error (UDPLITE)")
5354 except OSError:
5355 ok = True
5356 except:
5357 self.fail("caught unexpected exception (UDPLITE)")
5358 if not ok:
5359 self.fail("recv() returned success when we did not expect it")
5360
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005361class TestExceptions(unittest.TestCase):
5362
5363 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005364 self.assertTrue(issubclass(OSError, Exception))
5365 self.assertTrue(issubclass(socket.herror, OSError))
5366 self.assertTrue(issubclass(socket.gaierror, OSError))
5367 self.assertTrue(issubclass(socket.timeout, OSError))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005368 self.assertIs(socket.error, OSError)
5369 self.assertIs(socket.timeout, TimeoutError)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005370
Yury Selivanovfa22b292016-10-18 16:03:52 -04005371 def test_setblocking_invalidfd(self):
5372 # Regression test for issue #28471
5373
5374 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5375 sock = socket.socket(
5376 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5377 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005378 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005379
5380 with self.assertRaises(OSError):
5381 sock.setblocking(False)
5382
5383
Serhiy Storchaka43767632013-11-03 21:31:38 +02005384@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005385class TestLinuxAbstractNamespace(unittest.TestCase):
5386
5387 UNIX_PATH_MAX = 108
5388
5389 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005390 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005391 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5392 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005393 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005394 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5395 s2.connect(s1.getsockname())
5396 with s1.accept()[0] as s3:
5397 self.assertEqual(s1.getsockname(), address)
5398 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005399
5400 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005401 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005402 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5403 s.bind(address)
5404 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005405
5406 def testNameOverflow(self):
5407 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005408 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005409 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005410
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005411 def testStrName(self):
5412 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005413 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5414 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005415 s.bind("\x00python\x00test\x00")
5416 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005417 finally:
5418 s.close()
5419
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005420 def testBytearrayName(self):
5421 # Check that an abstract name can be passed as a bytearray.
5422 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5423 s.bind(bytearray(b"\x00python\x00test\x00"))
5424 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5425
Serhiy Storchaka43767632013-11-03 21:31:38 +02005426@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005427class TestUnixDomain(unittest.TestCase):
5428
5429 def setUp(self):
5430 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5431
5432 def tearDown(self):
5433 self.sock.close()
5434
5435 def encoded(self, path):
5436 # Return the given path encoded in the file system encoding,
5437 # or skip the test if this is not possible.
5438 try:
5439 return os.fsencode(path)
5440 except UnicodeEncodeError:
5441 self.skipTest(
5442 "Pathname {0!a} cannot be represented in file "
5443 "system encoding {1!r}".format(
5444 path, sys.getfilesystemencoding()))
5445
Antoine Pitrou16374872011-12-16 15:04:12 +01005446 def bind(self, sock, path):
5447 # Bind the socket
5448 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005449 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005450 except OSError as e:
5451 if str(e) == "AF_UNIX path too long":
5452 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005453 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005454 .format(path))
5455 else:
5456 raise
5457
Antoine Pitrou495b5022017-05-02 17:20:00 +02005458 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005459 # Issue #30205 (note getsockname() can return None on OS X)
5460 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005461
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005462 def testStrAddr(self):
5463 # Test binding to and retrieving a normal string pathname.
Hai Shideb01622020-07-06 20:29:49 +08005464 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005465 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005466 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005467 self.assertEqual(self.sock.getsockname(), path)
5468
5469 def testBytesAddr(self):
5470 # Test binding to a bytes pathname.
Hai Shideb01622020-07-06 20:29:49 +08005471 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005472 self.bind(self.sock, self.encoded(path))
Hai Shideb01622020-07-06 20:29:49 +08005473 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005474 self.assertEqual(self.sock.getsockname(), path)
5475
5476 def testSurrogateescapeBind(self):
5477 # Test binding to a valid non-ASCII pathname, with the
5478 # non-ASCII bytes supplied using surrogateescape encoding.
Hai Shideb01622020-07-06 20:29:49 +08005479 path = os.path.abspath(os_helper.TESTFN_UNICODE)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005480 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005481 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Hai Shideb01622020-07-06 20:29:49 +08005482 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005483 self.assertEqual(self.sock.getsockname(), path)
5484
5485 def testUnencodableAddr(self):
5486 # Test binding to a pathname that cannot be encoded in the
5487 # file system encoding.
Hai Shideb01622020-07-06 20:29:49 +08005488 if os_helper.TESTFN_UNENCODABLE is None:
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005489 self.skipTest("No unencodable filename available")
Hai Shideb01622020-07-06 20:29:49 +08005490 path = os.path.abspath(os_helper.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005491 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005492 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005493 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005494
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005495
Thomas Wouters477c8d52006-05-27 19:21:47 +00005496class BufferIOTest(SocketConnectedTest):
5497 """
5498 Test the buffer versions of socket.recv() and socket.send().
5499 """
5500 def __init__(self, methodName='runTest'):
5501 SocketConnectedTest.__init__(self, methodName=methodName)
5502
Antoine Pitrou25480782010-03-17 22:50:28 +00005503 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005504 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005505 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005506 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005507 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005508 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005509 self.assertEqual(msg, MSG)
5510
Antoine Pitrou25480782010-03-17 22:50:28 +00005511 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005512 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005513 self.serv_conn.send(buf)
5514
Antoine Pitrou25480782010-03-17 22:50:28 +00005515 def testRecvIntoBytearray(self):
5516 buf = bytearray(1024)
5517 nbytes = self.cli_conn.recv_into(buf)
5518 self.assertEqual(nbytes, len(MSG))
5519 msg = buf[:len(MSG)]
5520 self.assertEqual(msg, MSG)
5521
5522 _testRecvIntoBytearray = _testRecvIntoArray
5523
5524 def testRecvIntoMemoryview(self):
5525 buf = bytearray(1024)
5526 nbytes = self.cli_conn.recv_into(memoryview(buf))
5527 self.assertEqual(nbytes, len(MSG))
5528 msg = buf[:len(MSG)]
5529 self.assertEqual(msg, MSG)
5530
5531 _testRecvIntoMemoryview = _testRecvIntoArray
5532
5533 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005534 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005535 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005536 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005537 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005538 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005539 self.assertEqual(msg, MSG)
5540
Antoine Pitrou25480782010-03-17 22:50:28 +00005541 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005542 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005543 self.serv_conn.send(buf)
5544
Antoine Pitrou25480782010-03-17 22:50:28 +00005545 def testRecvFromIntoBytearray(self):
5546 buf = bytearray(1024)
5547 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5548 self.assertEqual(nbytes, len(MSG))
5549 msg = buf[:len(MSG)]
5550 self.assertEqual(msg, MSG)
5551
5552 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5553
5554 def testRecvFromIntoMemoryview(self):
5555 buf = bytearray(1024)
5556 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5557 self.assertEqual(nbytes, len(MSG))
5558 msg = buf[:len(MSG)]
5559 self.assertEqual(msg, MSG)
5560
5561 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5562
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005563 def testRecvFromIntoSmallBuffer(self):
5564 # See issue #20246.
5565 buf = bytearray(8)
5566 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5567
5568 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005569 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005570
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005571 def testRecvFromIntoEmptyBuffer(self):
5572 buf = bytearray()
5573 self.cli_conn.recvfrom_into(buf)
5574 self.cli_conn.recvfrom_into(buf, 0)
5575
5576 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5577
Christian Heimes043d6f62008-01-07 17:19:16 +00005578
5579TIPC_STYPE = 2000
5580TIPC_LOWER = 200
5581TIPC_UPPER = 210
5582
5583def isTipcAvailable():
5584 """Check if the TIPC module is loaded
5585
5586 The TIPC module is not loaded automatically on Ubuntu and probably
5587 other Linux distros.
5588 """
5589 if not hasattr(socket, "AF_TIPC"):
5590 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005591 try:
5592 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005593 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005594 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005595 # have not the permission to read it.
5596 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005597 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005598 for line in f:
5599 if line.startswith("tipc "):
5600 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005601 return False
5602
Serhiy Storchaka43767632013-11-03 21:31:38 +02005603@unittest.skipUnless(isTipcAvailable(),
5604 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005605class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005606 def testRDM(self):
5607 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5608 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005609 self.addCleanup(srv.close)
5610 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005611
5612 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5613 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5614 TIPC_LOWER, TIPC_UPPER)
5615 srv.bind(srvaddr)
5616
5617 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5618 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5619 cli.sendto(MSG, sendaddr)
5620
5621 msg, recvaddr = srv.recvfrom(1024)
5622
5623 self.assertEqual(cli.getsockname(), recvaddr)
5624 self.assertEqual(msg, MSG)
5625
5626
Serhiy Storchaka43767632013-11-03 21:31:38 +02005627@unittest.skipUnless(isTipcAvailable(),
5628 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005629class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005630 def __init__(self, methodName = 'runTest'):
5631 unittest.TestCase.__init__(self, methodName = methodName)
5632 ThreadableTest.__init__(self)
5633
5634 def setUp(self):
5635 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005636 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005637 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5638 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5639 TIPC_LOWER, TIPC_UPPER)
5640 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005641 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005642 self.serverExplicitReady()
5643 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005644 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005645
5646 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005647 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005648 # accept() call; sleep a little while to avoid it, otherwise
5649 # we could get an exception
5650 time.sleep(0.1)
5651 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005652 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005653 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5654 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5655 self.cli.connect(addr)
5656 self.cliaddr = self.cli.getsockname()
5657
5658 def testStream(self):
5659 msg = self.conn.recv(1024)
5660 self.assertEqual(msg, MSG)
5661 self.assertEqual(self.cliaddr, self.connaddr)
5662
5663 def _testStream(self):
5664 self.cli.send(MSG)
5665 self.cli.close()
5666
5667
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005668class ContextManagersTest(ThreadedTCPSocketTest):
5669
5670 def _testSocketClass(self):
5671 # base test
5672 with socket.socket() as sock:
5673 self.assertFalse(sock._closed)
5674 self.assertTrue(sock._closed)
5675 # close inside with block
5676 with socket.socket() as sock:
5677 sock.close()
5678 self.assertTrue(sock._closed)
5679 # exception inside with block
5680 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005681 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005682 self.assertTrue(sock._closed)
5683
5684 def testCreateConnectionBase(self):
5685 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005686 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005687 data = conn.recv(1024)
5688 conn.sendall(data)
5689
5690 def _testCreateConnectionBase(self):
5691 address = self.serv.getsockname()
5692 with socket.create_connection(address) as sock:
5693 self.assertFalse(sock._closed)
5694 sock.sendall(b'foo')
5695 self.assertEqual(sock.recv(1024), b'foo')
5696 self.assertTrue(sock._closed)
5697
5698 def testCreateConnectionClose(self):
5699 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005700 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005701 data = conn.recv(1024)
5702 conn.sendall(data)
5703
5704 def _testCreateConnectionClose(self):
5705 address = self.serv.getsockname()
5706 with socket.create_connection(address) as sock:
5707 sock.close()
5708 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005709 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005710
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005711
Victor Stinnerdaf45552013-08-28 00:53:59 +02005712class InheritanceTest(unittest.TestCase):
5713 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5714 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005715 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005716 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005717 with socket.socket(socket.AF_INET,
5718 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005719 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005720 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005721
5722 def test_default_inheritable(self):
5723 sock = socket.socket()
5724 with sock:
5725 self.assertEqual(sock.get_inheritable(), False)
5726
5727 def test_dup(self):
5728 sock = socket.socket()
5729 with sock:
5730 newsock = sock.dup()
5731 sock.close()
5732 with newsock:
5733 self.assertEqual(newsock.get_inheritable(), False)
5734
5735 def test_set_inheritable(self):
5736 sock = socket.socket()
5737 with sock:
5738 sock.set_inheritable(True)
5739 self.assertEqual(sock.get_inheritable(), True)
5740
5741 sock.set_inheritable(False)
5742 self.assertEqual(sock.get_inheritable(), False)
5743
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005744 @unittest.skipIf(fcntl is None, "need fcntl")
5745 def test_get_inheritable_cloexec(self):
5746 sock = socket.socket()
5747 with sock:
5748 fd = sock.fileno()
5749 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005750
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005751 # clear FD_CLOEXEC flag
5752 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5753 flags &= ~fcntl.FD_CLOEXEC
5754 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005755
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005756 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005757
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005758 @unittest.skipIf(fcntl is None, "need fcntl")
5759 def test_set_inheritable_cloexec(self):
5760 sock = socket.socket()
5761 with sock:
5762 fd = sock.fileno()
5763 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5764 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005765
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005766 sock.set_inheritable(True)
5767 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5768 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005769
5770
Victor Stinnerdaf45552013-08-28 00:53:59 +02005771 def test_socketpair(self):
5772 s1, s2 = socket.socketpair()
5773 self.addCleanup(s1.close)
5774 self.addCleanup(s2.close)
5775 self.assertEqual(s1.get_inheritable(), False)
5776 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005777
5778
5779@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5780 "SOCK_NONBLOCK not defined")
5781class NonblockConstantTest(unittest.TestCase):
5782 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5783 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005784 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005785 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005786 self.assertTrue(
5787 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005788 if timeout == 0:
5789 # timeout == 0: means that getblocking() must be False.
5790 self.assertFalse(s.getblocking())
5791 else:
5792 # If timeout > 0, the socket will be in a "blocking" mode
5793 # from the standpoint of the Python API. For Python socket
5794 # object, "blocking" means that operations like 'sock.recv()'
5795 # will block. Internally, file descriptors for
5796 # "blocking" Python sockets *with timeouts* are in a
5797 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5798 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5799 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005800 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005801 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005802 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005803 self.assertFalse(
5804 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005805 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005806
Charles-François Natali239bb962011-06-03 12:55:15 +02005807 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005808 def test_SOCK_NONBLOCK(self):
5809 # a lot of it seems silly and redundant, but I wanted to test that
5810 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005811 with socket.socket(socket.AF_INET,
5812 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5813 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005814 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005815 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005816 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005817 self.checkNonblock(s)
5818 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005819 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005820 s.settimeout(2.0)
5821 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005822 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005823 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005824 # defaulttimeout
5825 t = socket.getdefaulttimeout()
5826 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005827 with socket.socket() as s:
5828 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005829 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005830 with socket.socket() as s:
5831 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005832 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005833 with socket.socket() as s:
5834 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005835 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005836 with socket.socket() as s:
5837 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005838 socket.setdefaulttimeout(t)
5839
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005840
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005841@unittest.skipUnless(os.name == "nt", "Windows specific")
5842@unittest.skipUnless(multiprocessing, "need multiprocessing")
5843class TestSocketSharing(SocketTCPTest):
5844 # This must be classmethod and not staticmethod or multiprocessing
5845 # won't be able to bootstrap it.
5846 @classmethod
5847 def remoteProcessServer(cls, q):
5848 # Recreate socket from shared data
5849 sdata = q.get()
5850 message = q.get()
5851
5852 s = socket.fromshare(sdata)
5853 s2, c = s.accept()
5854
5855 # Send the message
5856 s2.sendall(message)
5857 s2.close()
5858 s.close()
5859
5860 def testShare(self):
5861 # Transfer the listening server socket to another process
5862 # and service it from there.
5863
5864 # Create process:
5865 q = multiprocessing.Queue()
5866 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5867 p.start()
5868
5869 # Get the shared socket data
5870 data = self.serv.share(p.pid)
5871
5872 # Pass the shared socket to the other process
5873 addr = self.serv.getsockname()
5874 self.serv.close()
5875 q.put(data)
5876
5877 # The data that the server will send us
5878 message = b"slapmahfro"
5879 q.put(message)
5880
5881 # Connect
5882 s = socket.create_connection(addr)
5883 # listen for the data
5884 m = []
5885 while True:
5886 data = s.recv(100)
5887 if not data:
5888 break
5889 m.append(data)
5890 s.close()
5891 received = b"".join(m)
5892 self.assertEqual(received, message)
5893 p.join()
5894
5895 def testShareLength(self):
5896 data = self.serv.share(os.getpid())
5897 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5898 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5899
5900 def compareSockets(self, org, other):
5901 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005902 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005903 self.assertEqual(org.gettimeout(), None)
5904 self.assertEqual(org.gettimeout(), other.gettimeout())
5905
5906 self.assertEqual(org.family, other.family)
5907 self.assertEqual(org.type, other.type)
5908 # If the user specified "0" for proto, then
5909 # internally windows will have picked the correct value.
5910 # Python introspection on the socket however will still return
5911 # 0. For the shared socket, the python value is recreated
5912 # from the actual value, so it may not compare correctly.
5913 if org.proto != 0:
5914 self.assertEqual(org.proto, other.proto)
5915
5916 def testShareLocal(self):
5917 data = self.serv.share(os.getpid())
5918 s = socket.fromshare(data)
5919 try:
5920 self.compareSockets(self.serv, s)
5921 finally:
5922 s.close()
5923
5924 def testTypes(self):
5925 families = [socket.AF_INET, socket.AF_INET6]
5926 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5927 for f in families:
5928 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005929 try:
5930 source = socket.socket(f, t)
5931 except OSError:
5932 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005933 try:
5934 data = source.share(os.getpid())
5935 shared = socket.fromshare(data)
5936 try:
5937 self.compareSockets(source, shared)
5938 finally:
5939 shared.close()
5940 finally:
5941 source.close()
5942
5943
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005944class SendfileUsingSendTest(ThreadedTCPSocketTest):
5945 """
5946 Test the send() implementation of socket.sendfile().
5947 """
5948
Victor Stinner8c663fd2017-11-08 14:44:44 -08005949 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005950 BUFSIZE = 8192
5951 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005952 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005953
5954 @classmethod
5955 def setUpClass(cls):
5956 def chunks(total, step):
5957 assert total >= step
5958 while total > step:
5959 yield step
5960 total -= step
5961 if total:
5962 yield total
5963
5964 chunk = b"".join([random.choice(string.ascii_letters).encode()
5965 for i in range(cls.BUFSIZE)])
Hai Shideb01622020-07-06 20:29:49 +08005966 with open(os_helper.TESTFN, 'wb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005967 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5968 f.write(chunk)
Hai Shideb01622020-07-06 20:29:49 +08005969 with open(os_helper.TESTFN, 'rb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005970 cls.FILEDATA = f.read()
5971 assert len(cls.FILEDATA) == cls.FILESIZE
5972
5973 @classmethod
5974 def tearDownClass(cls):
Hai Shideb01622020-07-06 20:29:49 +08005975 os_helper.unlink(os_helper.TESTFN)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005976
5977 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005978 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005979 conn, addr = self.serv.accept()
5980 conn.settimeout(self.TIMEOUT)
5981 self.addCleanup(conn.close)
5982 return conn
5983
5984 def recv_data(self, conn):
5985 received = []
5986 while True:
5987 chunk = conn.recv(self.BUFSIZE)
5988 if not chunk:
5989 break
5990 received.append(chunk)
5991 return b''.join(received)
5992
5993 def meth_from_sock(self, sock):
5994 # Depending on the mixin class being run return either send()
5995 # or sendfile() method implementation.
5996 return getattr(sock, "_sendfile_use_send")
5997
5998 # regular file
5999
6000 def _testRegularFile(self):
6001 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006002 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006003 with socket.create_connection(address) as sock, file as file:
6004 meth = self.meth_from_sock(sock)
6005 sent = meth(file)
6006 self.assertEqual(sent, self.FILESIZE)
6007 self.assertEqual(file.tell(), self.FILESIZE)
6008
6009 def testRegularFile(self):
6010 conn = self.accept_conn()
6011 data = self.recv_data(conn)
6012 self.assertEqual(len(data), self.FILESIZE)
6013 self.assertEqual(data, self.FILEDATA)
6014
6015 # non regular file
6016
6017 def _testNonRegularFile(self):
6018 address = self.serv.getsockname()
6019 file = io.BytesIO(self.FILEDATA)
6020 with socket.create_connection(address) as sock, file as file:
6021 sent = sock.sendfile(file)
6022 self.assertEqual(sent, self.FILESIZE)
6023 self.assertEqual(file.tell(), self.FILESIZE)
6024 self.assertRaises(socket._GiveupOnSendfile,
6025 sock._sendfile_use_sendfile, file)
6026
6027 def testNonRegularFile(self):
6028 conn = self.accept_conn()
6029 data = self.recv_data(conn)
6030 self.assertEqual(len(data), self.FILESIZE)
6031 self.assertEqual(data, self.FILEDATA)
6032
6033 # empty file
6034
6035 def _testEmptyFileSend(self):
6036 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006037 filename = os_helper.TESTFN + "2"
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006038 with open(filename, 'wb'):
Hai Shideb01622020-07-06 20:29:49 +08006039 self.addCleanup(os_helper.unlink, filename)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006040 file = open(filename, 'rb')
6041 with socket.create_connection(address) as sock, file as file:
6042 meth = self.meth_from_sock(sock)
6043 sent = meth(file)
6044 self.assertEqual(sent, 0)
6045 self.assertEqual(file.tell(), 0)
6046
6047 def testEmptyFileSend(self):
6048 conn = self.accept_conn()
6049 data = self.recv_data(conn)
6050 self.assertEqual(data, b"")
6051
6052 # offset
6053
6054 def _testOffset(self):
6055 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006056 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006057 with socket.create_connection(address) as sock, file as file:
6058 meth = self.meth_from_sock(sock)
6059 sent = meth(file, offset=5000)
6060 self.assertEqual(sent, self.FILESIZE - 5000)
6061 self.assertEqual(file.tell(), self.FILESIZE)
6062
6063 def testOffset(self):
6064 conn = self.accept_conn()
6065 data = self.recv_data(conn)
6066 self.assertEqual(len(data), self.FILESIZE - 5000)
6067 self.assertEqual(data, self.FILEDATA[5000:])
6068
6069 # count
6070
6071 def _testCount(self):
6072 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006073 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006074 sock = socket.create_connection(address,
6075 timeout=support.LOOPBACK_TIMEOUT)
6076 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006077 count = 5000007
6078 meth = self.meth_from_sock(sock)
6079 sent = meth(file, count=count)
6080 self.assertEqual(sent, count)
6081 self.assertEqual(file.tell(), count)
6082
6083 def testCount(self):
6084 count = 5000007
6085 conn = self.accept_conn()
6086 data = self.recv_data(conn)
6087 self.assertEqual(len(data), count)
6088 self.assertEqual(data, self.FILEDATA[:count])
6089
6090 # count small
6091
6092 def _testCountSmall(self):
6093 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006094 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006095 sock = socket.create_connection(address,
6096 timeout=support.LOOPBACK_TIMEOUT)
6097 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006098 count = 1
6099 meth = self.meth_from_sock(sock)
6100 sent = meth(file, count=count)
6101 self.assertEqual(sent, count)
6102 self.assertEqual(file.tell(), count)
6103
6104 def testCountSmall(self):
6105 count = 1
6106 conn = self.accept_conn()
6107 data = self.recv_data(conn)
6108 self.assertEqual(len(data), count)
6109 self.assertEqual(data, self.FILEDATA[:count])
6110
6111 # count + offset
6112
6113 def _testCountWithOffset(self):
6114 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006115 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006116 with socket.create_connection(address, timeout=2) as sock, file as file:
6117 count = 100007
6118 meth = self.meth_from_sock(sock)
6119 sent = meth(file, offset=2007, count=count)
6120 self.assertEqual(sent, count)
6121 self.assertEqual(file.tell(), count + 2007)
6122
6123 def testCountWithOffset(self):
6124 count = 100007
6125 conn = self.accept_conn()
6126 data = self.recv_data(conn)
6127 self.assertEqual(len(data), count)
6128 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6129
6130 # non blocking sockets are not supposed to work
6131
6132 def _testNonBlocking(self):
6133 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006134 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006135 with socket.create_connection(address) as sock, file as file:
6136 sock.setblocking(False)
6137 meth = self.meth_from_sock(sock)
6138 self.assertRaises(ValueError, meth, file)
6139 self.assertRaises(ValueError, sock.sendfile, file)
6140
6141 def testNonBlocking(self):
6142 conn = self.accept_conn()
6143 if conn.recv(8192):
6144 self.fail('was not supposed to receive any data')
6145
6146 # timeout (non-triggered)
6147
6148 def _testWithTimeout(self):
6149 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006150 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006151 sock = socket.create_connection(address,
6152 timeout=support.LOOPBACK_TIMEOUT)
6153 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006154 meth = self.meth_from_sock(sock)
6155 sent = meth(file)
6156 self.assertEqual(sent, self.FILESIZE)
6157
6158 def testWithTimeout(self):
6159 conn = self.accept_conn()
6160 data = self.recv_data(conn)
6161 self.assertEqual(len(data), self.FILESIZE)
6162 self.assertEqual(data, self.FILEDATA)
6163
6164 # timeout (triggered)
6165
6166 def _testWithTimeoutTriggeredSend(self):
6167 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006168 with open(os_helper.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006169 with socket.create_connection(address) as sock:
6170 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006171 meth = self.meth_from_sock(sock)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01006172 self.assertRaises(TimeoutError, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006173
6174 def testWithTimeoutTriggeredSend(self):
6175 conn = self.accept_conn()
6176 conn.recv(88192)
6177
6178 # errors
6179
6180 def _test_errors(self):
6181 pass
6182
6183 def test_errors(self):
Hai Shideb01622020-07-06 20:29:49 +08006184 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006185 with socket.socket(type=socket.SOCK_DGRAM) as s:
6186 meth = self.meth_from_sock(s)
6187 self.assertRaisesRegex(
6188 ValueError, "SOCK_STREAM", meth, file)
Hai Shideb01622020-07-06 20:29:49 +08006189 with open(os_helper.TESTFN, 'rt') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006190 with socket.socket() as s:
6191 meth = self.meth_from_sock(s)
6192 self.assertRaisesRegex(
6193 ValueError, "binary mode", meth, file)
Hai Shideb01622020-07-06 20:29:49 +08006194 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006195 with socket.socket() as s:
6196 meth = self.meth_from_sock(s)
6197 self.assertRaisesRegex(TypeError, "positive integer",
6198 meth, file, count='2')
6199 self.assertRaisesRegex(TypeError, "positive integer",
6200 meth, file, count=0.1)
6201 self.assertRaisesRegex(ValueError, "positive integer",
6202 meth, file, count=0)
6203 self.assertRaisesRegex(ValueError, "positive integer",
6204 meth, file, count=-1)
6205
6206
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006207@unittest.skipUnless(hasattr(os, "sendfile"),
6208 'os.sendfile() required for this test.')
6209class SendfileUsingSendfileTest(SendfileUsingSendTest):
6210 """
6211 Test the sendfile() implementation of socket.sendfile().
6212 """
6213 def meth_from_sock(self, sock):
6214 return getattr(sock, "_sendfile_use_sendfile")
6215
Christian Heimes48371412016-09-06 00:37:46 +02006216
6217@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006218class LinuxKernelCryptoAPI(unittest.TestCase):
6219 # tests for AF_ALG
6220 def create_alg(self, typ, name):
6221 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006222 try:
6223 sock.bind((typ, name))
6224 except FileNotFoundError as e:
6225 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006226 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006227 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006228 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006229 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006230
Victor Stinner86afc1f2017-11-30 13:58:43 +01006231 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6232 # at least on ppc64le architecture
6233 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006234 def test_sha256(self):
6235 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6236 "177a9cb410ff61f20015ad")
6237 with self.create_alg('hash', 'sha256') as algo:
6238 op, _ = algo.accept()
6239 with op:
6240 op.sendall(b"abc")
6241 self.assertEqual(op.recv(512), expected)
6242
6243 op, _ = algo.accept()
6244 with op:
6245 op.send(b'a', socket.MSG_MORE)
6246 op.send(b'b', socket.MSG_MORE)
6247 op.send(b'c', socket.MSG_MORE)
6248 op.send(b'')
6249 self.assertEqual(op.recv(512), expected)
6250
6251 def test_hmac_sha1(self):
6252 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6253 with self.create_alg('hash', 'hmac(sha1)') as algo:
6254 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6255 op, _ = algo.accept()
6256 with op:
6257 op.sendall(b"what do ya want for nothing?")
6258 self.assertEqual(op.recv(512), expected)
6259
Christian Heimese084f842016-09-11 20:11:30 +02006260 # Although it should work with 3.19 and newer the test blocks on
6261 # Ubuntu 15.10 with Kernel 4.2.0-19.
6262 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006263 def test_aes_cbc(self):
6264 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6265 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6266 msg = b"Single block msg"
6267 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6268 msglen = len(msg)
6269 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6270 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6271 op, _ = algo.accept()
6272 with op:
6273 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6274 flags=socket.MSG_MORE)
6275 op.sendall(msg)
6276 self.assertEqual(op.recv(msglen), ciphertext)
6277
6278 op, _ = algo.accept()
6279 with op:
6280 op.sendmsg_afalg([ciphertext],
6281 op=socket.ALG_OP_DECRYPT, iv=iv)
6282 self.assertEqual(op.recv(msglen), msg)
6283
6284 # long message
6285 multiplier = 1024
6286 longmsg = [msg] * multiplier
6287 op, _ = algo.accept()
6288 with op:
6289 op.sendmsg_afalg(longmsg,
6290 op=socket.ALG_OP_ENCRYPT, iv=iv)
6291 enc = op.recv(msglen * multiplier)
6292 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006293 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006294
6295 op, _ = algo.accept()
6296 with op:
6297 op.sendmsg_afalg([enc],
6298 op=socket.ALG_OP_DECRYPT, iv=iv)
6299 dec = op.recv(msglen * multiplier)
6300 self.assertEqual(len(dec), msglen * multiplier)
6301 self.assertEqual(dec, msg * multiplier)
6302
matejcik9764c152017-02-16 14:41:31 +01006303 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006304 def test_aead_aes_gcm(self):
6305 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6306 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6307 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6308 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6309 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6310 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6311
6312 taglen = len(expected_tag)
6313 assoclen = len(assoc)
6314
6315 with self.create_alg('aead', 'gcm(aes)') as algo:
6316 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6317 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6318 None, taglen)
6319
6320 # send assoc, plain and tag buffer in separate steps
6321 op, _ = algo.accept()
6322 with op:
6323 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6324 assoclen=assoclen, flags=socket.MSG_MORE)
6325 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006326 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006327 res = op.recv(assoclen + len(plain) + taglen)
6328 self.assertEqual(expected_ct, res[assoclen:-taglen])
6329 self.assertEqual(expected_tag, res[-taglen:])
6330
6331 # now with msg
6332 op, _ = algo.accept()
6333 with op:
matejcik9764c152017-02-16 14:41:31 +01006334 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006335 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6336 assoclen=assoclen)
6337 res = op.recv(assoclen + len(plain) + taglen)
6338 self.assertEqual(expected_ct, res[assoclen:-taglen])
6339 self.assertEqual(expected_tag, res[-taglen:])
6340
6341 # create anc data manually
6342 pack_uint32 = struct.Struct('I').pack
6343 op, _ = algo.accept()
6344 with op:
matejcik9764c152017-02-16 14:41:31 +01006345 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006346 op.sendmsg(
6347 [msg],
6348 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6349 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6350 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6351 )
6352 )
matejcik9764c152017-02-16 14:41:31 +01006353 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006354 self.assertEqual(expected_ct, res[assoclen:-taglen])
6355 self.assertEqual(expected_tag, res[-taglen:])
6356
6357 # decrypt and verify
6358 op, _ = algo.accept()
6359 with op:
6360 msg = assoc + expected_ct + expected_tag
6361 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6362 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006363 res = op.recv(len(msg) - taglen)
6364 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006365
Christian Heimese084f842016-09-11 20:11:30 +02006366 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006367 def test_drbg_pr_sha256(self):
6368 # deterministic random bit generator, prediction resistance, sha256
6369 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6370 extra_seed = os.urandom(32)
6371 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6372 op, _ = algo.accept()
6373 with op:
6374 rn = op.recv(32)
6375 self.assertEqual(len(rn), 32)
6376
6377 def test_sendmsg_afalg_args(self):
6378 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006379 with sock:
6380 with self.assertRaises(TypeError):
6381 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006382
Christian Heimes02b30352016-09-11 19:49:56 +02006383 with self.assertRaises(TypeError):
6384 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006385
Christian Heimes02b30352016-09-11 19:49:56 +02006386 with self.assertRaises(TypeError):
6387 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006388
Christian Heimes02b30352016-09-11 19:49:56 +02006389 with self.assertRaises(TypeError):
6390 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006391
Christian Heimes02b30352016-09-11 19:49:56 +02006392 with self.assertRaises(TypeError):
6393 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6394
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006395 def test_length_restriction(self):
6396 # bpo-35050, off-by-one error in length check
6397 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6398 self.addCleanup(sock.close)
6399
6400 # salg_type[14]
6401 with self.assertRaises(FileNotFoundError):
6402 sock.bind(("t" * 13, "name"))
6403 with self.assertRaisesRegex(ValueError, "type too long"):
6404 sock.bind(("t" * 14, "name"))
6405
6406 # salg_name[64]
6407 with self.assertRaises(FileNotFoundError):
6408 sock.bind(("type", "n" * 63))
6409 with self.assertRaisesRegex(ValueError, "name too long"):
6410 sock.bind(("type", "n" * 64))
6411
6412
animalize19e7d482018-02-27 02:10:36 +08006413@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6414class TestMSWindowsTCPFlags(unittest.TestCase):
6415 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006416 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006417 'TCP_MAXSEG',
6418 'TCP_NODELAY',
6419 # available starting with Windows 10 1607
6420 'TCP_FASTOPEN',
6421 # available starting with Windows 10 1703
6422 'TCP_KEEPCNT',
6423 # available starting with Windows 10 1709
6424 'TCP_KEEPIDLE',
6425 'TCP_KEEPINTVL'
6426 }
6427
6428 def test_new_tcp_flags(self):
6429 provided = [s for s in dir(socket) if s.startswith('TCP')]
6430 unknown = [s for s in provided if s not in self.knownTCPFlags]
6431
6432 self.assertEqual([], unknown,
6433 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006434
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006435
6436class CreateServerTest(unittest.TestCase):
6437
6438 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006439 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006440 with socket.create_server(("127.0.0.1", port)) as sock:
6441 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6442 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006443 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006444 with socket.create_server(("::1", port),
6445 family=socket.AF_INET6) as sock:
6446 self.assertEqual(sock.getsockname()[0], "::1")
6447 self.assertEqual(sock.getsockname()[1], port)
6448
6449 def test_family_and_type(self):
6450 with socket.create_server(("127.0.0.1", 0)) as sock:
6451 self.assertEqual(sock.family, socket.AF_INET)
6452 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006453 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006454 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6455 self.assertEqual(s.family, socket.AF_INET6)
6456 self.assertEqual(sock.type, socket.SOCK_STREAM)
6457
6458 def test_reuse_port(self):
6459 if not hasattr(socket, "SO_REUSEPORT"):
6460 with self.assertRaises(ValueError):
6461 socket.create_server(("localhost", 0), reuse_port=True)
6462 else:
6463 with socket.create_server(("localhost", 0)) as sock:
6464 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6465 self.assertEqual(opt, 0)
6466 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6467 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6468 self.assertNotEqual(opt, 0)
6469
6470 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6471 not hasattr(_socket, 'IPV6_V6ONLY'),
6472 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006473 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006474 def test_ipv6_only_default(self):
6475 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6476 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6477
6478 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6479 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006480 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006481 def test_dualstack_ipv6_family(self):
6482 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6483 dualstack_ipv6=True) as sock:
6484 self.assertEqual(sock.family, socket.AF_INET6)
6485
6486
6487class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006488 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006489
6490 def setUp(self):
6491 self.thread = None
6492
6493 def tearDown(self):
6494 if self.thread is not None:
6495 self.thread.join(self.timeout)
6496
6497 def echo_server(self, sock):
6498 def run(sock):
6499 with sock:
6500 conn, _ = sock.accept()
6501 with conn:
6502 event.wait(self.timeout)
6503 msg = conn.recv(1024)
6504 if not msg:
6505 return
6506 conn.sendall(msg)
6507
6508 event = threading.Event()
6509 sock.settimeout(self.timeout)
6510 self.thread = threading.Thread(target=run, args=(sock, ))
6511 self.thread.start()
6512 event.set()
6513
6514 def echo_client(self, addr, family):
6515 with socket.socket(family=family) as sock:
6516 sock.settimeout(self.timeout)
6517 sock.connect(addr)
6518 sock.sendall(b'foo')
6519 self.assertEqual(sock.recv(1024), b'foo')
6520
6521 def test_tcp4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006522 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006523 with socket.create_server(("", port)) as sock:
6524 self.echo_server(sock)
6525 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6526
Serhiy Storchaka16994912020-04-25 10:06:29 +03006527 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006528 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006529 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006530 with socket.create_server(("", port),
6531 family=socket.AF_INET6) as sock:
6532 self.echo_server(sock)
6533 self.echo_client(("::1", port), socket.AF_INET6)
6534
6535 # --- dual stack tests
6536
6537 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6538 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006539 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006540 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006541 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006542 with socket.create_server(("", port), family=socket.AF_INET6,
6543 dualstack_ipv6=True) as sock:
6544 self.echo_server(sock)
6545 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6546
6547 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6548 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006549 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006550 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006551 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006552 with socket.create_server(("", port), family=socket.AF_INET6,
6553 dualstack_ipv6=True) as sock:
6554 self.echo_server(sock)
6555 self.echo_client(("::1", port), socket.AF_INET6)
6556
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006557@requireAttrs(socket, "send_fds")
6558@requireAttrs(socket, "recv_fds")
6559@requireAttrs(socket, "AF_UNIX")
6560class SendRecvFdsTests(unittest.TestCase):
6561 def testSendAndRecvFds(self):
6562 def close_pipes(pipes):
6563 for fd1, fd2 in pipes:
6564 os.close(fd1)
6565 os.close(fd2)
6566
6567 def close_fds(fds):
6568 for fd in fds:
6569 os.close(fd)
6570
6571 # send 10 file descriptors
6572 pipes = [os.pipe() for _ in range(10)]
6573 self.addCleanup(close_pipes, pipes)
6574 fds = [rfd for rfd, wfd in pipes]
6575
6576 # use a UNIX socket pair to exchange file descriptors locally
6577 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6578 with sock1, sock2:
6579 socket.send_fds(sock1, [MSG], fds)
6580 # request more data and file descriptors than expected
6581 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6582 self.addCleanup(close_fds, fds2)
6583
6584 self.assertEqual(msg, MSG)
6585 self.assertEqual(len(fds2), len(fds))
6586 self.assertEqual(flags, 0)
6587 # don't test addr
6588
6589 # test that file descriptors are connected
6590 for index, fds in enumerate(pipes):
6591 rfd, wfd = fds
6592 os.write(wfd, str(index).encode())
6593
6594 for index, rfd in enumerate(fds2):
6595 data = os.read(rfd, 100)
6596 self.assertEqual(data, str(index).encode())
6597
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006598
Guido van Rossumb995eb72002-07-31 16:08:40 +00006599def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006600 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006601 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006602 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6603 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006604
6605 tests.extend([
6606 NonBlockingTCPTests,
6607 FileObjectClassTestCase,
6608 UnbufferedFileObjectClassTestCase,
6609 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006610 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006611 UnicodeReadFileObjectClassTestCase,
6612 UnicodeWriteFileObjectClassTestCase,
6613 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006614 NetworkConnectionNoServer,
6615 NetworkConnectionAttributesTest,
6616 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006617 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006618 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006619 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006620 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006621 tests.append(BasicSocketPairTest)
6622 tests.append(TestUnixDomain)
6623 tests.append(TestLinuxAbstractNamespace)
6624 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006625 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006626 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006627 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006628 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006629 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006630 BasicVSOCKTest,
6631 ThreadedVSOCKSocketStreamTest,
6632 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006633 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006634 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006635 CmsgMacroTests,
6636 SendmsgUDPTest,
6637 RecvmsgUDPTest,
6638 RecvmsgIntoUDPTest,
6639 SendmsgUDP6Test,
6640 RecvmsgUDP6Test,
6641 RecvmsgRFC3542AncillaryUDP6Test,
6642 RecvmsgIntoRFC3542AncillaryUDP6Test,
6643 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006644 SendmsgUDPLITETest,
6645 RecvmsgUDPLITETest,
6646 RecvmsgIntoUDPLITETest,
6647 SendmsgUDPLITE6Test,
6648 RecvmsgUDPLITE6Test,
6649 RecvmsgRFC3542AncillaryUDPLITE6Test,
6650 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6651 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006652 SendmsgTCPTest,
6653 RecvmsgTCPTest,
6654 RecvmsgIntoTCPTest,
6655 SendmsgSCTPStreamTest,
6656 RecvmsgSCTPStreamTest,
6657 RecvmsgIntoSCTPStreamTest,
6658 SendmsgUnixStreamTest,
6659 RecvmsgUnixStreamTest,
6660 RecvmsgIntoUnixStreamTest,
6661 RecvmsgSCMRightsStreamTest,
6662 RecvmsgIntoSCMRightsStreamTest,
6663 # These are slow when setitimer() is not available
6664 InterruptedRecvTimeoutTest,
6665 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006666 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006667 SendfileUsingSendTest,
6668 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006669 ])
animalize19e7d482018-02-27 02:10:36 +08006670 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006671
Hai Shie80697d2020-05-28 06:10:27 +08006672 thread_info = threading_helper.threading_setup()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006673 support.run_unittest(*tests)
Hai Shie80697d2020-05-28 06:10:27 +08006674 threading_helper.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006675
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006676
Guido van Rossum24e4af82002-06-12 19:18:08 +00006677if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006678 test_main()