blob: 3c45278748a94109cde04f40a11a7d5743b31e9c [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]
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01001124 s_bad_values = (
1125 l_bad_values +
1126 [_testcapi.INT_MIN-1, _testcapi.INT_MAX+1] +
1127 [1 << 16, _testcapi.INT_MAX]
1128 )
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001129 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001130 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001131 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001132 for k in l_good_values:
1133 socket.ntohl(k)
1134 socket.htonl(k)
1135 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001136 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001137 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001138 for k in l_bad_values:
1139 self.assertRaises(OverflowError, socket.ntohl, k)
1140 self.assertRaises(OverflowError, socket.htonl, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001141
Barry Warsaw11b91a02004-06-28 00:50:43 +00001142 def testGetServBy(self):
1143 eq = self.assertEqual
1144 # Find one service that exists, then check all the related interfaces.
1145 # I've ordered this by protocols that have both a tcp and udp
1146 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001147 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001148 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001149 # avoid the 'echo' service on this platform, as there is an
1150 # assumption breaking non-standard port/protocol entry
1151 services = ('daytime', 'qotd', 'domain')
1152 else:
1153 services = ('echo', 'daytime', 'domain')
1154 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001155 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001156 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001157 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001158 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001159 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001160 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001161 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001162 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001163 # Issue #26936: Android getservbyname() was broken before API 23.
1164 if (not hasattr(sys, 'getandroidapilevel') or
1165 sys.getandroidapilevel() >= 23):
1166 port2 = socket.getservbyname(service)
1167 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001168 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001169 try:
1170 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001171 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001172 udpport = None
1173 else:
1174 eq(udpport, port)
1175 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001176 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001177 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001178 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001179 eq(socket.getservbyport(port, 'tcp'), service)
1180 if udpport is not None:
1181 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001182 # Make sure getservbyport does not accept out of range ports.
1183 self.assertRaises(OverflowError, socket.getservbyport, -1)
1184 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001186 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001187 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001188 # The default timeout should initially be None
1189 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001190 with socket.socket() as s:
1191 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001192
1193 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001194 with socket_setdefaulttimeout(10):
1195 self.assertEqual(socket.getdefaulttimeout(), 10)
1196 with socket.socket() as sock:
1197 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001198
Victor Stinner304315d2018-11-30 13:22:44 +01001199 # Reset the default timeout to None, and see if it propagates
1200 socket.setdefaulttimeout(None)
1201 self.assertEqual(socket.getdefaulttimeout(), None)
1202 with socket.socket() as sock:
1203 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001204
1205 # Check that setting it to an invalid value raises ValueError
1206 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1207
1208 # Check that setting it to an invalid type raises TypeError
1209 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1210
Serhiy Storchaka43767632013-11-03 21:31:38 +02001211 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1212 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001213 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001214 # Test that issue1008086 and issue767150 are fixed.
1215 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001216 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1217 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001218
Serhiy Storchaka43767632013-11-03 21:31:38 +02001219 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1220 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001221 def testIPv4toString(self):
1222 from socket import inet_aton as f, inet_pton, AF_INET
1223 g = lambda a: inet_pton(AF_INET, a)
1224
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001225 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001226 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001227 )
1228
Ezio Melottib3aedd42010-11-20 19:04:17 +00001229 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1230 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1231 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1232 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1233 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001234 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001235 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001236 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001237 assertInvalid(f, '300.0.0.0')
1238 assertInvalid(f, 'a.0.0.0')
1239 assertInvalid(f, '1.2.3.4.5')
1240 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001241
Ezio Melottib3aedd42010-11-20 19:04:17 +00001242 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1243 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1244 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1245 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001246 assertInvalid(g, '0.0.0.')
1247 assertInvalid(g, '300.0.0.0')
1248 assertInvalid(g, 'a.0.0.0')
1249 assertInvalid(g, '1.2.3.4.5')
1250 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001251
Serhiy Storchaka43767632013-11-03 21:31:38 +02001252 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1253 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001254 def testIPv6toString(self):
1255 try:
1256 from socket import inet_pton, AF_INET6, has_ipv6
1257 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001258 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001259 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001260 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001261
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001262 if sys.platform == "win32":
1263 try:
1264 inet_pton(AF_INET6, '::')
1265 except OSError as e:
1266 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001267 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001268
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001269 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001270 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001271 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001272 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001273
Ezio Melottib3aedd42010-11-20 19:04:17 +00001274 self.assertEqual(b'\x00' * 16, f('::'))
1275 self.assertEqual(b'\x00' * 16, f('0::0'))
1276 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1277 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001278 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 +00001279 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1280 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001281 self.assertEqual(
1282 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1283 f('ad42:abc::127:0:254:2')
1284 )
1285 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1286 assertInvalid('0x20::')
1287 assertInvalid(':::')
1288 assertInvalid('::0::')
1289 assertInvalid('1::abc::')
1290 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001291 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001292 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001293 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001294 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001295 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001296 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001297
1298 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1299 f('::254.42.23.64')
1300 )
1301 self.assertEqual(
1302 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1303 f('42::a29b:254.42.23.64')
1304 )
1305 self.assertEqual(
1306 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1307 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1308 )
1309 assertInvalid('255.254.253.252')
1310 assertInvalid('1::260.2.3.0')
1311 assertInvalid('1::0.be.e.0')
1312 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1313 assertInvalid('::1.2.3.4:0')
1314 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001315
Serhiy Storchaka43767632013-11-03 21:31:38 +02001316 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1317 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001318 def testStringToIPv4(self):
1319 from socket import inet_ntoa as f, inet_ntop, AF_INET
1320 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001321 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001322 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001323 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001324
Ezio Melottib3aedd42010-11-20 19:04:17 +00001325 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1326 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1327 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1328 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001329 assertInvalid(f, b'\x00' * 3)
1330 assertInvalid(f, b'\x00' * 5)
1331 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001332 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001333
Ezio Melottib3aedd42010-11-20 19:04:17 +00001334 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1335 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1336 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001337 assertInvalid(g, b'\x00' * 3)
1338 assertInvalid(g, b'\x00' * 5)
1339 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001340 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001341
Serhiy Storchaka43767632013-11-03 21:31:38 +02001342 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1343 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001344 def testStringToIPv6(self):
1345 try:
1346 from socket import inet_ntop, AF_INET6, has_ipv6
1347 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001348 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001349 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001350 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001351
1352 if sys.platform == "win32":
1353 try:
1354 inet_ntop(AF_INET6, b'\x00' * 16)
1355 except OSError as e:
1356 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001357 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001358
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001359 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001360 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001361 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001362 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001363
Ezio Melottib3aedd42010-11-20 19:04:17 +00001364 self.assertEqual('::', f(b'\x00' * 16))
1365 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1366 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001367 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001368 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 +00001369 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001370 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001371
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001372 assertInvalid(b'\x12' * 15)
1373 assertInvalid(b'\x12' * 17)
1374 assertInvalid(b'\x12' * 4)
1375
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001376 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001377
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001378 def testSockName(self):
1379 # Testing getsockname()
Serhiy Storchaka16994912020-04-25 10:06:29 +03001380 port = socket_helper.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001381 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001382 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001383 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001384 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001385 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1386 # it reasonable to get the host's addr in addition to 0.0.0.0.
1387 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001388 try:
1389 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001390 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001391 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001392 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001393 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001394 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001395
1396 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001397 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001398 # We know a socket should start without reuse==0
1399 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001400 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001401 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001402 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001403
1404 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001405 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001406 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001407 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001408 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1409 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001410 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001411
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001412 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001413 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001414 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1415 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001416 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001417
Martin Panter50ab1a32016-04-11 00:38:12 +00001418 def testCloseException(self):
1419 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001420 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001421 socket.socket(fileno=sock.fileno()).close()
1422 try:
1423 sock.close()
1424 except OSError as err:
1425 # Winsock apparently raises ENOTSOCK
1426 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1427 else:
1428 self.fail("close() should raise EBADF/ENOTSOCK")
1429
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001430 def testNewAttributes(self):
1431 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001432
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001433 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1434 self.assertEqual(sock.family, socket.AF_INET)
1435 if hasattr(socket, 'SOCK_CLOEXEC'):
1436 self.assertIn(sock.type,
1437 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1438 socket.SOCK_STREAM))
1439 else:
1440 self.assertEqual(sock.type, socket.SOCK_STREAM)
1441 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001442
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001443 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001444 sock = socket.socket()
1445 self.addCleanup(sock.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001446 port = socket_helper.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001447 big_port = port + 65536
1448 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001449 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1450 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1451 # Since find_unused_port() is inherently subject to race conditions, we
1452 # call it a couple times if necessary.
1453 for i in itertools.count():
Serhiy Storchaka16994912020-04-25 10:06:29 +03001454 port = socket_helper.find_unused_port()
Charles-François Natali65708cf2014-07-25 18:44:30 +01001455 try:
1456 sock.bind((HOST, port))
1457 except OSError as e:
1458 if e.errno != errno.EADDRINUSE or i == 5:
1459 raise
1460 else:
1461 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001462
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001463 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001464 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001465 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1466 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1467 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1468 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001469 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1470 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001471 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001472 self.assertRaises(ValueError, s.ioctl, -1, None)
1473 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001474
Steve Dowerea93ac02016-06-17 12:52:18 -07001475 @unittest.skipUnless(os.name == "nt", "Windows specific")
1476 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1477 'Loopback fast path support required for this test')
1478 def test_sio_loopback_fast_path(self):
1479 s = socket.socket()
1480 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001481 try:
1482 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1483 except OSError as exc:
1484 WSAEOPNOTSUPP = 10045
1485 if exc.winerror == WSAEOPNOTSUPP:
1486 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1487 "doesn't implemented in this Windows version")
1488 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001489 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1490
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001491 def testGetaddrinfo(self):
1492 try:
1493 socket.getaddrinfo('localhost', 80)
1494 except socket.gaierror as err:
1495 if err.errno == socket.EAI_SERVICE:
1496 # see http://bugs.python.org/issue1282647
1497 self.skipTest("buggy libc version")
1498 raise
1499 # len of every sequence is supposed to be == 5
1500 for info in socket.getaddrinfo(HOST, None):
1501 self.assertEqual(len(info), 5)
1502 # host can be a domain name, a string representation of an
1503 # IPv4/v6 address or None
1504 socket.getaddrinfo('localhost', 80)
1505 socket.getaddrinfo('127.0.0.1', 80)
1506 socket.getaddrinfo(None, 80)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001507 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001508 socket.getaddrinfo('::1', 80)
1509 # port can be a string service name such as "http", a numeric
1510 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001511 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1512 if (not hasattr(sys, 'getandroidapilevel') or
1513 sys.getandroidapilevel() >= 23):
1514 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001515 socket.getaddrinfo(HOST, 80)
1516 socket.getaddrinfo(HOST, None)
1517 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001518 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1519 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001520 self.assertEqual(family, socket.AF_INET)
Ethan Furmanb7751062021-03-30 21:17:26 -07001521 self.assertEqual(str(family), 'AF_INET')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001522 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furmanb7751062021-03-30 21:17:26 -07001523 self.assertEqual(str(type), 'SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001524 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1525 for _, socktype, _, _, _ in infos:
1526 self.assertEqual(socktype, socket.SOCK_STREAM)
1527 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001528 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001529 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1530 # a server willing to support both IPv4 and IPv6 will
1531 # usually do this
1532 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1533 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001534 # test keyword arguments
1535 a = socket.getaddrinfo(HOST, None)
1536 b = socket.getaddrinfo(host=HOST, port=None)
1537 self.assertEqual(a, b)
1538 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1539 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1540 self.assertEqual(a, b)
1541 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1542 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1543 self.assertEqual(a, b)
1544 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1545 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1546 self.assertEqual(a, b)
1547 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1548 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1549 self.assertEqual(a, b)
1550 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1551 socket.AI_PASSIVE)
1552 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1553 type=socket.SOCK_STREAM, proto=0,
1554 flags=socket.AI_PASSIVE)
1555 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001556 # Issue #6697.
1557 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001558
Ned Deilyb24f4812014-02-13 22:50:42 -08001559 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001560 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001561 try:
1562 # The arguments here are undefined and the call may succeed
1563 # or fail. All we care here is that it doesn't segfault.
1564 socket.getaddrinfo("localhost", None, 0, 0, 0,
1565 socket.AI_NUMERICSERV)
1566 except socket.gaierror:
1567 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001568
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001569 def test_getnameinfo(self):
1570 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001571 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001572
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001573 @unittest.skipUnless(support.is_resource_enabled('network'),
1574 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001575 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001576 # Check for internet access before running test
1577 # (issue #12804, issue #25138).
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03001578 with socket_helper.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001579 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001580
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001581 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001582 domain = 'испытание.pythontest.net'
1583 socket.gethostbyname(domain)
1584 socket.gethostbyname_ex(domain)
1585 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001586 # 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 +00001587 # have a reverse entry yet
1588 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001589
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001590 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001591 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001592 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1593 self.skipTest("signal.alarm and socket.socketpair required for this test")
1594 # Our signal handlers clobber the C errno by calling a math function
1595 # with an invalid domain value.
1596 def ok_handler(*args):
1597 self.assertRaises(ValueError, math.acosh, 0)
1598 def raising_handler(*args):
1599 self.assertRaises(ValueError, math.acosh, 0)
1600 1 // 0
1601 c, s = socket.socketpair()
1602 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1603 try:
1604 if with_timeout:
1605 # Just above the one second minimum for signal.alarm
1606 c.settimeout(1.5)
1607 with self.assertRaises(ZeroDivisionError):
1608 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001609 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001610 if with_timeout:
1611 signal.signal(signal.SIGALRM, ok_handler)
1612 signal.alarm(1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01001613 self.assertRaises(TimeoutError, c.sendall,
Charles-François Natali5fd26422013-08-29 19:01:40 +02001614 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001615 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001616 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001617 signal.signal(signal.SIGALRM, old_alarm)
1618 c.close()
1619 s.close()
1620
1621 def test_sendall_interrupted(self):
1622 self.check_sendall_interrupted(False)
1623
1624 def test_sendall_interrupted_with_timeout(self):
1625 self.check_sendall_interrupted(True)
1626
Antoine Pitroue033e062010-10-29 10:38:18 +00001627 def test_dealloc_warn(self):
1628 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1629 r = repr(sock)
1630 with self.assertWarns(ResourceWarning) as cm:
1631 sock = None
1632 support.gc_collect()
1633 self.assertIn(r, str(cm.warning.args[0]))
1634 # An open socket file object gets dereferenced after the socket
1635 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1636 f = sock.makefile('rb')
1637 r = repr(sock)
1638 sock = None
1639 support.gc_collect()
1640 with self.assertWarns(ResourceWarning):
1641 f = None
1642 support.gc_collect()
1643
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001644 def test_name_closed_socketio(self):
1645 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1646 fp = sock.makefile("rb")
1647 fp.close()
1648 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1649
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001650 def test_unusable_closed_socketio(self):
1651 with socket.socket() as sock:
1652 fp = sock.makefile("rb", buffering=0)
1653 self.assertTrue(fp.readable())
1654 self.assertFalse(fp.writable())
1655 self.assertFalse(fp.seekable())
1656 fp.close()
1657 self.assertRaises(ValueError, fp.readable)
1658 self.assertRaises(ValueError, fp.writable)
1659 self.assertRaises(ValueError, fp.seekable)
1660
Christian Heimesd0e31b92018-01-27 09:54:13 +01001661 def test_socket_close(self):
1662 sock = socket.socket()
1663 try:
1664 sock.bind((HOST, 0))
1665 socket.close(sock.fileno())
1666 with self.assertRaises(OSError):
1667 sock.listen(1)
1668 finally:
1669 with self.assertRaises(OSError):
1670 # sock.close() fails with EBADF
1671 sock.close()
1672 with self.assertRaises(TypeError):
1673 socket.close(None)
1674 with self.assertRaises(OSError):
1675 socket.close(-1)
1676
Berker Peksag3fe64d02016-02-18 17:34:00 +02001677 def test_makefile_mode(self):
1678 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1679 with self.subTest(mode=mode):
1680 with socket.socket() as sock:
Inada Naokicfe523b2021-04-27 13:16:28 +09001681 encoding = None if "b" in mode else "utf-8"
1682 with sock.makefile(mode, encoding=encoding) as fp:
Berker Peksag3fe64d02016-02-18 17:34:00 +02001683 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')
pxinwr64c8f812020-11-29 05:48:38 +08001741 @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
Коренберг Марк7766b962018-02-13 00:47:42 +05001742 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1743 # Just pick up any network interface (Linux, Mac OS X)
1744 (ifindex, test_interface) = socket.if_nameindex()[0]
1745 ((*_, sockaddr),) = socket.getaddrinfo(
1746 'ff02::1de:c0:face:8D%' + test_interface,
1747 1234, socket.AF_INET6,
1748 socket.SOCK_DGRAM,
1749 socket.IPPROTO_UDP
1750 )
1751 # Note missing interface name part in IPv6 address
1752 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1753
Serhiy Storchaka16994912020-04-25 10:06:29 +03001754 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001755 @unittest.skipUnless(
1756 sys.platform == 'win32',
1757 'Numeric scope id does not work or undocumented')
1758 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1759 # Also works on Linux and Mac OS X, but is not documented (?)
1760 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1761 ifindex = 42
1762 ((*_, sockaddr),) = socket.getaddrinfo(
1763 'ff02::1de:c0:face:8D%' + str(ifindex),
1764 1234, socket.AF_INET6,
1765 socket.SOCK_DGRAM,
1766 socket.IPPROTO_UDP
1767 )
1768 # Note missing interface name part in IPv6 address
1769 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1770
Serhiy Storchaka16994912020-04-25 10:06:29 +03001771 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001772 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001773 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
pxinwr64c8f812020-11-29 05:48:38 +08001774 @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
Коренберг Марк7766b962018-02-13 00:47:42 +05001775 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1776 # Just pick up any network interface.
1777 (ifindex, test_interface) = socket.if_nameindex()[0]
1778 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1779 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1780 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1781
Serhiy Storchaka16994912020-04-25 10:06:29 +03001782 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001783 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001784 'Numeric scope id does not work or undocumented')
1785 def test_getnameinfo_ipv6_scopeid_numeric(self):
1786 # Also works on Linux (undocumented), but does not work on Mac OS X
1787 # Windows and Linux allow nonexistent interface numbers here.
1788 ifindex = 42
1789 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1790 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1791 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1792
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001793 def test_str_for_enums(self):
1794 # Make sure that the AF_* and SOCK_* constants have enum-like string
1795 # reprs.
1796 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
Ethan Furmanb7751062021-03-30 21:17:26 -07001797 self.assertEqual(str(s.family), 'AF_INET')
1798 self.assertEqual(str(s.type), 'SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001799
Yury Selivanov98181422017-12-18 20:02:54 -05001800 def test_socket_consistent_sock_type(self):
1801 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1802 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1803 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1804
1805 with socket.socket(socket.AF_INET, sock_type) as s:
1806 self.assertEqual(s.type, socket.SOCK_STREAM)
1807 s.settimeout(1)
1808 self.assertEqual(s.type, socket.SOCK_STREAM)
1809 s.settimeout(0)
1810 self.assertEqual(s.type, socket.SOCK_STREAM)
1811 s.setblocking(True)
1812 self.assertEqual(s.type, socket.SOCK_STREAM)
1813 s.setblocking(False)
1814 self.assertEqual(s.type, socket.SOCK_STREAM)
1815
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001816 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001817 # Test that when created with a family that's not one of the known
1818 # AF_*/SOCK_* constants, socket.family just returns the number.
1819 #
1820 # To do this we fool socket.socket into believing it already has an
1821 # open fd because on this path it doesn't actually verify the family and
1822 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001823 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1824 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001825 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1826
1827 unknown_type = max(
1828 kind
1829 for name, kind in socket.SocketKind.__members__.items()
1830 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1831 ) + 1
1832
1833 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001834 family=unknown_family, type=unknown_type, proto=23,
1835 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001836 self.assertEqual(s.family, unknown_family)
1837 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001838 # some OS like macOS ignore proto
1839 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001840
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001841 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1842 def test__sendfile_use_sendfile(self):
1843 class File:
1844 def __init__(self, fd):
1845 self.fd = fd
1846
1847 def fileno(self):
1848 return self.fd
1849 with socket.socket() as sock:
1850 fd = os.open(os.curdir, os.O_RDONLY)
1851 os.close(fd)
1852 with self.assertRaises(socket._GiveupOnSendfile):
1853 sock._sendfile_use_sendfile(File(fd))
1854 with self.assertRaises(OverflowError):
1855 sock._sendfile_use_sendfile(File(2**1000))
1856 with self.assertRaises(TypeError):
1857 sock._sendfile_use_sendfile(File(None))
1858
Christian Heimesb6e43af2018-01-29 22:37:58 +01001859 def _test_socket_fileno(self, s, family, stype):
1860 self.assertEqual(s.family, family)
1861 self.assertEqual(s.type, stype)
1862
1863 fd = s.fileno()
1864 s2 = socket.socket(fileno=fd)
1865 self.addCleanup(s2.close)
1866 # detach old fd to avoid double close
1867 s.detach()
1868 self.assertEqual(s2.family, family)
1869 self.assertEqual(s2.type, stype)
1870 self.assertEqual(s2.fileno(), fd)
1871
1872 def test_socket_fileno(self):
1873 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1874 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001875 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001876 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1877
1878 if hasattr(socket, "SOCK_DGRAM"):
1879 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1880 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001881 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001882 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1883
Serhiy Storchaka16994912020-04-25 10:06:29 +03001884 if socket_helper.IPV6_ENABLED:
Christian Heimesb6e43af2018-01-29 22:37:58 +01001885 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1886 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001887 s.bind((socket_helper.HOSTv6, 0, 0, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001888 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1889
1890 if hasattr(socket, "AF_UNIX"):
1891 tmpdir = tempfile.mkdtemp()
1892 self.addCleanup(shutil.rmtree, tmpdir)
1893 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1894 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001895 try:
1896 s.bind(os.path.join(tmpdir, 'socket'))
1897 except PermissionError:
1898 pass
1899 else:
1900 self._test_socket_fileno(s, socket.AF_UNIX,
1901 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001902
Dima Tisneke9912702018-12-17 22:07:55 +09001903 def test_socket_fileno_rejects_float(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001904 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001905 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1906
1907 def test_socket_fileno_rejects_other_types(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001908 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001909 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1910
1911 def test_socket_fileno_rejects_invalid_socket(self):
1912 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1913 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1914
1915 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1916 def test_socket_fileno_rejects_negative(self):
1917 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1918 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1919
1920 def test_socket_fileno_requires_valid_fd(self):
1921 WSAENOTSOCK = 10038
1922 with self.assertRaises(OSError) as cm:
Hai Shideb01622020-07-06 20:29:49 +08001923 socket.socket(fileno=os_helper.make_bad_fd())
Dima Tisneke9912702018-12-17 22:07:55 +09001924 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1925
1926 with self.assertRaises(OSError) as cm:
1927 socket.socket(
1928 socket.AF_INET,
1929 socket.SOCK_STREAM,
Hai Shideb01622020-07-06 20:29:49 +08001930 fileno=os_helper.make_bad_fd())
Dima Tisneke9912702018-12-17 22:07:55 +09001931 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1932
1933 def test_socket_fileno_requires_socket_fd(self):
1934 with tempfile.NamedTemporaryFile() as afile:
1935 with self.assertRaises(OSError):
1936 socket.socket(fileno=afile.fileno())
1937
1938 with self.assertRaises(OSError) as cm:
1939 socket.socket(
1940 socket.AF_INET,
1941 socket.SOCK_STREAM,
1942 fileno=afile.fileno())
1943 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1944
Ethan Furmana02cb472021-04-21 10:20:44 -07001945 def test_addressfamily_enum(self):
1946 import _socket, enum
1947 CheckedAddressFamily = enum._old_convert_(
1948 enum.IntEnum, 'AddressFamily', 'socket',
1949 lambda C: C.isupper() and C.startswith('AF_'),
1950 source=_socket,
1951 )
1952 enum._test_simple_enum(CheckedAddressFamily, socket.AddressFamily)
1953
1954 def test_socketkind_enum(self):
1955 import _socket, enum
1956 CheckedSocketKind = enum._old_convert_(
1957 enum.IntEnum, 'SocketKind', 'socket',
1958 lambda C: C.isupper() and C.startswith('SOCK_'),
1959 source=_socket,
1960 )
1961 enum._test_simple_enum(CheckedSocketKind, socket.SocketKind)
1962
1963 def test_msgflag_enum(self):
1964 import _socket, enum
1965 CheckedMsgFlag = enum._old_convert_(
1966 enum.IntFlag, 'MsgFlag', 'socket',
1967 lambda C: C.isupper() and C.startswith('MSG_'),
1968 source=_socket,
1969 )
1970 enum._test_simple_enum(CheckedMsgFlag, socket.MsgFlag)
1971
1972 def test_addressinfo_enum(self):
1973 import _socket, enum
1974 CheckedAddressInfo = enum._old_convert_(
1975 enum.IntFlag, 'AddressInfo', 'socket',
1976 lambda C: C.isupper() and C.startswith('AI_'),
1977 source=_socket)
1978 enum._test_simple_enum(CheckedAddressInfo, socket.AddressInfo)
1979
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001980
Charles-François Natali47413c12011-10-06 19:47:44 +02001981@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1982class BasicCANTest(unittest.TestCase):
1983
1984 def testCrucialConstants(self):
1985 socket.AF_CAN
1986 socket.PF_CAN
1987 socket.CAN_RAW
1988
Charles-François Natali773e42d2013-02-05 19:42:01 +01001989 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1990 'socket.CAN_BCM required for this test.')
1991 def testBCMConstants(self):
1992 socket.CAN_BCM
1993
1994 # opcodes
1995 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1996 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1997 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1998 socket.CAN_BCM_TX_SEND # send one CAN frame
1999 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
2000 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
2001 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
2002 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
2003 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
2004 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
2005 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
2006 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
2007
karl ding31c4fd22019-07-31 01:47:16 -07002008 # flags
2009 socket.CAN_BCM_SETTIMER
2010 socket.CAN_BCM_STARTTIMER
2011 socket.CAN_BCM_TX_COUNTEVT
2012 socket.CAN_BCM_TX_ANNOUNCE
2013 socket.CAN_BCM_TX_CP_CAN_ID
2014 socket.CAN_BCM_RX_FILTER_ID
2015 socket.CAN_BCM_RX_CHECK_DLC
2016 socket.CAN_BCM_RX_NO_AUTOTIMER
2017 socket.CAN_BCM_RX_ANNOUNCE_RESUME
2018 socket.CAN_BCM_TX_RESET_MULTI_IDX
2019 socket.CAN_BCM_RX_RTR_FRAME
2020
Charles-François Natali47413c12011-10-06 19:47:44 +02002021 def testCreateSocket(self):
2022 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2023 pass
2024
Charles-François Natali773e42d2013-02-05 19:42:01 +01002025 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2026 'socket.CAN_BCM required for this test.')
2027 def testCreateBCMSocket(self):
2028 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
2029 pass
2030
Charles-François Natali47413c12011-10-06 19:47:44 +02002031 def testBindAny(self):
2032 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04002033 address = ('', )
2034 s.bind(address)
2035 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02002036
2037 def testTooLongInterfaceName(self):
2038 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2039 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002040 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02002041 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02002042
2043 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
2044 'socket.CAN_RAW_LOOPBACK required for this test.')
2045 def testLoopback(self):
2046 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2047 for loopback in (0, 1):
2048 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
2049 loopback)
2050 self.assertEqual(loopback,
2051 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
2052
2053 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
2054 'socket.CAN_RAW_FILTER required for this test.')
2055 def testFilter(self):
2056 can_id, can_mask = 0x200, 0x700
2057 can_filter = struct.pack("=II", can_id, can_mask)
2058 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2059 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
2060 self.assertEqual(can_filter,
2061 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002062 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02002063
2064
2065@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02002066class CANTest(ThreadedCANSocketTest):
2067
Charles-François Natali47413c12011-10-06 19:47:44 +02002068 def __init__(self, methodName='runTest'):
2069 ThreadedCANSocketTest.__init__(self, methodName=methodName)
2070
2071 @classmethod
2072 def build_can_frame(cls, can_id, data):
2073 """Build a CAN frame."""
2074 can_dlc = len(data)
2075 data = data.ljust(8, b'\x00')
2076 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2077
2078 @classmethod
2079 def dissect_can_frame(cls, frame):
2080 """Dissect a CAN frame."""
2081 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2082 return (can_id, can_dlc, data[:can_dlc])
2083
2084 def testSendFrame(self):
2085 cf, addr = self.s.recvfrom(self.bufsize)
2086 self.assertEqual(self.cf, cf)
2087 self.assertEqual(addr[0], self.interface)
2088 self.assertEqual(addr[1], socket.AF_CAN)
2089
2090 def _testSendFrame(self):
2091 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2092 self.cli.send(self.cf)
2093
2094 def testSendMaxFrame(self):
2095 cf, addr = self.s.recvfrom(self.bufsize)
2096 self.assertEqual(self.cf, cf)
2097
2098 def _testSendMaxFrame(self):
2099 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2100 self.cli.send(self.cf)
2101
2102 def testSendMultiFrames(self):
2103 cf, addr = self.s.recvfrom(self.bufsize)
2104 self.assertEqual(self.cf1, cf)
2105
2106 cf, addr = self.s.recvfrom(self.bufsize)
2107 self.assertEqual(self.cf2, cf)
2108
2109 def _testSendMultiFrames(self):
2110 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2111 self.cli.send(self.cf1)
2112
2113 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2114 self.cli.send(self.cf2)
2115
Charles-François Natali773e42d2013-02-05 19:42:01 +01002116 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2117 'socket.CAN_BCM required for this test.')
2118 def _testBCM(self):
2119 cf, addr = self.cli.recvfrom(self.bufsize)
2120 self.assertEqual(self.cf, cf)
2121 can_id, can_dlc, data = self.dissect_can_frame(cf)
2122 self.assertEqual(self.can_id, can_id)
2123 self.assertEqual(self.data, data)
2124
2125 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2126 'socket.CAN_BCM required for this test.')
2127 def testBCM(self):
2128 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2129 self.addCleanup(bcm.close)
2130 bcm.connect((self.interface,))
2131 self.can_id = 0x123
2132 self.data = bytes([0xc0, 0xff, 0xee])
2133 self.cf = self.build_can_frame(self.can_id, self.data)
2134 opcode = socket.CAN_BCM_TX_SEND
2135 flags = 0
2136 count = 0
2137 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2138 bcm_can_id = 0x0222
2139 nframes = 1
2140 assert len(self.cf) == 16
2141 header = struct.pack(self.bcm_cmd_msg_fmt,
2142 opcode,
2143 flags,
2144 count,
2145 ival1_seconds,
2146 ival1_usec,
2147 ival2_seconds,
2148 ival2_usec,
2149 bcm_can_id,
2150 nframes,
2151 )
2152 header_plus_frame = header + self.cf
2153 bytes_sent = bcm.send(header_plus_frame)
2154 self.assertEqual(bytes_sent, len(header_plus_frame))
2155
Charles-François Natali47413c12011-10-06 19:47:44 +02002156
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002157@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2158class ISOTPTest(unittest.TestCase):
2159
2160 def __init__(self, *args, **kwargs):
2161 super().__init__(*args, **kwargs)
2162 self.interface = "vcan0"
2163
2164 def testCrucialConstants(self):
2165 socket.AF_CAN
2166 socket.PF_CAN
2167 socket.CAN_ISOTP
2168 socket.SOCK_DGRAM
2169
2170 def testCreateSocket(self):
2171 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2172 pass
2173
2174 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2175 'socket.CAN_ISOTP required for this test.')
2176 def testCreateISOTPSocket(self):
2177 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2178 pass
2179
2180 def testTooLongInterfaceName(self):
2181 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2182 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2183 with self.assertRaisesRegex(OSError, 'interface name too long'):
2184 s.bind(('x' * 1024, 1, 2))
2185
2186 def testBind(self):
2187 try:
2188 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2189 addr = self.interface, 0x123, 0x456
2190 s.bind(addr)
2191 self.assertEqual(s.getsockname(), addr)
2192 except OSError as e:
2193 if e.errno == errno.ENODEV:
2194 self.skipTest('network interface `%s` does not exist' %
2195 self.interface)
2196 else:
2197 raise
2198
2199
karl ding360371f2020-04-29 15:31:19 -07002200@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2201class J1939Test(unittest.TestCase):
2202
2203 def __init__(self, *args, **kwargs):
2204 super().__init__(*args, **kwargs)
2205 self.interface = "vcan0"
2206
2207 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2208 'socket.CAN_J1939 required for this test.')
2209 def testJ1939Constants(self):
2210 socket.CAN_J1939
2211
2212 socket.J1939_MAX_UNICAST_ADDR
2213 socket.J1939_IDLE_ADDR
2214 socket.J1939_NO_ADDR
2215 socket.J1939_NO_NAME
2216 socket.J1939_PGN_REQUEST
2217 socket.J1939_PGN_ADDRESS_CLAIMED
2218 socket.J1939_PGN_ADDRESS_COMMANDED
2219 socket.J1939_PGN_PDU1_MAX
2220 socket.J1939_PGN_MAX
2221 socket.J1939_NO_PGN
2222
2223 # J1939 socket options
2224 socket.SO_J1939_FILTER
2225 socket.SO_J1939_PROMISC
2226 socket.SO_J1939_SEND_PRIO
2227 socket.SO_J1939_ERRQUEUE
2228
2229 socket.SCM_J1939_DEST_ADDR
2230 socket.SCM_J1939_DEST_NAME
2231 socket.SCM_J1939_PRIO
2232 socket.SCM_J1939_ERRQUEUE
2233
2234 socket.J1939_NLA_PAD
2235 socket.J1939_NLA_BYTES_ACKED
2236
2237 socket.J1939_EE_INFO_NONE
2238 socket.J1939_EE_INFO_TX_ABORT
2239
2240 socket.J1939_FILTER_MAX
2241
2242 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2243 'socket.CAN_J1939 required for this test.')
2244 def testCreateJ1939Socket(self):
2245 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2246 pass
2247
2248 def testBind(self):
2249 try:
2250 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2251 addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2252 s.bind(addr)
2253 self.assertEqual(s.getsockname(), addr)
2254 except OSError as e:
2255 if e.errno == errno.ENODEV:
2256 self.skipTest('network interface `%s` does not exist' %
2257 self.interface)
2258 else:
2259 raise
2260
2261
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002262@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2263class BasicRDSTest(unittest.TestCase):
2264
2265 def testCrucialConstants(self):
2266 socket.AF_RDS
2267 socket.PF_RDS
2268
2269 def testCreateSocket(self):
2270 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2271 pass
2272
2273 def testSocketBufferSize(self):
2274 bufsize = 16384
2275 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2276 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2277 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2278
2279
2280@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002281class RDSTest(ThreadedRDSSocketTest):
2282
2283 def __init__(self, methodName='runTest'):
2284 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2285
Charles-François Natali240c55f2011-11-10 20:33:36 +01002286 def setUp(self):
2287 super().setUp()
2288 self.evt = threading.Event()
2289
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002290 def testSendAndRecv(self):
2291 data, addr = self.serv.recvfrom(self.bufsize)
2292 self.assertEqual(self.data, data)
2293 self.assertEqual(self.cli_addr, addr)
2294
2295 def _testSendAndRecv(self):
2296 self.data = b'spam'
2297 self.cli.sendto(self.data, 0, (HOST, self.port))
2298
2299 def testPeek(self):
2300 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2301 self.assertEqual(self.data, data)
2302 data, addr = self.serv.recvfrom(self.bufsize)
2303 self.assertEqual(self.data, data)
2304
2305 def _testPeek(self):
2306 self.data = b'spam'
2307 self.cli.sendto(self.data, 0, (HOST, self.port))
2308
2309 @requireAttrs(socket.socket, 'recvmsg')
2310 def testSendAndRecvMsg(self):
2311 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2312 self.assertEqual(self.data, data)
2313
2314 @requireAttrs(socket.socket, 'sendmsg')
2315 def _testSendAndRecvMsg(self):
2316 self.data = b'hello ' * 10
2317 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2318
2319 def testSendAndRecvMulti(self):
2320 data, addr = self.serv.recvfrom(self.bufsize)
2321 self.assertEqual(self.data1, data)
2322
2323 data, addr = self.serv.recvfrom(self.bufsize)
2324 self.assertEqual(self.data2, data)
2325
2326 def _testSendAndRecvMulti(self):
2327 self.data1 = b'bacon'
2328 self.cli.sendto(self.data1, 0, (HOST, self.port))
2329
2330 self.data2 = b'egg'
2331 self.cli.sendto(self.data2, 0, (HOST, self.port))
2332
2333 def testSelect(self):
2334 r, w, x = select.select([self.serv], [], [], 3.0)
2335 self.assertIn(self.serv, r)
2336 data, addr = self.serv.recvfrom(self.bufsize)
2337 self.assertEqual(self.data, data)
2338
2339 def _testSelect(self):
2340 self.data = b'select'
2341 self.cli.sendto(self.data, 0, (HOST, self.port))
2342
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002343@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2344 'QIPCRTR sockets required for this test.')
2345class BasicQIPCRTRTest(unittest.TestCase):
2346
2347 def testCrucialConstants(self):
2348 socket.AF_QIPCRTR
2349
2350 def testCreateSocket(self):
2351 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2352 pass
2353
2354 def testUnbound(self):
2355 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2356 self.assertEqual(s.getsockname()[1], 0)
2357
2358 def testBindSock(self):
2359 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002360 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002361 self.assertNotEqual(s.getsockname()[1], 0)
2362
2363 def testInvalidBindSock(self):
2364 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002365 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002366
2367 def testAutoBindSock(self):
2368 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2369 s.connect((123, 123))
2370 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002371
caaveryeffc12f2017-09-06 18:18:10 -04002372@unittest.skipIf(fcntl is None, "need fcntl")
2373@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2374 'VSOCK sockets required for this test.')
2375class BasicVSOCKTest(unittest.TestCase):
2376
2377 def testCrucialConstants(self):
2378 socket.AF_VSOCK
2379
2380 def testVSOCKConstants(self):
2381 socket.SO_VM_SOCKETS_BUFFER_SIZE
2382 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2383 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2384 socket.VMADDR_CID_ANY
2385 socket.VMADDR_PORT_ANY
2386 socket.VMADDR_CID_HOST
2387 socket.VM_SOCKETS_INVALID_VERSION
2388 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2389
2390 def testCreateSocket(self):
2391 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2392 pass
2393
2394 def testSocketBufferSize(self):
2395 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2396 orig_max = s.getsockopt(socket.AF_VSOCK,
2397 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2398 orig = s.getsockopt(socket.AF_VSOCK,
2399 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2400 orig_min = s.getsockopt(socket.AF_VSOCK,
2401 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2402
2403 s.setsockopt(socket.AF_VSOCK,
2404 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2405 s.setsockopt(socket.AF_VSOCK,
2406 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2407 s.setsockopt(socket.AF_VSOCK,
2408 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2409
2410 self.assertEqual(orig_max * 2,
2411 s.getsockopt(socket.AF_VSOCK,
2412 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2413 self.assertEqual(orig * 2,
2414 s.getsockopt(socket.AF_VSOCK,
2415 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2416 self.assertEqual(orig_min * 2,
2417 s.getsockopt(socket.AF_VSOCK,
2418 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2419
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002420
Greg Bowser8fbece12019-08-02 16:29:52 -04002421@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2422 'Bluetooth sockets required for this test.')
2423class BasicBluetoothTest(unittest.TestCase):
2424
2425 def testBluetoothConstants(self):
2426 socket.BDADDR_ANY
2427 socket.BDADDR_LOCAL
2428 socket.AF_BLUETOOTH
2429 socket.BTPROTO_RFCOMM
2430
2431 if sys.platform != "win32":
2432 socket.BTPROTO_HCI
2433 socket.SOL_HCI
2434 socket.BTPROTO_L2CAP
2435
2436 if not sys.platform.startswith("freebsd"):
2437 socket.BTPROTO_SCO
2438
2439 def testCreateRfcommSocket(self):
2440 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2441 pass
2442
2443 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2444 def testCreateL2capSocket(self):
2445 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2446 pass
2447
2448 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2449 def testCreateHciSocket(self):
2450 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2451 pass
2452
2453 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2454 "windows and freebsd do not support SCO sockets")
2455 def testCreateScoSocket(self):
2456 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2457 pass
2458
2459
Guido van Rossum24e4af82002-06-12 19:18:08 +00002460class BasicTCPTest(SocketConnectedTest):
2461
2462 def __init__(self, methodName='runTest'):
2463 SocketConnectedTest.__init__(self, methodName=methodName)
2464
2465 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002466 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002467 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002468 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002469
2470 def _testRecv(self):
2471 self.serv_conn.send(MSG)
2472
2473 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002474 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002475 seg1 = self.cli_conn.recv(len(MSG) - 3)
2476 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002477 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002478 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002479
2480 def _testOverFlowRecv(self):
2481 self.serv_conn.send(MSG)
2482
2483 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002484 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002485 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002486 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002487
2488 def _testRecvFrom(self):
2489 self.serv_conn.send(MSG)
2490
2491 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002492 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002493 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2494 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002495 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002496 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002497
2498 def _testOverFlowRecvFrom(self):
2499 self.serv_conn.send(MSG)
2500
2501 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002502 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002503 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002504 while 1:
2505 read = self.cli_conn.recv(1024)
2506 if not read:
2507 break
Guido van Rossume531e292002-08-08 20:28:34 +00002508 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002509 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002510
2511 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002512 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002513 self.serv_conn.sendall(big_chunk)
2514
2515 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002516 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002517 fd = self.cli_conn.fileno()
2518 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002519 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002520 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002521 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002522 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002523
2524 def _testFromFd(self):
2525 self.serv_conn.send(MSG)
2526
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002527 def testDup(self):
2528 # Testing dup()
2529 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002530 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002531 msg = sock.recv(1024)
2532 self.assertEqual(msg, MSG)
2533
2534 def _testDup(self):
2535 self.serv_conn.send(MSG)
2536
Guido van Rossum24e4af82002-06-12 19:18:08 +00002537 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002538 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002539 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002540 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002541 # wait for _testShutdown to finish: on OS X, when the server
2542 # closes the connection the client also becomes disconnected,
2543 # and the client's shutdown call will fail. (Issue #4397.)
2544 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002545
2546 def _testShutdown(self):
2547 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002548 self.serv_conn.shutdown(2)
2549
2550 testShutdown_overflow = support.cpython_only(testShutdown)
2551
2552 @support.cpython_only
2553 def _testShutdown_overflow(self):
2554 import _testcapi
2555 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002556 # Issue 15989
2557 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2558 _testcapi.INT_MAX + 1)
2559 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2560 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002561 self.serv_conn.shutdown(2)
2562
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002563 def testDetach(self):
2564 # Testing detach()
2565 fileno = self.cli_conn.fileno()
2566 f = self.cli_conn.detach()
2567 self.assertEqual(f, fileno)
2568 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002569 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002570 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002571 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002572 # ...but we can create another socket using the (still open)
2573 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002574 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002575 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002576 msg = sock.recv(1024)
2577 self.assertEqual(msg, MSG)
2578
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002579 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002580 self.serv_conn.send(MSG)
2581
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002582
Guido van Rossum24e4af82002-06-12 19:18:08 +00002583class BasicUDPTest(ThreadedUDPSocketTest):
2584
2585 def __init__(self, methodName='runTest'):
2586 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2587
2588 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002589 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002590 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002591 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002592
2593 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002594 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002595
Guido van Rossum1c938012002-06-12 21:17:20 +00002596 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002597 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002598 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002599 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002600
Guido van Rossum1c938012002-06-12 21:17:20 +00002601 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002602 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002603
Guido van Rossumd8faa362007-04-27 19:54:29 +00002604 def testRecvFromNegative(self):
2605 # Negative lengths passed to recvfrom should give ValueError.
2606 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2607
2608 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002609 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002610
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002611
2612@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2613 'UDPLITE sockets required for this test.')
2614class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2615
2616 def __init__(self, methodName='runTest'):
2617 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2618
2619 def testSendtoAndRecv(self):
2620 # Testing sendto() and Recv() over UDPLITE
2621 msg = self.serv.recv(len(MSG))
2622 self.assertEqual(msg, MSG)
2623
2624 def _testSendtoAndRecv(self):
2625 self.cli.sendto(MSG, 0, (HOST, self.port))
2626
2627 def testRecvFrom(self):
2628 # Testing recvfrom() over UDPLITE
2629 msg, addr = self.serv.recvfrom(len(MSG))
2630 self.assertEqual(msg, MSG)
2631
2632 def _testRecvFrom(self):
2633 self.cli.sendto(MSG, 0, (HOST, self.port))
2634
2635 def testRecvFromNegative(self):
2636 # Negative lengths passed to recvfrom should give ValueError.
2637 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2638
2639 def _testRecvFromNegative(self):
2640 self.cli.sendto(MSG, 0, (HOST, self.port))
2641
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002642# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2643# same test code is used with different families and types of socket
2644# (e.g. stream, datagram), and tests using recvmsg() are repeated
2645# using recvmsg_into().
2646#
2647# The generic test classes such as SendmsgTests and
2648# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2649# supplied with sockets cli_sock and serv_sock representing the
2650# client's and the server's end of the connection respectively, and
2651# attributes cli_addr and serv_addr holding their (numeric where
2652# appropriate) addresses.
2653#
2654# The final concrete test classes combine these with subclasses of
2655# SocketTestBase which set up client and server sockets of a specific
2656# type, and with subclasses of SendrecvmsgBase such as
2657# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2658# sockets to cli_sock and serv_sock and override the methods and
2659# attributes of SendrecvmsgBase to fill in destination addresses if
2660# needed when sending, check for specific flags in msg_flags, etc.
2661#
2662# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2663# recvmsg_into().
2664
2665# XXX: like the other datagram (UDP) tests in this module, the code
2666# here assumes that datagram delivery on the local machine will be
2667# reliable.
2668
2669class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2670 # Base class for sendmsg()/recvmsg() tests.
2671
2672 # Time in seconds to wait before considering a test failed, or
2673 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002674 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002675
2676 def setUp(self):
2677 self.misc_event = threading.Event()
2678 super().setUp()
2679
2680 def sendToServer(self, msg):
2681 # Send msg to the server.
2682 return self.cli_sock.send(msg)
2683
2684 # Tuple of alternative default arguments for sendmsg() when called
2685 # via sendmsgToServer() (e.g. to include a destination address).
2686 sendmsg_to_server_defaults = ()
2687
2688 def sendmsgToServer(self, *args):
2689 # Call sendmsg() on self.cli_sock with the given arguments,
2690 # filling in any arguments which are not supplied with the
2691 # corresponding items of self.sendmsg_to_server_defaults, if
2692 # any.
2693 return self.cli_sock.sendmsg(
2694 *(args + self.sendmsg_to_server_defaults[len(args):]))
2695
2696 def doRecvmsg(self, sock, bufsize, *args):
2697 # Call recvmsg() on sock with given arguments and return its
2698 # result. Should be used for tests which can use either
2699 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2700 # this method with one which emulates it using recvmsg_into(),
2701 # thus allowing the same test to be used for both methods.
2702 result = sock.recvmsg(bufsize, *args)
2703 self.registerRecvmsgResult(result)
2704 return result
2705
2706 def registerRecvmsgResult(self, result):
2707 # Called by doRecvmsg() with the return value of recvmsg() or
2708 # recvmsg_into(). Can be overridden to arrange cleanup based
2709 # on the returned ancillary data, for instance.
2710 pass
2711
2712 def checkRecvmsgAddress(self, addr1, addr2):
2713 # Called to compare the received address with the address of
2714 # the peer.
2715 self.assertEqual(addr1, addr2)
2716
2717 # Flags that are normally unset in msg_flags
2718 msg_flags_common_unset = 0
2719 for name in ("MSG_CTRUNC", "MSG_OOB"):
2720 msg_flags_common_unset |= getattr(socket, name, 0)
2721
2722 # Flags that are normally set
2723 msg_flags_common_set = 0
2724
2725 # Flags set when a complete record has been received (e.g. MSG_EOR
2726 # for SCTP)
2727 msg_flags_eor_indicator = 0
2728
2729 # Flags set when a complete record has not been received
2730 # (e.g. MSG_TRUNC for datagram sockets)
2731 msg_flags_non_eor_indicator = 0
2732
2733 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2734 # Method to check the value of msg_flags returned by recvmsg[_into]().
2735 #
2736 # Checks that all bits in msg_flags_common_set attribute are
2737 # set in "flags" and all bits in msg_flags_common_unset are
2738 # unset.
2739 #
2740 # The "eor" argument specifies whether the flags should
2741 # indicate that a full record (or datagram) has been received.
2742 # If "eor" is None, no checks are done; otherwise, checks
2743 # that:
2744 #
2745 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2746 # set and all bits in msg_flags_non_eor_indicator are unset
2747 #
2748 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2749 # are set and all bits in msg_flags_eor_indicator are unset
2750 #
2751 # If "checkset" and/or "checkunset" are supplied, they require
2752 # the given bits to be set or unset respectively, overriding
2753 # what the attributes require for those bits.
2754 #
2755 # If any bits are set in "ignore", they will not be checked,
2756 # regardless of the other inputs.
2757 #
2758 # Will raise Exception if the inputs require a bit to be both
2759 # set and unset, and it is not ignored.
2760
2761 defaultset = self.msg_flags_common_set
2762 defaultunset = self.msg_flags_common_unset
2763
2764 if eor:
2765 defaultset |= self.msg_flags_eor_indicator
2766 defaultunset |= self.msg_flags_non_eor_indicator
2767 elif eor is not None:
2768 defaultset |= self.msg_flags_non_eor_indicator
2769 defaultunset |= self.msg_flags_eor_indicator
2770
2771 # Function arguments override defaults
2772 defaultset &= ~checkunset
2773 defaultunset &= ~checkset
2774
2775 # Merge arguments with remaining defaults, and check for conflicts
2776 checkset |= defaultset
2777 checkunset |= defaultunset
2778 inboth = checkset & checkunset & ~ignore
2779 if inboth:
2780 raise Exception("contradictory set, unset requirements for flags "
2781 "{0:#x}".format(inboth))
2782
2783 # Compare with given msg_flags value
2784 mask = (checkset | checkunset) & ~ignore
2785 self.assertEqual(flags & mask, checkset & mask)
2786
2787
2788class RecvmsgIntoMixin(SendrecvmsgBase):
2789 # Mixin to implement doRecvmsg() using recvmsg_into().
2790
2791 def doRecvmsg(self, sock, bufsize, *args):
2792 buf = bytearray(bufsize)
2793 result = sock.recvmsg_into([buf], *args)
2794 self.registerRecvmsgResult(result)
2795 self.assertGreaterEqual(result[0], 0)
2796 self.assertLessEqual(result[0], bufsize)
2797 return (bytes(buf[:result[0]]),) + result[1:]
2798
2799
2800class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2801 # Defines flags to be checked in msg_flags for datagram sockets.
2802
2803 @property
2804 def msg_flags_non_eor_indicator(self):
2805 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2806
2807
2808class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2809 # Defines flags to be checked in msg_flags for SCTP sockets.
2810
2811 @property
2812 def msg_flags_eor_indicator(self):
2813 return super().msg_flags_eor_indicator | socket.MSG_EOR
2814
2815
2816class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2817 # Base class for tests on connectionless-mode sockets. Users must
2818 # supply sockets on attributes cli and serv to be mapped to
2819 # cli_sock and serv_sock respectively.
2820
2821 @property
2822 def serv_sock(self):
2823 return self.serv
2824
2825 @property
2826 def cli_sock(self):
2827 return self.cli
2828
2829 @property
2830 def sendmsg_to_server_defaults(self):
2831 return ([], [], 0, self.serv_addr)
2832
2833 def sendToServer(self, msg):
2834 return self.cli_sock.sendto(msg, self.serv_addr)
2835
2836
2837class SendrecvmsgConnectedBase(SendrecvmsgBase):
2838 # Base class for tests on connected sockets. Users must supply
2839 # sockets on attributes serv_conn and cli_conn (representing the
2840 # connections *to* the server and the client), to be mapped to
2841 # cli_sock and serv_sock respectively.
2842
2843 @property
2844 def serv_sock(self):
2845 return self.cli_conn
2846
2847 @property
2848 def cli_sock(self):
2849 return self.serv_conn
2850
2851 def checkRecvmsgAddress(self, addr1, addr2):
2852 # Address is currently "unspecified" for a connected socket,
2853 # so we don't examine it
2854 pass
2855
2856
2857class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2858 # Base class to set a timeout on server's socket.
2859
2860 def setUp(self):
2861 super().setUp()
2862 self.serv_sock.settimeout(self.fail_timeout)
2863
2864
2865class SendmsgTests(SendrecvmsgServerTimeoutBase):
2866 # Tests for sendmsg() which can use any socket type and do not
2867 # involve recvmsg() or recvmsg_into().
2868
2869 def testSendmsg(self):
2870 # Send a simple message with sendmsg().
2871 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2872
2873 def _testSendmsg(self):
2874 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2875
2876 def testSendmsgDataGenerator(self):
2877 # Send from buffer obtained from a generator (not a sequence).
2878 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2879
2880 def _testSendmsgDataGenerator(self):
2881 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2882 len(MSG))
2883
2884 def testSendmsgAncillaryGenerator(self):
2885 # Gather (empty) ancillary data from a generator.
2886 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2887
2888 def _testSendmsgAncillaryGenerator(self):
2889 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2890 len(MSG))
2891
2892 def testSendmsgArray(self):
2893 # Send data from an array instead of the usual bytes object.
2894 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2895
2896 def _testSendmsgArray(self):
2897 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2898 len(MSG))
2899
2900 def testSendmsgGather(self):
2901 # Send message data from more than one buffer (gather write).
2902 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2903
2904 def _testSendmsgGather(self):
2905 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2906
2907 def testSendmsgBadArgs(self):
2908 # Check that sendmsg() rejects invalid arguments.
2909 self.assertEqual(self.serv_sock.recv(1000), b"done")
2910
2911 def _testSendmsgBadArgs(self):
2912 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2913 self.assertRaises(TypeError, self.sendmsgToServer,
2914 b"not in an iterable")
2915 self.assertRaises(TypeError, self.sendmsgToServer,
2916 object())
2917 self.assertRaises(TypeError, self.sendmsgToServer,
2918 [object()])
2919 self.assertRaises(TypeError, self.sendmsgToServer,
2920 [MSG, object()])
2921 self.assertRaises(TypeError, self.sendmsgToServer,
2922 [MSG], object())
2923 self.assertRaises(TypeError, self.sendmsgToServer,
2924 [MSG], [], object())
2925 self.assertRaises(TypeError, self.sendmsgToServer,
2926 [MSG], [], 0, object())
2927 self.sendToServer(b"done")
2928
2929 def testSendmsgBadCmsg(self):
2930 # Check that invalid ancillary data items are rejected.
2931 self.assertEqual(self.serv_sock.recv(1000), b"done")
2932
2933 def _testSendmsgBadCmsg(self):
2934 self.assertRaises(TypeError, self.sendmsgToServer,
2935 [MSG], [object()])
2936 self.assertRaises(TypeError, self.sendmsgToServer,
2937 [MSG], [(object(), 0, b"data")])
2938 self.assertRaises(TypeError, self.sendmsgToServer,
2939 [MSG], [(0, object(), b"data")])
2940 self.assertRaises(TypeError, self.sendmsgToServer,
2941 [MSG], [(0, 0, object())])
2942 self.assertRaises(TypeError, self.sendmsgToServer,
2943 [MSG], [(0, 0)])
2944 self.assertRaises(TypeError, self.sendmsgToServer,
2945 [MSG], [(0, 0, b"data", 42)])
2946 self.sendToServer(b"done")
2947
2948 @requireAttrs(socket, "CMSG_SPACE")
2949 def testSendmsgBadMultiCmsg(self):
2950 # Check that invalid ancillary data items are rejected when
2951 # more than one item is present.
2952 self.assertEqual(self.serv_sock.recv(1000), b"done")
2953
2954 @testSendmsgBadMultiCmsg.client_skip
2955 def _testSendmsgBadMultiCmsg(self):
2956 self.assertRaises(TypeError, self.sendmsgToServer,
2957 [MSG], [0, 0, b""])
2958 self.assertRaises(TypeError, self.sendmsgToServer,
2959 [MSG], [(0, 0, b""), object()])
2960 self.sendToServer(b"done")
2961
2962 def testSendmsgExcessCmsgReject(self):
2963 # Check that sendmsg() rejects excess ancillary data items
2964 # when the number that can be sent is limited.
2965 self.assertEqual(self.serv_sock.recv(1000), b"done")
2966
2967 def _testSendmsgExcessCmsgReject(self):
2968 if not hasattr(socket, "CMSG_SPACE"):
2969 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002970 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002971 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2972 self.assertIsNone(cm.exception.errno)
2973 self.sendToServer(b"done")
2974
2975 def testSendmsgAfterClose(self):
2976 # Check that sendmsg() fails on a closed socket.
2977 pass
2978
2979 def _testSendmsgAfterClose(self):
2980 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002981 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002982
2983
2984class SendmsgStreamTests(SendmsgTests):
2985 # Tests for sendmsg() which require a stream socket and do not
2986 # involve recvmsg() or recvmsg_into().
2987
2988 def testSendmsgExplicitNoneAddr(self):
2989 # Check that peer address can be specified as None.
2990 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2991
2992 def _testSendmsgExplicitNoneAddr(self):
2993 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2994
2995 def testSendmsgTimeout(self):
2996 # Check that timeout works with sendmsg().
2997 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2998 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2999
3000 def _testSendmsgTimeout(self):
3001 try:
3002 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07003003 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003004 while True:
3005 self.sendmsgToServer([b"a"*512])
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003006 except TimeoutError:
Victor Stinner46f40be2018-09-25 08:30:15 -07003007 pass
3008 except OSError as exc:
3009 if exc.errno != errno.ENOMEM:
3010 raise
3011 # bpo-33937 the test randomly fails on Travis CI with
3012 # "OSError: [Errno 12] Cannot allocate memory"
3013 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003014 self.fail("TimeoutError not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003015 finally:
3016 self.misc_event.set()
3017
3018 # XXX: would be nice to have more tests for sendmsg flags argument.
3019
3020 # Linux supports MSG_DONTWAIT when sending, but in general, it
3021 # only works when receiving. Could add other platforms if they
3022 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02003023 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003024 "MSG_DONTWAIT not known to work on this platform when "
3025 "sending")
3026 def testSendmsgDontWait(self):
3027 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
3028 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
3029 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3030
3031 @testSendmsgDontWait.client_skip
3032 def _testSendmsgDontWait(self):
3033 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02003034 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003035 while True:
3036 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07003037 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
3038 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003039 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07003040 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003041 finally:
3042 self.misc_event.set()
3043
3044
3045class SendmsgConnectionlessTests(SendmsgTests):
3046 # Tests for sendmsg() which require a connectionless-mode
3047 # (e.g. datagram) socket, and do not involve recvmsg() or
3048 # recvmsg_into().
3049
3050 def testSendmsgNoDestAddr(self):
3051 # Check that sendmsg() fails when no destination address is
3052 # given for unconnected socket.
3053 pass
3054
3055 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003056 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003057 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003058 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003059 [MSG], [], 0, None)
3060
3061
3062class RecvmsgGenericTests(SendrecvmsgBase):
3063 # Tests for recvmsg() which can also be emulated using
3064 # recvmsg_into(), and can use any socket type.
3065
3066 def testRecvmsg(self):
3067 # Receive a simple message with recvmsg[_into]().
3068 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3069 self.assertEqual(msg, MSG)
3070 self.checkRecvmsgAddress(addr, self.cli_addr)
3071 self.assertEqual(ancdata, [])
3072 self.checkFlags(flags, eor=True)
3073
3074 def _testRecvmsg(self):
3075 self.sendToServer(MSG)
3076
3077 def testRecvmsgExplicitDefaults(self):
3078 # Test recvmsg[_into]() with default arguments provided explicitly.
3079 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3080 len(MSG), 0, 0)
3081 self.assertEqual(msg, MSG)
3082 self.checkRecvmsgAddress(addr, self.cli_addr)
3083 self.assertEqual(ancdata, [])
3084 self.checkFlags(flags, eor=True)
3085
3086 def _testRecvmsgExplicitDefaults(self):
3087 self.sendToServer(MSG)
3088
3089 def testRecvmsgShorter(self):
3090 # Receive a message smaller than buffer.
3091 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3092 len(MSG) + 42)
3093 self.assertEqual(msg, MSG)
3094 self.checkRecvmsgAddress(addr, self.cli_addr)
3095 self.assertEqual(ancdata, [])
3096 self.checkFlags(flags, eor=True)
3097
3098 def _testRecvmsgShorter(self):
3099 self.sendToServer(MSG)
3100
3101 def testRecvmsgTrunc(self):
3102 # Receive part of message, check for truncation indicators.
3103 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3104 len(MSG) - 3)
3105 self.assertEqual(msg, MSG[:-3])
3106 self.checkRecvmsgAddress(addr, self.cli_addr)
3107 self.assertEqual(ancdata, [])
3108 self.checkFlags(flags, eor=False)
3109
3110 def _testRecvmsgTrunc(self):
3111 self.sendToServer(MSG)
3112
3113 def testRecvmsgShortAncillaryBuf(self):
3114 # Test ancillary data buffer too small to hold any ancillary data.
3115 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3116 len(MSG), 1)
3117 self.assertEqual(msg, MSG)
3118 self.checkRecvmsgAddress(addr, self.cli_addr)
3119 self.assertEqual(ancdata, [])
3120 self.checkFlags(flags, eor=True)
3121
3122 def _testRecvmsgShortAncillaryBuf(self):
3123 self.sendToServer(MSG)
3124
3125 def testRecvmsgLongAncillaryBuf(self):
3126 # Test large ancillary data buffer.
3127 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3128 len(MSG), 10240)
3129 self.assertEqual(msg, MSG)
3130 self.checkRecvmsgAddress(addr, self.cli_addr)
3131 self.assertEqual(ancdata, [])
3132 self.checkFlags(flags, eor=True)
3133
3134 def _testRecvmsgLongAncillaryBuf(self):
3135 self.sendToServer(MSG)
3136
3137 def testRecvmsgAfterClose(self):
3138 # Check that recvmsg[_into]() fails on a closed socket.
3139 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003140 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003141
3142 def _testRecvmsgAfterClose(self):
3143 pass
3144
3145 def testRecvmsgTimeout(self):
3146 # Check that timeout works.
3147 try:
3148 self.serv_sock.settimeout(0.03)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003149 self.assertRaises(TimeoutError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003150 self.doRecvmsg, self.serv_sock, len(MSG))
3151 finally:
3152 self.misc_event.set()
3153
3154 def _testRecvmsgTimeout(self):
3155 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3156
3157 @requireAttrs(socket, "MSG_PEEK")
3158 def testRecvmsgPeek(self):
3159 # Check that MSG_PEEK in flags enables examination of pending
3160 # data without consuming it.
3161
3162 # Receive part of data with MSG_PEEK.
3163 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3164 len(MSG) - 3, 0,
3165 socket.MSG_PEEK)
3166 self.assertEqual(msg, MSG[:-3])
3167 self.checkRecvmsgAddress(addr, self.cli_addr)
3168 self.assertEqual(ancdata, [])
3169 # Ignoring MSG_TRUNC here (so this test is the same for stream
3170 # and datagram sockets). Some wording in POSIX seems to
3171 # suggest that it needn't be set when peeking, but that may
3172 # just be a slip.
3173 self.checkFlags(flags, eor=False,
3174 ignore=getattr(socket, "MSG_TRUNC", 0))
3175
3176 # Receive all data with MSG_PEEK.
3177 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3178 len(MSG), 0,
3179 socket.MSG_PEEK)
3180 self.assertEqual(msg, MSG)
3181 self.checkRecvmsgAddress(addr, self.cli_addr)
3182 self.assertEqual(ancdata, [])
3183 self.checkFlags(flags, eor=True)
3184
3185 # Check that the same data can still be received normally.
3186 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3187 self.assertEqual(msg, MSG)
3188 self.checkRecvmsgAddress(addr, self.cli_addr)
3189 self.assertEqual(ancdata, [])
3190 self.checkFlags(flags, eor=True)
3191
3192 @testRecvmsgPeek.client_skip
3193 def _testRecvmsgPeek(self):
3194 self.sendToServer(MSG)
3195
3196 @requireAttrs(socket.socket, "sendmsg")
3197 def testRecvmsgFromSendmsg(self):
3198 # Test receiving with recvmsg[_into]() when message is sent
3199 # using sendmsg().
3200 self.serv_sock.settimeout(self.fail_timeout)
3201 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3202 self.assertEqual(msg, MSG)
3203 self.checkRecvmsgAddress(addr, self.cli_addr)
3204 self.assertEqual(ancdata, [])
3205 self.checkFlags(flags, eor=True)
3206
3207 @testRecvmsgFromSendmsg.client_skip
3208 def _testRecvmsgFromSendmsg(self):
3209 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3210
3211
3212class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3213 # Tests which require a stream socket and can use either recvmsg()
3214 # or recvmsg_into().
3215
3216 def testRecvmsgEOF(self):
3217 # Receive end-of-stream indicator (b"", peer socket closed).
3218 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3219 self.assertEqual(msg, b"")
3220 self.checkRecvmsgAddress(addr, self.cli_addr)
3221 self.assertEqual(ancdata, [])
3222 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3223
3224 def _testRecvmsgEOF(self):
3225 self.cli_sock.close()
3226
3227 def testRecvmsgOverflow(self):
3228 # Receive a message in more than one chunk.
3229 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3230 len(MSG) - 3)
3231 self.checkRecvmsgAddress(addr, self.cli_addr)
3232 self.assertEqual(ancdata, [])
3233 self.checkFlags(flags, eor=False)
3234
3235 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3236 self.checkRecvmsgAddress(addr, self.cli_addr)
3237 self.assertEqual(ancdata, [])
3238 self.checkFlags(flags, eor=True)
3239
3240 msg = seg1 + seg2
3241 self.assertEqual(msg, MSG)
3242
3243 def _testRecvmsgOverflow(self):
3244 self.sendToServer(MSG)
3245
3246
3247class RecvmsgTests(RecvmsgGenericTests):
3248 # Tests for recvmsg() which can use any socket type.
3249
3250 def testRecvmsgBadArgs(self):
3251 # Check that recvmsg() rejects invalid arguments.
3252 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3253 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3254 -1, 0, 0)
3255 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3256 len(MSG), -1, 0)
3257 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3258 [bytearray(10)], 0, 0)
3259 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3260 object(), 0, 0)
3261 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3262 len(MSG), object(), 0)
3263 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3264 len(MSG), 0, object())
3265
3266 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3267 self.assertEqual(msg, MSG)
3268 self.checkRecvmsgAddress(addr, self.cli_addr)
3269 self.assertEqual(ancdata, [])
3270 self.checkFlags(flags, eor=True)
3271
3272 def _testRecvmsgBadArgs(self):
3273 self.sendToServer(MSG)
3274
3275
3276class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3277 # Tests for recvmsg_into() which can use any socket type.
3278
3279 def testRecvmsgIntoBadArgs(self):
3280 # Check that recvmsg_into() rejects invalid arguments.
3281 buf = bytearray(len(MSG))
3282 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3283 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3284 len(MSG), 0, 0)
3285 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3286 buf, 0, 0)
3287 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3288 [object()], 0, 0)
3289 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3290 [b"I'm not writable"], 0, 0)
3291 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3292 [buf, object()], 0, 0)
3293 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3294 [buf], -1, 0)
3295 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3296 [buf], object(), 0)
3297 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3298 [buf], 0, object())
3299
3300 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3301 self.assertEqual(nbytes, len(MSG))
3302 self.assertEqual(buf, bytearray(MSG))
3303 self.checkRecvmsgAddress(addr, self.cli_addr)
3304 self.assertEqual(ancdata, [])
3305 self.checkFlags(flags, eor=True)
3306
3307 def _testRecvmsgIntoBadArgs(self):
3308 self.sendToServer(MSG)
3309
3310 def testRecvmsgIntoGenerator(self):
3311 # Receive into buffer obtained from a generator (not a sequence).
3312 buf = bytearray(len(MSG))
3313 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3314 (o for o in [buf]))
3315 self.assertEqual(nbytes, len(MSG))
3316 self.assertEqual(buf, bytearray(MSG))
3317 self.checkRecvmsgAddress(addr, self.cli_addr)
3318 self.assertEqual(ancdata, [])
3319 self.checkFlags(flags, eor=True)
3320
3321 def _testRecvmsgIntoGenerator(self):
3322 self.sendToServer(MSG)
3323
3324 def testRecvmsgIntoArray(self):
3325 # Receive into an array rather than the usual bytearray.
3326 buf = array.array("B", [0] * len(MSG))
3327 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3328 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003329 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003330 self.checkRecvmsgAddress(addr, self.cli_addr)
3331 self.assertEqual(ancdata, [])
3332 self.checkFlags(flags, eor=True)
3333
3334 def _testRecvmsgIntoArray(self):
3335 self.sendToServer(MSG)
3336
3337 def testRecvmsgIntoScatter(self):
3338 # Receive into multiple buffers (scatter write).
3339 b1 = bytearray(b"----")
3340 b2 = bytearray(b"0123456789")
3341 b3 = bytearray(b"--------------")
3342 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3343 [b1, memoryview(b2)[2:9], b3])
3344 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3345 self.assertEqual(b1, bytearray(b"Mary"))
3346 self.assertEqual(b2, bytearray(b"01 had a 9"))
3347 self.assertEqual(b3, bytearray(b"little lamb---"))
3348 self.checkRecvmsgAddress(addr, self.cli_addr)
3349 self.assertEqual(ancdata, [])
3350 self.checkFlags(flags, eor=True)
3351
3352 def _testRecvmsgIntoScatter(self):
3353 self.sendToServer(b"Mary had a little lamb")
3354
3355
3356class CmsgMacroTests(unittest.TestCase):
3357 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3358 # assumptions used by sendmsg() and recvmsg[_into](), which share
3359 # code with these functions.
3360
3361 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003362 try:
3363 import _testcapi
3364 except ImportError:
3365 socklen_t_limit = 0x7fffffff
3366 else:
3367 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003368
3369 @requireAttrs(socket, "CMSG_LEN")
3370 def testCMSG_LEN(self):
3371 # Test CMSG_LEN() with various valid and invalid values,
3372 # checking the assumptions used by recvmsg() and sendmsg().
3373 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3374 values = list(range(257)) + list(range(toobig - 257, toobig))
3375
3376 # struct cmsghdr has at least three members, two of which are ints
3377 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3378 for n in values:
3379 ret = socket.CMSG_LEN(n)
3380 # This is how recvmsg() calculates the data size
3381 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3382 self.assertLessEqual(ret, self.socklen_t_limit)
3383
3384 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3385 # sendmsg() shares code with these functions, and requires
3386 # that it reject values over the limit.
3387 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3388 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3389
3390 @requireAttrs(socket, "CMSG_SPACE")
3391 def testCMSG_SPACE(self):
3392 # Test CMSG_SPACE() with various valid and invalid values,
3393 # checking the assumptions used by sendmsg().
3394 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3395 values = list(range(257)) + list(range(toobig - 257, toobig))
3396
3397 last = socket.CMSG_SPACE(0)
3398 # struct cmsghdr has at least three members, two of which are ints
3399 self.assertGreater(last, array.array("i").itemsize * 2)
3400 for n in values:
3401 ret = socket.CMSG_SPACE(n)
3402 self.assertGreaterEqual(ret, last)
3403 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3404 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3405 self.assertLessEqual(ret, self.socklen_t_limit)
3406 last = ret
3407
3408 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3409 # sendmsg() shares code with these functions, and requires
3410 # that it reject values over the limit.
3411 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3412 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3413
3414
3415class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3416 # Tests for file descriptor passing on Unix-domain sockets.
3417
3418 # Invalid file descriptor value that's unlikely to evaluate to a
3419 # real FD even if one of its bytes is replaced with a different
3420 # value (which shouldn't actually happen).
3421 badfd = -0x5555
3422
3423 def newFDs(self, n):
3424 # Return a list of n file descriptors for newly-created files
3425 # containing their list indices as ASCII numbers.
3426 fds = []
3427 for i in range(n):
3428 fd, path = tempfile.mkstemp()
3429 self.addCleanup(os.unlink, path)
3430 self.addCleanup(os.close, fd)
3431 os.write(fd, str(i).encode())
3432 fds.append(fd)
3433 return fds
3434
3435 def checkFDs(self, fds):
3436 # Check that the file descriptors in the given list contain
3437 # their correct list indices as ASCII numbers.
3438 for n, fd in enumerate(fds):
3439 os.lseek(fd, 0, os.SEEK_SET)
3440 self.assertEqual(os.read(fd, 1024), str(n).encode())
3441
3442 def registerRecvmsgResult(self, result):
3443 self.addCleanup(self.closeRecvmsgFDs, result)
3444
3445 def closeRecvmsgFDs(self, recvmsg_result):
3446 # Close all file descriptors specified in the ancillary data
3447 # of the given return value from recvmsg() or recvmsg_into().
3448 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3449 if (cmsg_level == socket.SOL_SOCKET and
3450 cmsg_type == socket.SCM_RIGHTS):
3451 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003452 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003453 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3454 for fd in fds:
3455 os.close(fd)
3456
3457 def createAndSendFDs(self, n):
3458 # Send n new file descriptors created by newFDs() to the
3459 # server, with the constant MSG as the non-ancillary data.
3460 self.assertEqual(
3461 self.sendmsgToServer([MSG],
3462 [(socket.SOL_SOCKET,
3463 socket.SCM_RIGHTS,
3464 array.array("i", self.newFDs(n)))]),
3465 len(MSG))
3466
3467 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3468 # Check that constant MSG was received with numfds file
3469 # descriptors in a maximum of maxcmsgs control messages (which
3470 # must contain only complete integers). By default, check
3471 # that MSG_CTRUNC is unset, but ignore any flags in
3472 # ignoreflags.
3473 msg, ancdata, flags, addr = result
3474 self.assertEqual(msg, MSG)
3475 self.checkRecvmsgAddress(addr, self.cli_addr)
3476 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3477 ignore=ignoreflags)
3478
3479 self.assertIsInstance(ancdata, list)
3480 self.assertLessEqual(len(ancdata), maxcmsgs)
3481 fds = array.array("i")
3482 for item in ancdata:
3483 self.assertIsInstance(item, tuple)
3484 cmsg_level, cmsg_type, cmsg_data = item
3485 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3486 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3487 self.assertIsInstance(cmsg_data, bytes)
3488 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003489 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003490
3491 self.assertEqual(len(fds), numfds)
3492 self.checkFDs(fds)
3493
3494 def testFDPassSimple(self):
3495 # Pass a single FD (array read from bytes object).
3496 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3497 len(MSG), 10240))
3498
3499 def _testFDPassSimple(self):
3500 self.assertEqual(
3501 self.sendmsgToServer(
3502 [MSG],
3503 [(socket.SOL_SOCKET,
3504 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003505 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003506 len(MSG))
3507
3508 def testMultipleFDPass(self):
3509 # Pass multiple FDs in a single array.
3510 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3511 len(MSG), 10240))
3512
3513 def _testMultipleFDPass(self):
3514 self.createAndSendFDs(4)
3515
3516 @requireAttrs(socket, "CMSG_SPACE")
3517 def testFDPassCMSG_SPACE(self):
3518 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3519 self.checkRecvmsgFDs(
3520 4, self.doRecvmsg(self.serv_sock, len(MSG),
3521 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3522
3523 @testFDPassCMSG_SPACE.client_skip
3524 def _testFDPassCMSG_SPACE(self):
3525 self.createAndSendFDs(4)
3526
3527 def testFDPassCMSG_LEN(self):
3528 # Test using CMSG_LEN() to calculate ancillary buffer size.
3529 self.checkRecvmsgFDs(1,
3530 self.doRecvmsg(self.serv_sock, len(MSG),
3531 socket.CMSG_LEN(4 * SIZEOF_INT)),
3532 # RFC 3542 says implementations may set
3533 # MSG_CTRUNC if there isn't enough space
3534 # for trailing padding.
3535 ignoreflags=socket.MSG_CTRUNC)
3536
3537 def _testFDPassCMSG_LEN(self):
3538 self.createAndSendFDs(1)
3539
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003540 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003541 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003542 @requireAttrs(socket, "CMSG_SPACE")
3543 def testFDPassSeparate(self):
3544 # Pass two FDs in two separate arrays. Arrays may be combined
3545 # into a single control message by the OS.
3546 self.checkRecvmsgFDs(2,
3547 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3548 maxcmsgs=2)
3549
3550 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003551 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003552 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003553 def _testFDPassSeparate(self):
3554 fd0, fd1 = self.newFDs(2)
3555 self.assertEqual(
3556 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3557 socket.SCM_RIGHTS,
3558 array.array("i", [fd0])),
3559 (socket.SOL_SOCKET,
3560 socket.SCM_RIGHTS,
3561 array.array("i", [fd1]))]),
3562 len(MSG))
3563
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003564 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003565 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003566 @requireAttrs(socket, "CMSG_SPACE")
3567 def testFDPassSeparateMinSpace(self):
3568 # Pass two FDs in two separate arrays, receiving them into the
3569 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003570 num_fds = 2
3571 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003572 self.doRecvmsg(self.serv_sock, len(MSG),
3573 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003574 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003575 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3576
3577 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003578 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003579 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003580 def _testFDPassSeparateMinSpace(self):
3581 fd0, fd1 = self.newFDs(2)
3582 self.assertEqual(
3583 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3584 socket.SCM_RIGHTS,
3585 array.array("i", [fd0])),
3586 (socket.SOL_SOCKET,
3587 socket.SCM_RIGHTS,
3588 array.array("i", [fd1]))]),
3589 len(MSG))
3590
3591 def sendAncillaryIfPossible(self, msg, ancdata):
3592 # Try to send msg and ancdata to server, but if the system
3593 # call fails, just send msg with no ancillary data.
3594 try:
3595 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003596 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003597 # Check that it was the system call that failed
3598 self.assertIsInstance(e.errno, int)
3599 nbytes = self.sendmsgToServer([msg])
3600 self.assertEqual(nbytes, len(msg))
3601
Brett Cannon3bbad122015-12-28 17:21:44 -08003602 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003603 def testFDPassEmpty(self):
3604 # Try to pass an empty FD array. Can receive either no array
3605 # or an empty array.
3606 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3607 len(MSG), 10240),
3608 ignoreflags=socket.MSG_CTRUNC)
3609
3610 def _testFDPassEmpty(self):
3611 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3612 socket.SCM_RIGHTS,
3613 b"")])
3614
3615 def testFDPassPartialInt(self):
3616 # Try to pass a truncated FD array.
3617 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3618 len(MSG), 10240)
3619 self.assertEqual(msg, MSG)
3620 self.checkRecvmsgAddress(addr, self.cli_addr)
3621 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3622 self.assertLessEqual(len(ancdata), 1)
3623 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3624 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3625 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3626 self.assertLess(len(cmsg_data), SIZEOF_INT)
3627
3628 def _testFDPassPartialInt(self):
3629 self.sendAncillaryIfPossible(
3630 MSG,
3631 [(socket.SOL_SOCKET,
3632 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003633 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003634
3635 @requireAttrs(socket, "CMSG_SPACE")
3636 def testFDPassPartialIntInMiddle(self):
3637 # Try to pass two FD arrays, the first of which is truncated.
3638 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3639 len(MSG), 10240)
3640 self.assertEqual(msg, MSG)
3641 self.checkRecvmsgAddress(addr, self.cli_addr)
3642 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3643 self.assertLessEqual(len(ancdata), 2)
3644 fds = array.array("i")
3645 # Arrays may have been combined in a single control message
3646 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3647 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3648 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003649 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003650 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3651 self.assertLessEqual(len(fds), 2)
3652 self.checkFDs(fds)
3653
3654 @testFDPassPartialIntInMiddle.client_skip
3655 def _testFDPassPartialIntInMiddle(self):
3656 fd0, fd1 = self.newFDs(2)
3657 self.sendAncillaryIfPossible(
3658 MSG,
3659 [(socket.SOL_SOCKET,
3660 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003661 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003662 (socket.SOL_SOCKET,
3663 socket.SCM_RIGHTS,
3664 array.array("i", [fd1]))])
3665
3666 def checkTruncatedHeader(self, result, ignoreflags=0):
3667 # Check that no ancillary data items are returned when data is
3668 # truncated inside the cmsghdr structure.
3669 msg, ancdata, flags, addr = result
3670 self.assertEqual(msg, MSG)
3671 self.checkRecvmsgAddress(addr, self.cli_addr)
3672 self.assertEqual(ancdata, [])
3673 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3674 ignore=ignoreflags)
3675
3676 def testCmsgTruncNoBufSize(self):
3677 # Check that no ancillary data is received when no buffer size
3678 # is specified.
3679 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3680 # BSD seems to set MSG_CTRUNC only
3681 # if an item has been partially
3682 # received.
3683 ignoreflags=socket.MSG_CTRUNC)
3684
3685 def _testCmsgTruncNoBufSize(self):
3686 self.createAndSendFDs(1)
3687
3688 def testCmsgTrunc0(self):
3689 # Check that no ancillary data is received when buffer size is 0.
3690 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3691 ignoreflags=socket.MSG_CTRUNC)
3692
3693 def _testCmsgTrunc0(self):
3694 self.createAndSendFDs(1)
3695
3696 # Check that no ancillary data is returned for various non-zero
3697 # (but still too small) buffer sizes.
3698
3699 def testCmsgTrunc1(self):
3700 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3701
3702 def _testCmsgTrunc1(self):
3703 self.createAndSendFDs(1)
3704
3705 def testCmsgTrunc2Int(self):
3706 # The cmsghdr structure has at least three members, two of
3707 # which are ints, so we still shouldn't see any ancillary
3708 # data.
3709 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3710 SIZEOF_INT * 2))
3711
3712 def _testCmsgTrunc2Int(self):
3713 self.createAndSendFDs(1)
3714
3715 def testCmsgTruncLen0Minus1(self):
3716 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3717 socket.CMSG_LEN(0) - 1))
3718
3719 def _testCmsgTruncLen0Minus1(self):
3720 self.createAndSendFDs(1)
3721
3722 # The following tests try to truncate the control message in the
3723 # middle of the FD array.
3724
3725 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3726 # Check that file descriptor data is truncated to between
3727 # mindata and maxdata bytes when received with buffer size
3728 # ancbuf, and that any complete file descriptor numbers are
3729 # valid.
3730 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3731 len(MSG), ancbuf)
3732 self.assertEqual(msg, MSG)
3733 self.checkRecvmsgAddress(addr, self.cli_addr)
3734 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3735
3736 if mindata == 0 and ancdata == []:
3737 return
3738 self.assertEqual(len(ancdata), 1)
3739 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3740 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3741 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3742 self.assertGreaterEqual(len(cmsg_data), mindata)
3743 self.assertLessEqual(len(cmsg_data), maxdata)
3744 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003745 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003746 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3747 self.checkFDs(fds)
3748
3749 def testCmsgTruncLen0(self):
3750 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3751
3752 def _testCmsgTruncLen0(self):
3753 self.createAndSendFDs(1)
3754
3755 def testCmsgTruncLen0Plus1(self):
3756 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3757
3758 def _testCmsgTruncLen0Plus1(self):
3759 self.createAndSendFDs(2)
3760
3761 def testCmsgTruncLen1(self):
3762 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3763 maxdata=SIZEOF_INT)
3764
3765 def _testCmsgTruncLen1(self):
3766 self.createAndSendFDs(2)
3767
3768 def testCmsgTruncLen2Minus1(self):
3769 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3770 maxdata=(2 * SIZEOF_INT) - 1)
3771
3772 def _testCmsgTruncLen2Minus1(self):
3773 self.createAndSendFDs(2)
3774
3775
3776class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3777 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3778 # features of the RFC 3542 Advanced Sockets API for IPv6.
3779 # Currently we can only handle certain data items (e.g. traffic
3780 # class, hop limit, MTU discovery and fragmentation settings)
3781 # without resorting to unportable means such as the struct module,
3782 # but the tests here are aimed at testing the ancillary data
3783 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3784 # itself.
3785
3786 # Test value to use when setting hop limit of packet
3787 hop_limit = 2
3788
3789 # Test value to use when setting traffic class of packet.
3790 # -1 means "use kernel default".
3791 traffic_class = -1
3792
3793 def ancillaryMapping(self, ancdata):
3794 # Given ancillary data list ancdata, return a mapping from
3795 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3796 # Check that no (level, type) pair appears more than once.
3797 d = {}
3798 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3799 self.assertNotIn((cmsg_level, cmsg_type), d)
3800 d[(cmsg_level, cmsg_type)] = cmsg_data
3801 return d
3802
3803 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3804 # Receive hop limit into ancbufsize bytes of ancillary data
3805 # space. Check that data is MSG, ancillary data is not
3806 # truncated (but ignore any flags in ignoreflags), and hop
3807 # limit is between 0 and maxhop inclusive.
3808 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3809 socket.IPV6_RECVHOPLIMIT, 1)
3810 self.misc_event.set()
3811 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3812 len(MSG), ancbufsize)
3813
3814 self.assertEqual(msg, MSG)
3815 self.checkRecvmsgAddress(addr, self.cli_addr)
3816 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3817 ignore=ignoreflags)
3818
3819 self.assertEqual(len(ancdata), 1)
3820 self.assertIsInstance(ancdata[0], tuple)
3821 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3822 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3823 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3824 self.assertIsInstance(cmsg_data, bytes)
3825 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3826 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003827 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003828 self.assertGreaterEqual(a[0], 0)
3829 self.assertLessEqual(a[0], maxhop)
3830
3831 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3832 def testRecvHopLimit(self):
3833 # Test receiving the packet hop limit as ancillary data.
3834 self.checkHopLimit(ancbufsize=10240)
3835
3836 @testRecvHopLimit.client_skip
3837 def _testRecvHopLimit(self):
3838 # Need to wait until server has asked to receive ancillary
3839 # data, as implementations are not required to buffer it
3840 # otherwise.
3841 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3842 self.sendToServer(MSG)
3843
3844 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3845 def testRecvHopLimitCMSG_SPACE(self):
3846 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3847 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3848
3849 @testRecvHopLimitCMSG_SPACE.client_skip
3850 def _testRecvHopLimitCMSG_SPACE(self):
3851 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3852 self.sendToServer(MSG)
3853
3854 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3855 # 3542 says portable applications must provide space for trailing
3856 # padding. Implementations may set MSG_CTRUNC if there isn't
3857 # enough space for the padding.
3858
3859 @requireAttrs(socket.socket, "sendmsg")
3860 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3861 def testSetHopLimit(self):
3862 # Test setting hop limit on outgoing packet and receiving it
3863 # at the other end.
3864 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3865
3866 @testSetHopLimit.client_skip
3867 def _testSetHopLimit(self):
3868 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3869 self.assertEqual(
3870 self.sendmsgToServer([MSG],
3871 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3872 array.array("i", [self.hop_limit]))]),
3873 len(MSG))
3874
3875 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3876 ignoreflags=0):
3877 # Receive traffic class and hop limit into ancbufsize bytes of
3878 # ancillary data space. Check that data is MSG, ancillary
3879 # data is not truncated (but ignore any flags in ignoreflags),
3880 # and traffic class and hop limit are in range (hop limit no
3881 # more than maxhop).
3882 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3883 socket.IPV6_RECVHOPLIMIT, 1)
3884 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3885 socket.IPV6_RECVTCLASS, 1)
3886 self.misc_event.set()
3887 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3888 len(MSG), ancbufsize)
3889
3890 self.assertEqual(msg, MSG)
3891 self.checkRecvmsgAddress(addr, self.cli_addr)
3892 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3893 ignore=ignoreflags)
3894 self.assertEqual(len(ancdata), 2)
3895 ancmap = self.ancillaryMapping(ancdata)
3896
3897 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3898 self.assertEqual(len(tcdata), SIZEOF_INT)
3899 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003900 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003901 self.assertGreaterEqual(a[0], 0)
3902 self.assertLessEqual(a[0], 255)
3903
3904 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3905 self.assertEqual(len(hldata), SIZEOF_INT)
3906 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003907 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003908 self.assertGreaterEqual(a[0], 0)
3909 self.assertLessEqual(a[0], maxhop)
3910
3911 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3912 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3913 def testRecvTrafficClassAndHopLimit(self):
3914 # Test receiving traffic class and hop limit as ancillary data.
3915 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3916
3917 @testRecvTrafficClassAndHopLimit.client_skip
3918 def _testRecvTrafficClassAndHopLimit(self):
3919 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3920 self.sendToServer(MSG)
3921
3922 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3923 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3924 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3925 # Test receiving traffic class and hop limit, using
3926 # CMSG_SPACE() to calculate buffer size.
3927 self.checkTrafficClassAndHopLimit(
3928 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3929
3930 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3931 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3932 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3933 self.sendToServer(MSG)
3934
3935 @requireAttrs(socket.socket, "sendmsg")
3936 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3937 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3938 def testSetTrafficClassAndHopLimit(self):
3939 # Test setting traffic class and hop limit on outgoing packet,
3940 # and receiving them at the other end.
3941 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3942 maxhop=self.hop_limit)
3943
3944 @testSetTrafficClassAndHopLimit.client_skip
3945 def _testSetTrafficClassAndHopLimit(self):
3946 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3947 self.assertEqual(
3948 self.sendmsgToServer([MSG],
3949 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3950 array.array("i", [self.traffic_class])),
3951 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3952 array.array("i", [self.hop_limit]))]),
3953 len(MSG))
3954
3955 @requireAttrs(socket.socket, "sendmsg")
3956 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3957 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3958 def testOddCmsgSize(self):
3959 # Try to send ancillary data with first item one byte too
3960 # long. Fall back to sending with correct size if this fails,
3961 # and check that second item was handled correctly.
3962 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3963 maxhop=self.hop_limit)
3964
3965 @testOddCmsgSize.client_skip
3966 def _testOddCmsgSize(self):
3967 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3968 try:
3969 nbytes = self.sendmsgToServer(
3970 [MSG],
3971 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003972 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003973 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3974 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003975 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976 self.assertIsInstance(e.errno, int)
3977 nbytes = self.sendmsgToServer(
3978 [MSG],
3979 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3980 array.array("i", [self.traffic_class])),
3981 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3982 array.array("i", [self.hop_limit]))])
3983 self.assertEqual(nbytes, len(MSG))
3984
3985 # Tests for proper handling of truncated ancillary data
3986
3987 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3988 # Receive hop limit into ancbufsize bytes of ancillary data
3989 # space, which should be too small to contain the ancillary
3990 # data header (if ancbufsize is None, pass no second argument
3991 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3992 # (unless included in ignoreflags), and no ancillary data is
3993 # returned.
3994 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3995 socket.IPV6_RECVHOPLIMIT, 1)
3996 self.misc_event.set()
3997 args = () if ancbufsize is None else (ancbufsize,)
3998 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3999 len(MSG), *args)
4000
4001 self.assertEqual(msg, MSG)
4002 self.checkRecvmsgAddress(addr, self.cli_addr)
4003 self.assertEqual(ancdata, [])
4004 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4005 ignore=ignoreflags)
4006
4007 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4008 def testCmsgTruncNoBufSize(self):
4009 # Check that no ancillary data is received when no ancillary
4010 # buffer size is provided.
4011 self.checkHopLimitTruncatedHeader(ancbufsize=None,
4012 # BSD seems to set
4013 # MSG_CTRUNC only if an item
4014 # has been partially
4015 # received.
4016 ignoreflags=socket.MSG_CTRUNC)
4017
4018 @testCmsgTruncNoBufSize.client_skip
4019 def _testCmsgTruncNoBufSize(self):
4020 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4021 self.sendToServer(MSG)
4022
4023 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4024 def testSingleCmsgTrunc0(self):
4025 # Check that no ancillary data is received when ancillary
4026 # buffer size is zero.
4027 self.checkHopLimitTruncatedHeader(ancbufsize=0,
4028 ignoreflags=socket.MSG_CTRUNC)
4029
4030 @testSingleCmsgTrunc0.client_skip
4031 def _testSingleCmsgTrunc0(self):
4032 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4033 self.sendToServer(MSG)
4034
4035 # Check that no ancillary data is returned for various non-zero
4036 # (but still too small) buffer sizes.
4037
4038 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4039 def testSingleCmsgTrunc1(self):
4040 self.checkHopLimitTruncatedHeader(ancbufsize=1)
4041
4042 @testSingleCmsgTrunc1.client_skip
4043 def _testSingleCmsgTrunc1(self):
4044 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4045 self.sendToServer(MSG)
4046
4047 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4048 def testSingleCmsgTrunc2Int(self):
4049 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
4050
4051 @testSingleCmsgTrunc2Int.client_skip
4052 def _testSingleCmsgTrunc2Int(self):
4053 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4054 self.sendToServer(MSG)
4055
4056 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4057 def testSingleCmsgTruncLen0Minus1(self):
4058 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
4059
4060 @testSingleCmsgTruncLen0Minus1.client_skip
4061 def _testSingleCmsgTruncLen0Minus1(self):
4062 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4063 self.sendToServer(MSG)
4064
4065 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4066 def testSingleCmsgTruncInData(self):
4067 # Test truncation of a control message inside its associated
4068 # data. The message may be returned with its data truncated,
4069 # or not returned at all.
4070 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4071 socket.IPV6_RECVHOPLIMIT, 1)
4072 self.misc_event.set()
4073 msg, ancdata, flags, addr = self.doRecvmsg(
4074 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4075
4076 self.assertEqual(msg, MSG)
4077 self.checkRecvmsgAddress(addr, self.cli_addr)
4078 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4079
4080 self.assertLessEqual(len(ancdata), 1)
4081 if ancdata:
4082 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4083 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4084 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4085 self.assertLess(len(cmsg_data), SIZEOF_INT)
4086
4087 @testSingleCmsgTruncInData.client_skip
4088 def _testSingleCmsgTruncInData(self):
4089 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4090 self.sendToServer(MSG)
4091
4092 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4093 # Receive traffic class and hop limit into ancbufsize bytes of
4094 # ancillary data space, which should be large enough to
4095 # contain the first item, but too small to contain the header
4096 # of the second. Check that data is MSG, MSG_CTRUNC is set
4097 # (unless included in ignoreflags), and only one ancillary
4098 # data item is returned.
4099 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4100 socket.IPV6_RECVHOPLIMIT, 1)
4101 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4102 socket.IPV6_RECVTCLASS, 1)
4103 self.misc_event.set()
4104 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4105 len(MSG), ancbufsize)
4106
4107 self.assertEqual(msg, MSG)
4108 self.checkRecvmsgAddress(addr, self.cli_addr)
4109 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4110 ignore=ignoreflags)
4111
4112 self.assertEqual(len(ancdata), 1)
4113 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4114 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4115 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4116 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4117 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004118 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004119 self.assertGreaterEqual(a[0], 0)
4120 self.assertLessEqual(a[0], 255)
4121
4122 # Try the above test with various buffer sizes.
4123
4124 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4125 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4126 def testSecondCmsgTrunc0(self):
4127 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4128 ignoreflags=socket.MSG_CTRUNC)
4129
4130 @testSecondCmsgTrunc0.client_skip
4131 def _testSecondCmsgTrunc0(self):
4132 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4133 self.sendToServer(MSG)
4134
4135 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4136 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4137 def testSecondCmsgTrunc1(self):
4138 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4139
4140 @testSecondCmsgTrunc1.client_skip
4141 def _testSecondCmsgTrunc1(self):
4142 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4143 self.sendToServer(MSG)
4144
4145 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4146 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4147 def testSecondCmsgTrunc2Int(self):
4148 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4149 2 * SIZEOF_INT)
4150
4151 @testSecondCmsgTrunc2Int.client_skip
4152 def _testSecondCmsgTrunc2Int(self):
4153 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4154 self.sendToServer(MSG)
4155
4156 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4157 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4158 def testSecondCmsgTruncLen0Minus1(self):
4159 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4160 socket.CMSG_LEN(0) - 1)
4161
4162 @testSecondCmsgTruncLen0Minus1.client_skip
4163 def _testSecondCmsgTruncLen0Minus1(self):
4164 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4165 self.sendToServer(MSG)
4166
4167 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4168 "IPV6_RECVTCLASS", "IPV6_TCLASS")
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304169 def testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004170 # Test truncation of the second of two control messages inside
4171 # its associated data.
4172 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4173 socket.IPV6_RECVHOPLIMIT, 1)
4174 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4175 socket.IPV6_RECVTCLASS, 1)
4176 self.misc_event.set()
4177 msg, ancdata, flags, addr = self.doRecvmsg(
4178 self.serv_sock, len(MSG),
4179 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4180
4181 self.assertEqual(msg, MSG)
4182 self.checkRecvmsgAddress(addr, self.cli_addr)
4183 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4184
4185 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4186
4187 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4188 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4189 cmsg_types.remove(cmsg_type)
4190 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4191 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004192 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004193 self.assertGreaterEqual(a[0], 0)
4194 self.assertLessEqual(a[0], 255)
4195
4196 if ancdata:
4197 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4198 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4199 cmsg_types.remove(cmsg_type)
4200 self.assertLess(len(cmsg_data), SIZEOF_INT)
4201
4202 self.assertEqual(ancdata, [])
4203
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304204 @testSecondCmsgTruncInData.client_skip
4205 def _testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004206 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4207 self.sendToServer(MSG)
4208
4209
4210# Derive concrete test classes for different socket types.
4211
4212class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4213 SendrecvmsgConnectionlessBase,
4214 ThreadedSocketTestMixin, UDPTestBase):
4215 pass
4216
4217@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004218class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4219 pass
4220
4221@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004222class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4223 pass
4224
4225@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004226class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4227 pass
4228
4229
4230class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4231 SendrecvmsgConnectionlessBase,
4232 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004233
4234 def checkRecvmsgAddress(self, addr1, addr2):
4235 # Called to compare the received address with the address of
4236 # the peer, ignoring scope ID
4237 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004238
4239@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004240@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004241@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004242class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4243 pass
4244
4245@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004246@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004247@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004248class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4249 pass
4250
4251@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004252@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004253@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004254class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4255 pass
4256
4257@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004258@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004259@requireAttrs(socket, "IPPROTO_IPV6")
4260@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004261class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4262 SendrecvmsgUDP6TestBase):
4263 pass
4264
4265@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004266@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004267@requireAttrs(socket, "IPPROTO_IPV6")
4268@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004269class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4270 RFC3542AncillaryTest,
4271 SendrecvmsgUDP6TestBase):
4272 pass
4273
4274
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004275@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4276 'UDPLITE sockets required for this test.')
4277class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4278 SendrecvmsgConnectionlessBase,
4279 ThreadedSocketTestMixin, UDPLITETestBase):
4280 pass
4281
4282@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4283 'UDPLITE sockets required for this test.')
4284@requireAttrs(socket.socket, "sendmsg")
4285class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4286 pass
4287
4288@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4289 'UDPLITE sockets required for this test.')
4290@requireAttrs(socket.socket, "recvmsg")
4291class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4292 pass
4293
4294@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4295 'UDPLITE sockets required for this test.')
4296@requireAttrs(socket.socket, "recvmsg_into")
4297class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4298 pass
4299
4300
4301@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4302 'UDPLITE sockets required for this test.')
4303class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4304 SendrecvmsgConnectionlessBase,
4305 ThreadedSocketTestMixin, UDPLITE6TestBase):
4306
4307 def checkRecvmsgAddress(self, addr1, addr2):
4308 # Called to compare the received address with the address of
4309 # the peer, ignoring scope ID
4310 self.assertEqual(addr1[:-1], addr2[:-1])
4311
4312@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004313@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004314@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4315 'UDPLITE sockets required for this test.')
4316@requireSocket("AF_INET6", "SOCK_DGRAM")
4317class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4318 pass
4319
4320@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004321@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004322@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4323 'UDPLITE sockets required for this test.')
4324@requireSocket("AF_INET6", "SOCK_DGRAM")
4325class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4326 pass
4327
4328@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004329@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004330@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4331 'UDPLITE sockets required for this test.')
4332@requireSocket("AF_INET6", "SOCK_DGRAM")
4333class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4334 pass
4335
4336@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004337@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004338@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4339 'UDPLITE sockets required for this test.')
4340@requireAttrs(socket, "IPPROTO_IPV6")
4341@requireSocket("AF_INET6", "SOCK_DGRAM")
4342class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4343 SendrecvmsgUDPLITE6TestBase):
4344 pass
4345
4346@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004347@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004348@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4349 'UDPLITE sockets required for this test.')
4350@requireAttrs(socket, "IPPROTO_IPV6")
4351@requireSocket("AF_INET6", "SOCK_DGRAM")
4352class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4353 RFC3542AncillaryTest,
4354 SendrecvmsgUDPLITE6TestBase):
4355 pass
4356
4357
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004358class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4359 ConnectedStreamTestMixin, TCPTestBase):
4360 pass
4361
4362@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004363class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4364 pass
4365
4366@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004367class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4368 SendrecvmsgTCPTestBase):
4369 pass
4370
4371@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004372class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4373 SendrecvmsgTCPTestBase):
4374 pass
4375
4376
4377class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4378 SendrecvmsgConnectedBase,
4379 ConnectedStreamTestMixin, SCTPStreamBase):
4380 pass
4381
4382@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004383@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004384@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004385class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4386 pass
4387
4388@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004389@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004390@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004391class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4392 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004393
4394 def testRecvmsgEOF(self):
4395 try:
4396 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4397 except OSError as e:
4398 if e.errno != errno.ENOTCONN:
4399 raise
4400 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004401
4402@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004403@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004404@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004405class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4406 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004407
4408 def testRecvmsgEOF(self):
4409 try:
4410 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4411 except OSError as e:
4412 if e.errno != errno.ENOTCONN:
4413 raise
4414 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004415
4416
4417class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4418 ConnectedStreamTestMixin, UnixStreamBase):
4419 pass
4420
4421@requireAttrs(socket.socket, "sendmsg")
4422@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004423class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4424 pass
4425
4426@requireAttrs(socket.socket, "recvmsg")
4427@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004428class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4429 SendrecvmsgUnixStreamTestBase):
4430 pass
4431
4432@requireAttrs(socket.socket, "recvmsg_into")
4433@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004434class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4435 SendrecvmsgUnixStreamTestBase):
4436 pass
4437
4438@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4439@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004440class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4441 pass
4442
4443@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4444@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004445class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4446 SendrecvmsgUnixStreamTestBase):
4447 pass
4448
4449
4450# Test interrupting the interruptible send/receive methods with a
4451# signal when a timeout is set. These tests avoid having multiple
4452# threads alive during the test so that the OS cannot deliver the
4453# signal to the wrong one.
4454
4455class InterruptedTimeoutBase(unittest.TestCase):
4456 # Base class for interrupted send/receive tests. Installs an
4457 # empty handler for SIGALRM and removes it on teardown, along with
4458 # any scheduled alarms.
4459
4460 def setUp(self):
4461 super().setUp()
4462 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004463 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004464 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004465
4466 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004467 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004468
4469 # Provide setAlarm() method to schedule delivery of SIGALRM after
4470 # given number of seconds, or cancel it if zero, and an
4471 # appropriate time value to use. Use setitimer() if available.
4472 if hasattr(signal, "setitimer"):
4473 alarm_time = 0.05
4474
4475 def setAlarm(self, seconds):
4476 signal.setitimer(signal.ITIMER_REAL, seconds)
4477 else:
4478 # Old systems may deliver the alarm up to one second early
4479 alarm_time = 2
4480
4481 def setAlarm(self, seconds):
4482 signal.alarm(seconds)
4483
4484
4485# Require siginterrupt() in order to ensure that system calls are
4486# interrupted by default.
4487@requireAttrs(signal, "siginterrupt")
4488@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4489 "Don't have signal.alarm or signal.setitimer")
4490class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4491 # Test interrupting the recv*() methods with signals when a
4492 # timeout is set.
4493
4494 def setUp(self):
4495 super().setUp()
4496 self.serv.settimeout(self.timeout)
4497
4498 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004499 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004500 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004501 try:
4502 self.setAlarm(self.alarm_time)
4503 with self.assertRaises(ZeroDivisionError) as cm:
4504 func(*args, **kwargs)
4505 finally:
4506 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004507
4508 def testInterruptedRecvTimeout(self):
4509 self.checkInterruptedRecv(self.serv.recv, 1024)
4510
4511 def testInterruptedRecvIntoTimeout(self):
4512 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4513
4514 def testInterruptedRecvfromTimeout(self):
4515 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4516
4517 def testInterruptedRecvfromIntoTimeout(self):
4518 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4519
4520 @requireAttrs(socket.socket, "recvmsg")
4521 def testInterruptedRecvmsgTimeout(self):
4522 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4523
4524 @requireAttrs(socket.socket, "recvmsg_into")
4525 def testInterruptedRecvmsgIntoTimeout(self):
4526 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4527
4528
4529# Require siginterrupt() in order to ensure that system calls are
4530# interrupted by default.
4531@requireAttrs(signal, "siginterrupt")
4532@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4533 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004534class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4535 ThreadSafeCleanupTestCase,
4536 SocketListeningTestMixin, TCPTestBase):
4537 # Test interrupting the interruptible send*() methods with signals
4538 # when a timeout is set.
4539
4540 def setUp(self):
4541 super().setUp()
4542 self.serv_conn = self.newSocket()
4543 self.addCleanup(self.serv_conn.close)
4544 # Use a thread to complete the connection, but wait for it to
4545 # terminate before running the test, so that there is only one
4546 # thread to accept the signal.
4547 cli_thread = threading.Thread(target=self.doConnect)
4548 cli_thread.start()
4549 self.cli_conn, addr = self.serv.accept()
4550 self.addCleanup(self.cli_conn.close)
4551 cli_thread.join()
4552 self.serv_conn.settimeout(self.timeout)
4553
4554 def doConnect(self):
4555 self.serv_conn.connect(self.serv_addr)
4556
4557 def checkInterruptedSend(self, func, *args, **kwargs):
4558 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004559 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004560 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004561 try:
4562 with self.assertRaises(ZeroDivisionError) as cm:
4563 while True:
4564 self.setAlarm(self.alarm_time)
4565 func(*args, **kwargs)
4566 finally:
4567 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004568
Ned Deilyc5640382014-02-03 13:58:31 -08004569 # Issue #12958: The following tests have problems on OS X prior to 10.7
4570 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004571 def testInterruptedSendTimeout(self):
4572 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4573
Ned Deilyc5640382014-02-03 13:58:31 -08004574 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004575 def testInterruptedSendtoTimeout(self):
4576 # Passing an actual address here as Python's wrapper for
4577 # sendto() doesn't allow passing a zero-length one; POSIX
4578 # requires that the address is ignored since the socket is
4579 # connection-mode, however.
4580 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4581 self.serv_addr)
4582
Ned Deilyc5640382014-02-03 13:58:31 -08004583 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004584 @requireAttrs(socket.socket, "sendmsg")
4585 def testInterruptedSendmsgTimeout(self):
4586 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4587
4588
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004589class TCPCloserTest(ThreadedTCPSocketTest):
4590
4591 def testClose(self):
4592 conn, addr = self.serv.accept()
4593 conn.close()
4594
4595 sd = self.cli
4596 read, write, err = select.select([sd], [], [], 1.0)
4597 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004598 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004599
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004600 # Calling close() many times should be safe.
4601 conn.close()
4602 conn.close()
4603
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004604 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004605 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004606 time.sleep(1.0)
4607
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004608
Dave Cole331708b2004-08-09 04:51:41 +00004609class BasicSocketPairTest(SocketPairTest):
4610
4611 def __init__(self, methodName='runTest'):
4612 SocketPairTest.__init__(self, methodName=methodName)
4613
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004614 def _check_defaults(self, sock):
4615 self.assertIsInstance(sock, socket.socket)
4616 if hasattr(socket, 'AF_UNIX'):
4617 self.assertEqual(sock.family, socket.AF_UNIX)
4618 else:
4619 self.assertEqual(sock.family, socket.AF_INET)
4620 self.assertEqual(sock.type, socket.SOCK_STREAM)
4621 self.assertEqual(sock.proto, 0)
4622
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004623 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004624 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004625
4626 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004627 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004628
Dave Cole331708b2004-08-09 04:51:41 +00004629 def testRecv(self):
4630 msg = self.serv.recv(1024)
4631 self.assertEqual(msg, MSG)
4632
4633 def _testRecv(self):
4634 self.cli.send(MSG)
4635
4636 def testSend(self):
4637 self.serv.send(MSG)
4638
4639 def _testSend(self):
4640 msg = self.cli.recv(1024)
4641 self.assertEqual(msg, MSG)
4642
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004643
Guido van Rossum24e4af82002-06-12 19:18:08 +00004644class NonBlockingTCPTests(ThreadedTCPSocketTest):
4645
4646 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004647 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004648 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4649
Victor Stinner304315d2018-11-30 13:22:44 +01004650 def assert_sock_timeout(self, sock, timeout):
4651 self.assertEqual(self.serv.gettimeout(), timeout)
4652
4653 blocking = (timeout != 0.0)
4654 self.assertEqual(sock.getblocking(), blocking)
4655
4656 if fcntl is not None:
4657 # When a Python socket has a non-zero timeout, it's switched
4658 # internally to a non-blocking mode. Later, sock.sendall(),
4659 # sock.recv(), and other socket operations use a select() call and
4660 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4661 # timeouts are enforced.
4662 fd_blocking = (timeout is None)
4663
4664 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4665 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4666
Guido van Rossum24e4af82002-06-12 19:18:08 +00004667 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004668 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004669 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004670 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004671
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004672 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004673 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004674
4675 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004676 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004677
4678 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004679 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004680
4681 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004682 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004683
4684 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004685 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004686
4687 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004688 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004689
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004690 @support.cpython_only
4691 def testSetBlocking_overflow(self):
4692 # Issue 15989
4693 import _testcapi
4694 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4695 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004696
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004697 self.serv.setblocking(False)
4698 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004699
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004700 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4701 self.assertIsNone(self.serv.gettimeout())
4702
4703 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4704
Serhiy Storchaka43767632013-11-03 21:31:38 +02004705 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4706 'test needs socket.SOCK_NONBLOCK')
4707 @support.requires_linux_version(2, 6, 28)
4708 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004709 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004710 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004711 self.serv = socket.socket(socket.AF_INET,
4712 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4713 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004714
4715 def _testInitNonBlocking(self):
4716 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004717
Victor Stinner304315d2018-11-30 13:22:44 +01004718 def testInheritFlagsBlocking(self):
4719 # bpo-7995: accept() on a listening socket with a timeout and the
4720 # default timeout is None, the resulting socket must be blocking.
4721 with socket_setdefaulttimeout(None):
4722 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004723 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004724 self.addCleanup(conn.close)
4725 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004726
Victor Stinner304315d2018-11-30 13:22:44 +01004727 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004728 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004729
4730 def testInheritFlagsTimeout(self):
4731 # bpo-7995: accept() on a listening socket with a timeout and the
4732 # default timeout is None, the resulting socket must inherit
4733 # the default timeout.
4734 default_timeout = 20.0
4735 with socket_setdefaulttimeout(default_timeout):
4736 self.serv.settimeout(10)
4737 conn, addr = self.serv.accept()
4738 self.addCleanup(conn.close)
4739 self.assertEqual(conn.gettimeout(), default_timeout)
4740
4741 def _testInheritFlagsTimeout(self):
4742 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004743
Guido van Rossum24e4af82002-06-12 19:18:08 +00004744 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004745 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004746 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004747
4748 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004749 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004750 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004751 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004752 dt = time.monotonic() - start_time
4753 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004754
4755 self.event.set()
4756
Victor Stinner24c62582019-10-30 12:41:43 +01004757 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004758 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004759 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004760
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004761 # connect() completed: non-blocking accept() doesn't block
4762 conn, addr = self.serv.accept()
4763 self.addCleanup(conn.close)
4764 self.assertIsNone(conn.gettimeout())
4765
Guido van Rossum24e4af82002-06-12 19:18:08 +00004766 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004767 # don't connect before event is set to check
4768 # that non-blocking accept() raises BlockingIOError
4769 self.event.wait()
4770
Christian Heimes5e696852008-04-09 08:37:03 +00004771 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004772
Guido van Rossum24e4af82002-06-12 19:18:08 +00004773 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004774 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004775 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004776 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004777 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004778
4779 # the server didn't send data yet: non-blocking recv() fails
4780 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004781 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004782
4783 self.event.set()
4784
Victor Stinner24c62582019-10-30 12:41:43 +01004785 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004786 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004787 self.fail("Error during select call to non-blocking socket.")
4788
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004789 # the server sent data yet: non-blocking recv() doesn't block
4790 msg = conn.recv(len(MSG))
4791 self.assertEqual(msg, MSG)
4792
Guido van Rossum24e4af82002-06-12 19:18:08 +00004793 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004794 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004795
4796 # don't send anything before event is set to check
4797 # that non-blocking recv() raises BlockingIOError
4798 self.event.wait()
4799
4800 # send data: recv() will no longer block
4801 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004802
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004803
Guido van Rossum24e4af82002-06-12 19:18:08 +00004804class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004805 """Unit tests for the object returned by socket.makefile()
4806
Antoine Pitrou834bd812010-10-13 16:17:14 +00004807 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004808 the client connection. You can read from this file to
4809 get output from the server.
4810
Antoine Pitrou834bd812010-10-13 16:17:14 +00004811 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004812 server connection. You can write to this file to send output
4813 to the client.
4814 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004815
Guido van Rossume9f66142002-08-07 15:46:19 +00004816 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004817 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004818 errors = 'strict'
4819 newline = None
4820
4821 read_mode = 'rb'
4822 read_msg = MSG
4823 write_mode = 'wb'
4824 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004825
Guido van Rossum24e4af82002-06-12 19:18:08 +00004826 def __init__(self, methodName='runTest'):
4827 SocketConnectedTest.__init__(self, methodName=methodName)
4828
4829 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004830 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4831 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004832 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004833 self.read_file = self.cli_conn.makefile(
4834 self.read_mode, self.bufsize,
4835 encoding = self.encoding,
4836 errors = self.errors,
4837 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004838
4839 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004840 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004841 self.read_file.close()
4842 self.assertTrue(self.read_file.closed)
4843 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004844 SocketConnectedTest.tearDown(self)
4845
4846 def clientSetUp(self):
4847 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004848 self.write_file = self.serv_conn.makefile(
4849 self.write_mode, self.bufsize,
4850 encoding = self.encoding,
4851 errors = self.errors,
4852 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004853
4854 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004855 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004856 self.write_file.close()
4857 self.assertTrue(self.write_file.closed)
4858 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004859 SocketConnectedTest.clientTearDown(self)
4860
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004861 def testReadAfterTimeout(self):
4862 # Issue #7322: A file object must disallow further reads
4863 # after a timeout has occurred.
4864 self.cli_conn.settimeout(1)
4865 self.read_file.read(3)
4866 # First read raises a timeout
Christian Heimes03c8ddd2020-11-20 09:26:07 +01004867 self.assertRaises(TimeoutError, self.read_file.read, 1)
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004868 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004869 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004870 self.read_file.read(1)
4871 self.assertIn("cannot read from timed out object", str(ctx.exception))
4872
4873 def _testReadAfterTimeout(self):
4874 self.write_file.write(self.write_msg[0:3])
4875 self.write_file.flush()
4876 self.serv_finished.wait()
4877
Guido van Rossum24e4af82002-06-12 19:18:08 +00004878 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004879 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004880 first_seg = self.read_file.read(len(self.read_msg)-3)
4881 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004882 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004883 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004884
4885 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004886 self.write_file.write(self.write_msg)
4887 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004888
Guido van Rossum8c943832002-08-08 01:00:28 +00004889 def testFullRead(self):
4890 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004891 msg = self.read_file.read()
4892 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004893
4894 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004895 self.write_file.write(self.write_msg)
4896 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004897
Guido van Rossum24e4af82002-06-12 19:18:08 +00004898 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004899 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004900 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004901 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004902 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004903 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004904 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004905 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004906 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004907
4908 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004909 self.write_file.write(self.write_msg)
4910 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004911
4912 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004913 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004914 line = self.read_file.readline()
4915 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004916
4917 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004918 self.write_file.write(self.write_msg)
4919 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004920
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004921 def testCloseAfterMakefile(self):
4922 # The file returned by makefile should keep the socket open.
4923 self.cli_conn.close()
4924 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004925 msg = self.read_file.read()
4926 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004927
4928 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004929 self.write_file.write(self.write_msg)
4930 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004931
4932 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004933 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004934 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004935 if isinstance(self.read_msg, str):
4936 msg = msg.decode()
4937 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004938
4939 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004940 self.write_file.write(self.write_msg)
4941 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004942
Tim Peters116d83c2004-03-28 02:20:45 +00004943 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004944 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004945
4946 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004947 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004948
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004949 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004950 self.assertEqual(self.read_file.mode, self.read_mode)
4951 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004952
4953 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004954 self.assertEqual(self.write_file.mode, self.write_mode)
4955 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004956
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004957 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004958 self.read_file.close()
4959 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004960 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004961 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004962
4963 def _testRealClose(self):
4964 pass
4965
4966
Guido van Rossume9f66142002-08-07 15:46:19 +00004967class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4968
4969 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004970
Guido van Rossume9f66142002-08-07 15:46:19 +00004971 In this case (and in this case only), it should be possible to
4972 create a file object, read a line from it, create another file
4973 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004974 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004975 when reading multiple requests from the same socket."""
4976
4977 bufsize = 0 # Use unbuffered mode
4978
4979 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004980 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004981 line = self.read_file.readline() # first line
4982 self.assertEqual(line, b"A. " + self.write_msg) # first line
4983 self.read_file = self.cli_conn.makefile('rb', 0)
4984 line = self.read_file.readline() # second line
4985 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004986
4987 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004988 self.write_file.write(b"A. " + self.write_msg)
4989 self.write_file.write(b"B. " + self.write_msg)
4990 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004991
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004992 def testMakefileClose(self):
4993 # The file returned by makefile should keep the socket open...
4994 self.cli_conn.close()
4995 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004996 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004997 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004998 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004999 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005000
5001 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005002 self.write_file.write(self.write_msg)
5003 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005004
5005 def testMakefileCloseSocketDestroy(self):
5006 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005007 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005008 refcount_after = sys.getrefcount(self.cli_conn)
5009 self.assertEqual(refcount_before - 1, refcount_after)
5010
5011 def _testMakefileCloseSocketDestroy(self):
5012 pass
5013
Antoine Pitrou98b46702010-09-18 22:59:00 +00005014 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00005015 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00005016 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
5017
5018 def testSmallReadNonBlocking(self):
5019 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005020 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
5021 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005022 self.evt1.set()
5023 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005024 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02005025 if first_seg is None:
5026 # Data not arrived (can happen under Windows), wait a bit
5027 time.sleep(0.5)
5028 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005029 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005030 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005031 self.assertEqual(n, 3)
5032 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00005033 self.assertEqual(msg, self.read_msg)
5034 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
5035 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005036
5037 def _testSmallReadNonBlocking(self):
5038 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005039 self.write_file.write(self.write_msg)
5040 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00005041 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03005042 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00005043 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
5044 self.serv_finished.wait(5.0)
5045
5046 def testWriteNonBlocking(self):
5047 self.cli_finished.wait(5.0)
5048 # The client thread can't skip directly - the SkipTest exception
5049 # would appear as a failure.
5050 if self.serv_skipped:
5051 self.skipTest(self.serv_skipped)
5052
5053 def _testWriteNonBlocking(self):
5054 self.serv_skipped = None
5055 self.serv_conn.setblocking(False)
5056 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02005057 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00005058 LIMIT = 10
5059 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00005060 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005061 self.assertGreater(n, 0)
5062 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005063 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005064 if n is None:
5065 # Succeeded
5066 break
5067 self.assertGreater(n, 0)
5068 else:
5069 # Let us know that this test didn't manage to establish
5070 # the expected conditions. This is not a failure in itself but,
5071 # if it happens repeatedly, the test should be fixed.
5072 self.serv_skipped = "failed to saturate the socket buffer"
5073
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005074
Guido van Rossum8c943832002-08-08 01:00:28 +00005075class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5076
5077 bufsize = 1 # Default-buffered for reading; line-buffered for writing
5078
5079
5080class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5081
5082 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00005083
Thomas Woutersb2137042007-02-01 18:02:27 +00005084
Antoine Pitrou834bd812010-10-13 16:17:14 +00005085class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5086 """Tests for socket.makefile() in text mode (rather than binary)"""
5087
5088 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005089 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005090 write_mode = 'wb'
5091 write_msg = MSG
5092 newline = ''
5093
5094
5095class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5096 """Tests for socket.makefile() in text mode (rather than binary)"""
5097
5098 read_mode = 'rb'
5099 read_msg = MSG
5100 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005101 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005102 newline = ''
5103
5104
5105class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5106 """Tests for socket.makefile() in text mode (rather than binary)"""
5107
5108 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005109 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005110 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005111 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005112 newline = ''
5113
5114
Guido van Rossumd8faa362007-04-27 19:54:29 +00005115class NetworkConnectionTest(object):
5116 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005117
Guido van Rossumd8faa362007-04-27 19:54:29 +00005118 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005119 # We're inherited below by BasicTCPTest2, which also inherits
5120 # BasicTCPTest, which defines self.port referenced below.
5121 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005122 self.serv_conn = self.cli
5123
5124class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5125 """Tests that NetworkConnection does not break existing TCP functionality.
5126 """
5127
5128class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005129
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005130 class MockSocket(socket.socket):
5131 def connect(self, *args):
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005132 raise TimeoutError('timed out')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005133
5134 @contextlib.contextmanager
5135 def mocked_socket_module(self):
5136 """Return a socket which times out on connect"""
5137 old_socket = socket.socket
5138 socket.socket = self.MockSocket
5139 try:
5140 yield
5141 finally:
5142 socket.socket = old_socket
5143
5144 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005145 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005146 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005147 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005148 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005149 cli.connect((HOST, port))
5150 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5151
5152 def test_create_connection(self):
5153 # Issue #9792: errors raised by create_connection() should have
5154 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005155 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005156 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005157 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005158
5159 # Issue #16257: create_connection() calls getaddrinfo() against
5160 # 'localhost'. This may result in an IPV6 addr being returned
5161 # as well as an IPV4 one:
5162 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5163 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5164 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5165 #
5166 # create_connection() enumerates through all the addresses returned
5167 # and if it doesn't successfully bind to any of them, it propagates
5168 # the last exception it encountered.
5169 #
5170 # On Solaris, ENETUNREACH is returned in this circumstance instead
5171 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5172 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005173 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005174 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005175
5176 def test_create_connection_timeout(self):
5177 # Issue #9792: create_connection() should not recast timeout errors
5178 # as generic socket errors.
5179 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005180 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005181 socket.create_connection((HOST, 1234))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005182 except TimeoutError:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005183 pass
5184 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005185 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005186 raise
5187 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005188 self.fail('TimeoutError not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005189
Guido van Rossumd8faa362007-04-27 19:54:29 +00005190
5191class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5192
5193 def __init__(self, methodName='runTest'):
5194 SocketTCPTest.__init__(self, methodName=methodName)
5195 ThreadableTest.__init__(self)
5196
5197 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005198 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005199
5200 def clientTearDown(self):
5201 self.cli.close()
5202 self.cli = None
5203 ThreadableTest.clientTearDown(self)
5204
5205 def _justAccept(self):
5206 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005207 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005208
5209 testFamily = _justAccept
5210 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005211 self.cli = socket.create_connection((HOST, self.port),
5212 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005213 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005214 self.assertEqual(self.cli.family, 2)
5215
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005216 testSourceAddress = _justAccept
5217 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005218 self.cli = socket.create_connection((HOST, self.port),
5219 timeout=support.LOOPBACK_TIMEOUT,
5220 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005221 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005222 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005223 # The port number being used is sufficient to show that the bind()
5224 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005225
Guido van Rossumd8faa362007-04-27 19:54:29 +00005226 testTimeoutDefault = _justAccept
5227 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005228 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005229 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005230 socket.setdefaulttimeout(42)
5231 try:
5232 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005233 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005234 finally:
5235 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005236 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005237
5238 testTimeoutNone = _justAccept
5239 def _testTimeoutNone(self):
5240 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005241 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005242 socket.setdefaulttimeout(30)
5243 try:
5244 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005245 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005246 finally:
5247 socket.setdefaulttimeout(None)
5248 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005249
5250 testTimeoutValueNamed = _justAccept
5251 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005252 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005253 self.assertEqual(self.cli.gettimeout(), 30)
5254
5255 testTimeoutValueNonamed = _justAccept
5256 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005257 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005258 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005259 self.assertEqual(self.cli.gettimeout(), 30)
5260
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005261
Guido van Rossumd8faa362007-04-27 19:54:29 +00005262class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5263
5264 def __init__(self, methodName='runTest'):
5265 SocketTCPTest.__init__(self, methodName=methodName)
5266 ThreadableTest.__init__(self)
5267
5268 def clientSetUp(self):
5269 pass
5270
5271 def clientTearDown(self):
5272 self.cli.close()
5273 self.cli = None
5274 ThreadableTest.clientTearDown(self)
5275
5276 def testInsideTimeout(self):
5277 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005278 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005279 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005280 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005281 testOutsideTimeout = testInsideTimeout
5282
5283 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005284 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005285 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005286 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005287
5288 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005289 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005290 self.assertRaises(TimeoutError, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005291
5292
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005293class TCPTimeoutTest(SocketTCPTest):
5294
5295 def testTCPTimeout(self):
5296 def raise_timeout(*args, **kwargs):
5297 self.serv.settimeout(1.0)
5298 self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005299 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005300 "Error generating a timeout exception (TCP)")
5301
5302 def testTimeoutZero(self):
5303 ok = False
5304 try:
5305 self.serv.settimeout(0.0)
5306 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005307 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005308 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005309 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005310 ok = True
5311 except:
5312 self.fail("caught unexpected exception (TCP)")
5313 if not ok:
5314 self.fail("accept() returned success when we did not expect it")
5315
Serhiy Storchaka43767632013-11-03 21:31:38 +02005316 @unittest.skipUnless(hasattr(signal, 'alarm'),
5317 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005318 def testInterruptedTimeout(self):
5319 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005320 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005321 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005322 self.serv.settimeout(5.0) # must be longer than alarm
5323 class Alarm(Exception):
5324 pass
5325 def alarm_handler(signal, frame):
5326 raise Alarm
5327 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5328 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005329 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005330 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005331 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005332 except TimeoutError:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005333 self.fail("caught timeout instead of Alarm")
5334 except Alarm:
5335 pass
5336 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005337 self.fail("caught other exception instead of Alarm:"
5338 " %s(%s):\n%s" %
5339 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005340 else:
5341 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005342 finally:
5343 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005344 except Alarm:
5345 self.fail("got Alarm in wrong place")
5346 finally:
5347 # no alarm can be pending. Safe to restore old handler.
5348 signal.signal(signal.SIGALRM, old_alarm)
5349
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005350class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005351
5352 def testUDPTimeout(self):
5353 def raise_timeout(*args, **kwargs):
5354 self.serv.settimeout(1.0)
5355 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005356 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005357 "Error generating a timeout exception (UDP)")
5358
5359 def testTimeoutZero(self):
5360 ok = False
5361 try:
5362 self.serv.settimeout(0.0)
5363 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005364 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005365 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005366 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005367 ok = True
5368 except:
5369 self.fail("caught unexpected exception (UDP)")
5370 if not ok:
5371 self.fail("recv() returned success when we did not expect it")
5372
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005373@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5374 'UDPLITE sockets required for this test.')
5375class UDPLITETimeoutTest(SocketUDPLITETest):
5376
5377 def testUDPLITETimeout(self):
5378 def raise_timeout(*args, **kwargs):
5379 self.serv.settimeout(1.0)
5380 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005381 self.assertRaises(TimeoutError, raise_timeout,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005382 "Error generating a timeout exception (UDPLITE)")
5383
5384 def testTimeoutZero(self):
5385 ok = False
5386 try:
5387 self.serv.settimeout(0.0)
5388 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005389 except TimeoutError:
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005390 self.fail("caught timeout instead of error (UDPLITE)")
5391 except OSError:
5392 ok = True
5393 except:
5394 self.fail("caught unexpected exception (UDPLITE)")
5395 if not ok:
5396 self.fail("recv() returned success when we did not expect it")
5397
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005398class TestExceptions(unittest.TestCase):
5399
5400 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005401 self.assertTrue(issubclass(OSError, Exception))
5402 self.assertTrue(issubclass(socket.herror, OSError))
5403 self.assertTrue(issubclass(socket.gaierror, OSError))
5404 self.assertTrue(issubclass(socket.timeout, OSError))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005405 self.assertIs(socket.error, OSError)
5406 self.assertIs(socket.timeout, TimeoutError)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005407
Yury Selivanovfa22b292016-10-18 16:03:52 -04005408 def test_setblocking_invalidfd(self):
5409 # Regression test for issue #28471
5410
5411 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5412 sock = socket.socket(
5413 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5414 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005415 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005416
5417 with self.assertRaises(OSError):
5418 sock.setblocking(False)
5419
5420
Serhiy Storchaka43767632013-11-03 21:31:38 +02005421@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005422class TestLinuxAbstractNamespace(unittest.TestCase):
5423
5424 UNIX_PATH_MAX = 108
5425
5426 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005427 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005428 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5429 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005430 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005431 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5432 s2.connect(s1.getsockname())
5433 with s1.accept()[0] as s3:
5434 self.assertEqual(s1.getsockname(), address)
5435 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005436
5437 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005438 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005439 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5440 s.bind(address)
5441 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005442
5443 def testNameOverflow(self):
5444 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005445 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005446 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005447
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005448 def testStrName(self):
5449 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005450 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5451 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005452 s.bind("\x00python\x00test\x00")
5453 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005454 finally:
5455 s.close()
5456
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005457 def testBytearrayName(self):
5458 # Check that an abstract name can be passed as a bytearray.
5459 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5460 s.bind(bytearray(b"\x00python\x00test\x00"))
5461 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5462
Serhiy Storchaka43767632013-11-03 21:31:38 +02005463@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005464class TestUnixDomain(unittest.TestCase):
5465
5466 def setUp(self):
5467 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5468
5469 def tearDown(self):
5470 self.sock.close()
5471
5472 def encoded(self, path):
5473 # Return the given path encoded in the file system encoding,
5474 # or skip the test if this is not possible.
5475 try:
5476 return os.fsencode(path)
5477 except UnicodeEncodeError:
5478 self.skipTest(
5479 "Pathname {0!a} cannot be represented in file "
5480 "system encoding {1!r}".format(
5481 path, sys.getfilesystemencoding()))
5482
Antoine Pitrou16374872011-12-16 15:04:12 +01005483 def bind(self, sock, path):
5484 # Bind the socket
5485 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005486 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005487 except OSError as e:
5488 if str(e) == "AF_UNIX path too long":
5489 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005490 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005491 .format(path))
5492 else:
5493 raise
5494
Antoine Pitrou495b5022017-05-02 17:20:00 +02005495 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005496 # Issue #30205 (note getsockname() can return None on OS X)
5497 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005498
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005499 def testStrAddr(self):
5500 # Test binding to and retrieving a normal string pathname.
Hai Shideb01622020-07-06 20:29:49 +08005501 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005502 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005503 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005504 self.assertEqual(self.sock.getsockname(), path)
5505
5506 def testBytesAddr(self):
5507 # Test binding to a bytes pathname.
Hai Shideb01622020-07-06 20:29:49 +08005508 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005509 self.bind(self.sock, self.encoded(path))
Hai Shideb01622020-07-06 20:29:49 +08005510 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005511 self.assertEqual(self.sock.getsockname(), path)
5512
5513 def testSurrogateescapeBind(self):
5514 # Test binding to a valid non-ASCII pathname, with the
5515 # non-ASCII bytes supplied using surrogateescape encoding.
Hai Shideb01622020-07-06 20:29:49 +08005516 path = os.path.abspath(os_helper.TESTFN_UNICODE)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005517 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005518 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Hai Shideb01622020-07-06 20:29:49 +08005519 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005520 self.assertEqual(self.sock.getsockname(), path)
5521
5522 def testUnencodableAddr(self):
5523 # Test binding to a pathname that cannot be encoded in the
5524 # file system encoding.
Hai Shideb01622020-07-06 20:29:49 +08005525 if os_helper.TESTFN_UNENCODABLE is None:
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005526 self.skipTest("No unencodable filename available")
Hai Shideb01622020-07-06 20:29:49 +08005527 path = os.path.abspath(os_helper.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005528 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005529 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005530 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005531
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005532
Thomas Wouters477c8d52006-05-27 19:21:47 +00005533class BufferIOTest(SocketConnectedTest):
5534 """
5535 Test the buffer versions of socket.recv() and socket.send().
5536 """
5537 def __init__(self, methodName='runTest'):
5538 SocketConnectedTest.__init__(self, methodName=methodName)
5539
Antoine Pitrou25480782010-03-17 22:50:28 +00005540 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005541 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005542 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005543 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005544 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005545 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005546 self.assertEqual(msg, MSG)
5547
Antoine Pitrou25480782010-03-17 22:50:28 +00005548 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005549 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005550 self.serv_conn.send(buf)
5551
Antoine Pitrou25480782010-03-17 22:50:28 +00005552 def testRecvIntoBytearray(self):
5553 buf = bytearray(1024)
5554 nbytes = self.cli_conn.recv_into(buf)
5555 self.assertEqual(nbytes, len(MSG))
5556 msg = buf[:len(MSG)]
5557 self.assertEqual(msg, MSG)
5558
5559 _testRecvIntoBytearray = _testRecvIntoArray
5560
5561 def testRecvIntoMemoryview(self):
5562 buf = bytearray(1024)
5563 nbytes = self.cli_conn.recv_into(memoryview(buf))
5564 self.assertEqual(nbytes, len(MSG))
5565 msg = buf[:len(MSG)]
5566 self.assertEqual(msg, MSG)
5567
5568 _testRecvIntoMemoryview = _testRecvIntoArray
5569
5570 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005571 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005572 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005573 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005574 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005575 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005576 self.assertEqual(msg, MSG)
5577
Antoine Pitrou25480782010-03-17 22:50:28 +00005578 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005579 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005580 self.serv_conn.send(buf)
5581
Antoine Pitrou25480782010-03-17 22:50:28 +00005582 def testRecvFromIntoBytearray(self):
5583 buf = bytearray(1024)
5584 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5585 self.assertEqual(nbytes, len(MSG))
5586 msg = buf[:len(MSG)]
5587 self.assertEqual(msg, MSG)
5588
5589 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5590
5591 def testRecvFromIntoMemoryview(self):
5592 buf = bytearray(1024)
5593 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5594 self.assertEqual(nbytes, len(MSG))
5595 msg = buf[:len(MSG)]
5596 self.assertEqual(msg, MSG)
5597
5598 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5599
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005600 def testRecvFromIntoSmallBuffer(self):
5601 # See issue #20246.
5602 buf = bytearray(8)
5603 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5604
5605 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005606 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005607
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005608 def testRecvFromIntoEmptyBuffer(self):
5609 buf = bytearray()
5610 self.cli_conn.recvfrom_into(buf)
5611 self.cli_conn.recvfrom_into(buf, 0)
5612
5613 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5614
Christian Heimes043d6f62008-01-07 17:19:16 +00005615
5616TIPC_STYPE = 2000
5617TIPC_LOWER = 200
5618TIPC_UPPER = 210
5619
5620def isTipcAvailable():
5621 """Check if the TIPC module is loaded
5622
5623 The TIPC module is not loaded automatically on Ubuntu and probably
5624 other Linux distros.
5625 """
5626 if not hasattr(socket, "AF_TIPC"):
5627 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005628 try:
Inada Naokicfe523b2021-04-27 13:16:28 +09005629 f = open("/proc/modules", encoding="utf-8")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005630 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005631 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005632 # have not the permission to read it.
5633 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005634 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005635 for line in f:
5636 if line.startswith("tipc "):
5637 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005638 return False
5639
Serhiy Storchaka43767632013-11-03 21:31:38 +02005640@unittest.skipUnless(isTipcAvailable(),
5641 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005642class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005643 def testRDM(self):
5644 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5645 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005646 self.addCleanup(srv.close)
5647 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005648
5649 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5650 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5651 TIPC_LOWER, TIPC_UPPER)
5652 srv.bind(srvaddr)
5653
5654 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5655 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5656 cli.sendto(MSG, sendaddr)
5657
5658 msg, recvaddr = srv.recvfrom(1024)
5659
5660 self.assertEqual(cli.getsockname(), recvaddr)
5661 self.assertEqual(msg, MSG)
5662
5663
Serhiy Storchaka43767632013-11-03 21:31:38 +02005664@unittest.skipUnless(isTipcAvailable(),
5665 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005666class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005667 def __init__(self, methodName = 'runTest'):
5668 unittest.TestCase.__init__(self, methodName = methodName)
5669 ThreadableTest.__init__(self)
5670
5671 def setUp(self):
5672 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005673 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005674 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5675 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5676 TIPC_LOWER, TIPC_UPPER)
5677 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005678 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005679 self.serverExplicitReady()
5680 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005681 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005682
5683 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005684 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005685 # accept() call; sleep a little while to avoid it, otherwise
5686 # we could get an exception
5687 time.sleep(0.1)
5688 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005689 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005690 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5691 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5692 self.cli.connect(addr)
5693 self.cliaddr = self.cli.getsockname()
5694
5695 def testStream(self):
5696 msg = self.conn.recv(1024)
5697 self.assertEqual(msg, MSG)
5698 self.assertEqual(self.cliaddr, self.connaddr)
5699
5700 def _testStream(self):
5701 self.cli.send(MSG)
5702 self.cli.close()
5703
5704
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005705class ContextManagersTest(ThreadedTCPSocketTest):
5706
5707 def _testSocketClass(self):
5708 # base test
5709 with socket.socket() as sock:
5710 self.assertFalse(sock._closed)
5711 self.assertTrue(sock._closed)
5712 # close inside with block
5713 with socket.socket() as sock:
5714 sock.close()
5715 self.assertTrue(sock._closed)
5716 # exception inside with block
5717 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005718 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005719 self.assertTrue(sock._closed)
5720
5721 def testCreateConnectionBase(self):
5722 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005723 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005724 data = conn.recv(1024)
5725 conn.sendall(data)
5726
5727 def _testCreateConnectionBase(self):
5728 address = self.serv.getsockname()
5729 with socket.create_connection(address) as sock:
5730 self.assertFalse(sock._closed)
5731 sock.sendall(b'foo')
5732 self.assertEqual(sock.recv(1024), b'foo')
5733 self.assertTrue(sock._closed)
5734
5735 def testCreateConnectionClose(self):
5736 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005737 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005738 data = conn.recv(1024)
5739 conn.sendall(data)
5740
5741 def _testCreateConnectionClose(self):
5742 address = self.serv.getsockname()
5743 with socket.create_connection(address) as sock:
5744 sock.close()
5745 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005746 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005747
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005748
Victor Stinnerdaf45552013-08-28 00:53:59 +02005749class InheritanceTest(unittest.TestCase):
5750 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5751 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005752 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005753 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005754 with socket.socket(socket.AF_INET,
5755 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005756 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005757 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005758
5759 def test_default_inheritable(self):
5760 sock = socket.socket()
5761 with sock:
5762 self.assertEqual(sock.get_inheritable(), False)
5763
5764 def test_dup(self):
5765 sock = socket.socket()
5766 with sock:
5767 newsock = sock.dup()
5768 sock.close()
5769 with newsock:
5770 self.assertEqual(newsock.get_inheritable(), False)
5771
5772 def test_set_inheritable(self):
5773 sock = socket.socket()
5774 with sock:
5775 sock.set_inheritable(True)
5776 self.assertEqual(sock.get_inheritable(), True)
5777
5778 sock.set_inheritable(False)
5779 self.assertEqual(sock.get_inheritable(), False)
5780
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005781 @unittest.skipIf(fcntl is None, "need fcntl")
5782 def test_get_inheritable_cloexec(self):
5783 sock = socket.socket()
5784 with sock:
5785 fd = sock.fileno()
5786 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005787
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005788 # clear FD_CLOEXEC flag
5789 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5790 flags &= ~fcntl.FD_CLOEXEC
5791 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005792
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005793 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005794
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005795 @unittest.skipIf(fcntl is None, "need fcntl")
5796 def test_set_inheritable_cloexec(self):
5797 sock = socket.socket()
5798 with sock:
5799 fd = sock.fileno()
5800 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5801 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005802
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005803 sock.set_inheritable(True)
5804 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5805 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005806
5807
Victor Stinnerdaf45552013-08-28 00:53:59 +02005808 def test_socketpair(self):
5809 s1, s2 = socket.socketpair()
5810 self.addCleanup(s1.close)
5811 self.addCleanup(s2.close)
5812 self.assertEqual(s1.get_inheritable(), False)
5813 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005814
5815
5816@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5817 "SOCK_NONBLOCK not defined")
5818class NonblockConstantTest(unittest.TestCase):
5819 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5820 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005821 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005822 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005823 self.assertTrue(
5824 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005825 if timeout == 0:
5826 # timeout == 0: means that getblocking() must be False.
5827 self.assertFalse(s.getblocking())
5828 else:
5829 # If timeout > 0, the socket will be in a "blocking" mode
5830 # from the standpoint of the Python API. For Python socket
5831 # object, "blocking" means that operations like 'sock.recv()'
5832 # will block. Internally, file descriptors for
5833 # "blocking" Python sockets *with timeouts* are in a
5834 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5835 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5836 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005837 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005838 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005839 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005840 self.assertFalse(
5841 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005842 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005843
Charles-François Natali239bb962011-06-03 12:55:15 +02005844 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005845 def test_SOCK_NONBLOCK(self):
5846 # a lot of it seems silly and redundant, but I wanted to test that
5847 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005848 with socket.socket(socket.AF_INET,
5849 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5850 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005851 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005852 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005853 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005854 self.checkNonblock(s)
5855 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005856 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005857 s.settimeout(2.0)
5858 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005859 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005860 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005861 # defaulttimeout
5862 t = socket.getdefaulttimeout()
5863 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005864 with socket.socket() as s:
5865 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005866 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005867 with socket.socket() as s:
5868 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005869 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005870 with socket.socket() as s:
5871 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005872 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005873 with socket.socket() as s:
5874 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005875 socket.setdefaulttimeout(t)
5876
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005877
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005878@unittest.skipUnless(os.name == "nt", "Windows specific")
5879@unittest.skipUnless(multiprocessing, "need multiprocessing")
5880class TestSocketSharing(SocketTCPTest):
5881 # This must be classmethod and not staticmethod or multiprocessing
5882 # won't be able to bootstrap it.
5883 @classmethod
5884 def remoteProcessServer(cls, q):
5885 # Recreate socket from shared data
5886 sdata = q.get()
5887 message = q.get()
5888
5889 s = socket.fromshare(sdata)
5890 s2, c = s.accept()
5891
5892 # Send the message
5893 s2.sendall(message)
5894 s2.close()
5895 s.close()
5896
5897 def testShare(self):
5898 # Transfer the listening server socket to another process
5899 # and service it from there.
5900
5901 # Create process:
5902 q = multiprocessing.Queue()
5903 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5904 p.start()
5905
5906 # Get the shared socket data
5907 data = self.serv.share(p.pid)
5908
5909 # Pass the shared socket to the other process
5910 addr = self.serv.getsockname()
5911 self.serv.close()
5912 q.put(data)
5913
5914 # The data that the server will send us
5915 message = b"slapmahfro"
5916 q.put(message)
5917
5918 # Connect
5919 s = socket.create_connection(addr)
5920 # listen for the data
5921 m = []
5922 while True:
5923 data = s.recv(100)
5924 if not data:
5925 break
5926 m.append(data)
5927 s.close()
5928 received = b"".join(m)
5929 self.assertEqual(received, message)
5930 p.join()
5931
5932 def testShareLength(self):
5933 data = self.serv.share(os.getpid())
5934 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5935 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5936
5937 def compareSockets(self, org, other):
5938 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005939 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005940 self.assertEqual(org.gettimeout(), None)
5941 self.assertEqual(org.gettimeout(), other.gettimeout())
5942
5943 self.assertEqual(org.family, other.family)
5944 self.assertEqual(org.type, other.type)
5945 # If the user specified "0" for proto, then
5946 # internally windows will have picked the correct value.
5947 # Python introspection on the socket however will still return
5948 # 0. For the shared socket, the python value is recreated
5949 # from the actual value, so it may not compare correctly.
5950 if org.proto != 0:
5951 self.assertEqual(org.proto, other.proto)
5952
5953 def testShareLocal(self):
5954 data = self.serv.share(os.getpid())
5955 s = socket.fromshare(data)
5956 try:
5957 self.compareSockets(self.serv, s)
5958 finally:
5959 s.close()
5960
5961 def testTypes(self):
5962 families = [socket.AF_INET, socket.AF_INET6]
5963 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5964 for f in families:
5965 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005966 try:
5967 source = socket.socket(f, t)
5968 except OSError:
5969 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005970 try:
5971 data = source.share(os.getpid())
5972 shared = socket.fromshare(data)
5973 try:
5974 self.compareSockets(source, shared)
5975 finally:
5976 shared.close()
5977 finally:
5978 source.close()
5979
5980
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005981class SendfileUsingSendTest(ThreadedTCPSocketTest):
5982 """
5983 Test the send() implementation of socket.sendfile().
5984 """
5985
Victor Stinner8c663fd2017-11-08 14:44:44 -08005986 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005987 BUFSIZE = 8192
5988 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005989 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005990
5991 @classmethod
5992 def setUpClass(cls):
5993 def chunks(total, step):
5994 assert total >= step
5995 while total > step:
5996 yield step
5997 total -= step
5998 if total:
5999 yield total
6000
6001 chunk = b"".join([random.choice(string.ascii_letters).encode()
6002 for i in range(cls.BUFSIZE)])
Hai Shideb01622020-07-06 20:29:49 +08006003 with open(os_helper.TESTFN, 'wb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006004 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
6005 f.write(chunk)
Hai Shideb01622020-07-06 20:29:49 +08006006 with open(os_helper.TESTFN, 'rb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006007 cls.FILEDATA = f.read()
6008 assert len(cls.FILEDATA) == cls.FILESIZE
6009
6010 @classmethod
6011 def tearDownClass(cls):
Hai Shideb01622020-07-06 20:29:49 +08006012 os_helper.unlink(os_helper.TESTFN)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006013
6014 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01006015 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006016 conn, addr = self.serv.accept()
6017 conn.settimeout(self.TIMEOUT)
6018 self.addCleanup(conn.close)
6019 return conn
6020
6021 def recv_data(self, conn):
6022 received = []
6023 while True:
6024 chunk = conn.recv(self.BUFSIZE)
6025 if not chunk:
6026 break
6027 received.append(chunk)
6028 return b''.join(received)
6029
6030 def meth_from_sock(self, sock):
6031 # Depending on the mixin class being run return either send()
6032 # or sendfile() method implementation.
6033 return getattr(sock, "_sendfile_use_send")
6034
6035 # regular file
6036
6037 def _testRegularFile(self):
6038 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006039 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006040 with socket.create_connection(address) as sock, file as file:
6041 meth = self.meth_from_sock(sock)
6042 sent = meth(file)
6043 self.assertEqual(sent, self.FILESIZE)
6044 self.assertEqual(file.tell(), self.FILESIZE)
6045
6046 def testRegularFile(self):
6047 conn = self.accept_conn()
6048 data = self.recv_data(conn)
6049 self.assertEqual(len(data), self.FILESIZE)
6050 self.assertEqual(data, self.FILEDATA)
6051
6052 # non regular file
6053
6054 def _testNonRegularFile(self):
6055 address = self.serv.getsockname()
6056 file = io.BytesIO(self.FILEDATA)
6057 with socket.create_connection(address) as sock, file as file:
6058 sent = sock.sendfile(file)
6059 self.assertEqual(sent, self.FILESIZE)
6060 self.assertEqual(file.tell(), self.FILESIZE)
6061 self.assertRaises(socket._GiveupOnSendfile,
6062 sock._sendfile_use_sendfile, file)
6063
6064 def testNonRegularFile(self):
6065 conn = self.accept_conn()
6066 data = self.recv_data(conn)
6067 self.assertEqual(len(data), self.FILESIZE)
6068 self.assertEqual(data, self.FILEDATA)
6069
6070 # empty file
6071
6072 def _testEmptyFileSend(self):
6073 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006074 filename = os_helper.TESTFN + "2"
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006075 with open(filename, 'wb'):
Hai Shideb01622020-07-06 20:29:49 +08006076 self.addCleanup(os_helper.unlink, filename)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006077 file = open(filename, 'rb')
6078 with socket.create_connection(address) as sock, file as file:
6079 meth = self.meth_from_sock(sock)
6080 sent = meth(file)
6081 self.assertEqual(sent, 0)
6082 self.assertEqual(file.tell(), 0)
6083
6084 def testEmptyFileSend(self):
6085 conn = self.accept_conn()
6086 data = self.recv_data(conn)
6087 self.assertEqual(data, b"")
6088
6089 # offset
6090
6091 def _testOffset(self):
6092 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006093 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006094 with socket.create_connection(address) as sock, file as file:
6095 meth = self.meth_from_sock(sock)
6096 sent = meth(file, offset=5000)
6097 self.assertEqual(sent, self.FILESIZE - 5000)
6098 self.assertEqual(file.tell(), self.FILESIZE)
6099
6100 def testOffset(self):
6101 conn = self.accept_conn()
6102 data = self.recv_data(conn)
6103 self.assertEqual(len(data), self.FILESIZE - 5000)
6104 self.assertEqual(data, self.FILEDATA[5000:])
6105
6106 # count
6107
6108 def _testCount(self):
6109 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006110 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006111 sock = socket.create_connection(address,
6112 timeout=support.LOOPBACK_TIMEOUT)
6113 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006114 count = 5000007
6115 meth = self.meth_from_sock(sock)
6116 sent = meth(file, count=count)
6117 self.assertEqual(sent, count)
6118 self.assertEqual(file.tell(), count)
6119
6120 def testCount(self):
6121 count = 5000007
6122 conn = self.accept_conn()
6123 data = self.recv_data(conn)
6124 self.assertEqual(len(data), count)
6125 self.assertEqual(data, self.FILEDATA[:count])
6126
6127 # count small
6128
6129 def _testCountSmall(self):
6130 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006131 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006132 sock = socket.create_connection(address,
6133 timeout=support.LOOPBACK_TIMEOUT)
6134 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006135 count = 1
6136 meth = self.meth_from_sock(sock)
6137 sent = meth(file, count=count)
6138 self.assertEqual(sent, count)
6139 self.assertEqual(file.tell(), count)
6140
6141 def testCountSmall(self):
6142 count = 1
6143 conn = self.accept_conn()
6144 data = self.recv_data(conn)
6145 self.assertEqual(len(data), count)
6146 self.assertEqual(data, self.FILEDATA[:count])
6147
6148 # count + offset
6149
6150 def _testCountWithOffset(self):
6151 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006152 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006153 with socket.create_connection(address, timeout=2) as sock, file as file:
6154 count = 100007
6155 meth = self.meth_from_sock(sock)
6156 sent = meth(file, offset=2007, count=count)
6157 self.assertEqual(sent, count)
6158 self.assertEqual(file.tell(), count + 2007)
6159
6160 def testCountWithOffset(self):
6161 count = 100007
6162 conn = self.accept_conn()
6163 data = self.recv_data(conn)
6164 self.assertEqual(len(data), count)
6165 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6166
6167 # non blocking sockets are not supposed to work
6168
6169 def _testNonBlocking(self):
6170 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006171 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006172 with socket.create_connection(address) as sock, file as file:
6173 sock.setblocking(False)
6174 meth = self.meth_from_sock(sock)
6175 self.assertRaises(ValueError, meth, file)
6176 self.assertRaises(ValueError, sock.sendfile, file)
6177
6178 def testNonBlocking(self):
6179 conn = self.accept_conn()
6180 if conn.recv(8192):
6181 self.fail('was not supposed to receive any data')
6182
6183 # timeout (non-triggered)
6184
6185 def _testWithTimeout(self):
6186 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006187 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006188 sock = socket.create_connection(address,
6189 timeout=support.LOOPBACK_TIMEOUT)
6190 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006191 meth = self.meth_from_sock(sock)
6192 sent = meth(file)
6193 self.assertEqual(sent, self.FILESIZE)
6194
6195 def testWithTimeout(self):
6196 conn = self.accept_conn()
6197 data = self.recv_data(conn)
6198 self.assertEqual(len(data), self.FILESIZE)
6199 self.assertEqual(data, self.FILEDATA)
6200
6201 # timeout (triggered)
6202
6203 def _testWithTimeoutTriggeredSend(self):
6204 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006205 with open(os_helper.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006206 with socket.create_connection(address) as sock:
6207 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006208 meth = self.meth_from_sock(sock)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01006209 self.assertRaises(TimeoutError, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006210
6211 def testWithTimeoutTriggeredSend(self):
6212 conn = self.accept_conn()
6213 conn.recv(88192)
6214
6215 # errors
6216
6217 def _test_errors(self):
6218 pass
6219
6220 def test_errors(self):
Hai Shideb01622020-07-06 20:29:49 +08006221 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006222 with socket.socket(type=socket.SOCK_DGRAM) as s:
6223 meth = self.meth_from_sock(s)
6224 self.assertRaisesRegex(
6225 ValueError, "SOCK_STREAM", meth, file)
Inada Naokicfe523b2021-04-27 13:16:28 +09006226 with open(os_helper.TESTFN, encoding="utf-8") as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006227 with socket.socket() as s:
6228 meth = self.meth_from_sock(s)
6229 self.assertRaisesRegex(
6230 ValueError, "binary mode", meth, file)
Hai Shideb01622020-07-06 20:29:49 +08006231 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006232 with socket.socket() as s:
6233 meth = self.meth_from_sock(s)
6234 self.assertRaisesRegex(TypeError, "positive integer",
6235 meth, file, count='2')
6236 self.assertRaisesRegex(TypeError, "positive integer",
6237 meth, file, count=0.1)
6238 self.assertRaisesRegex(ValueError, "positive integer",
6239 meth, file, count=0)
6240 self.assertRaisesRegex(ValueError, "positive integer",
6241 meth, file, count=-1)
6242
6243
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006244@unittest.skipUnless(hasattr(os, "sendfile"),
6245 'os.sendfile() required for this test.')
6246class SendfileUsingSendfileTest(SendfileUsingSendTest):
6247 """
6248 Test the sendfile() implementation of socket.sendfile().
6249 """
6250 def meth_from_sock(self, sock):
6251 return getattr(sock, "_sendfile_use_sendfile")
6252
Christian Heimes48371412016-09-06 00:37:46 +02006253
6254@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006255class LinuxKernelCryptoAPI(unittest.TestCase):
6256 # tests for AF_ALG
6257 def create_alg(self, typ, name):
6258 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006259 try:
6260 sock.bind((typ, name))
6261 except FileNotFoundError as e:
6262 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006263 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006264 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006265 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006266 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006267
Victor Stinner86afc1f2017-11-30 13:58:43 +01006268 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6269 # at least on ppc64le architecture
6270 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006271 def test_sha256(self):
6272 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6273 "177a9cb410ff61f20015ad")
6274 with self.create_alg('hash', 'sha256') as algo:
6275 op, _ = algo.accept()
6276 with op:
6277 op.sendall(b"abc")
6278 self.assertEqual(op.recv(512), expected)
6279
6280 op, _ = algo.accept()
6281 with op:
6282 op.send(b'a', socket.MSG_MORE)
6283 op.send(b'b', socket.MSG_MORE)
6284 op.send(b'c', socket.MSG_MORE)
6285 op.send(b'')
6286 self.assertEqual(op.recv(512), expected)
6287
6288 def test_hmac_sha1(self):
6289 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6290 with self.create_alg('hash', 'hmac(sha1)') as algo:
6291 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6292 op, _ = algo.accept()
6293 with op:
6294 op.sendall(b"what do ya want for nothing?")
6295 self.assertEqual(op.recv(512), expected)
6296
Christian Heimese084f842016-09-11 20:11:30 +02006297 # Although it should work with 3.19 and newer the test blocks on
6298 # Ubuntu 15.10 with Kernel 4.2.0-19.
6299 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006300 def test_aes_cbc(self):
6301 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6302 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6303 msg = b"Single block msg"
6304 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6305 msglen = len(msg)
6306 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6307 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6308 op, _ = algo.accept()
6309 with op:
6310 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6311 flags=socket.MSG_MORE)
6312 op.sendall(msg)
6313 self.assertEqual(op.recv(msglen), ciphertext)
6314
6315 op, _ = algo.accept()
6316 with op:
6317 op.sendmsg_afalg([ciphertext],
6318 op=socket.ALG_OP_DECRYPT, iv=iv)
6319 self.assertEqual(op.recv(msglen), msg)
6320
6321 # long message
6322 multiplier = 1024
6323 longmsg = [msg] * multiplier
6324 op, _ = algo.accept()
6325 with op:
6326 op.sendmsg_afalg(longmsg,
6327 op=socket.ALG_OP_ENCRYPT, iv=iv)
6328 enc = op.recv(msglen * multiplier)
6329 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006330 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006331
6332 op, _ = algo.accept()
6333 with op:
6334 op.sendmsg_afalg([enc],
6335 op=socket.ALG_OP_DECRYPT, iv=iv)
6336 dec = op.recv(msglen * multiplier)
6337 self.assertEqual(len(dec), msglen * multiplier)
6338 self.assertEqual(dec, msg * multiplier)
6339
matejcik9764c152017-02-16 14:41:31 +01006340 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006341 def test_aead_aes_gcm(self):
6342 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6343 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6344 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6345 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6346 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6347 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6348
6349 taglen = len(expected_tag)
6350 assoclen = len(assoc)
6351
6352 with self.create_alg('aead', 'gcm(aes)') as algo:
6353 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6354 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6355 None, taglen)
6356
6357 # send assoc, plain and tag buffer in separate steps
6358 op, _ = algo.accept()
6359 with op:
6360 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6361 assoclen=assoclen, flags=socket.MSG_MORE)
6362 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006363 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006364 res = op.recv(assoclen + len(plain) + taglen)
6365 self.assertEqual(expected_ct, res[assoclen:-taglen])
6366 self.assertEqual(expected_tag, res[-taglen:])
6367
6368 # now with msg
6369 op, _ = algo.accept()
6370 with op:
matejcik9764c152017-02-16 14:41:31 +01006371 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006372 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6373 assoclen=assoclen)
6374 res = op.recv(assoclen + len(plain) + taglen)
6375 self.assertEqual(expected_ct, res[assoclen:-taglen])
6376 self.assertEqual(expected_tag, res[-taglen:])
6377
6378 # create anc data manually
6379 pack_uint32 = struct.Struct('I').pack
6380 op, _ = algo.accept()
6381 with op:
matejcik9764c152017-02-16 14:41:31 +01006382 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006383 op.sendmsg(
6384 [msg],
6385 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6386 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6387 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6388 )
6389 )
matejcik9764c152017-02-16 14:41:31 +01006390 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006391 self.assertEqual(expected_ct, res[assoclen:-taglen])
6392 self.assertEqual(expected_tag, res[-taglen:])
6393
6394 # decrypt and verify
6395 op, _ = algo.accept()
6396 with op:
6397 msg = assoc + expected_ct + expected_tag
6398 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6399 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006400 res = op.recv(len(msg) - taglen)
6401 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006402
Christian Heimese084f842016-09-11 20:11:30 +02006403 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006404 def test_drbg_pr_sha256(self):
6405 # deterministic random bit generator, prediction resistance, sha256
6406 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6407 extra_seed = os.urandom(32)
6408 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6409 op, _ = algo.accept()
6410 with op:
6411 rn = op.recv(32)
6412 self.assertEqual(len(rn), 32)
6413
6414 def test_sendmsg_afalg_args(self):
6415 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006416 with sock:
6417 with self.assertRaises(TypeError):
6418 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006419
Christian Heimes02b30352016-09-11 19:49:56 +02006420 with self.assertRaises(TypeError):
6421 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006422
Christian Heimes02b30352016-09-11 19:49:56 +02006423 with self.assertRaises(TypeError):
6424 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006425
Christian Heimes02b30352016-09-11 19:49:56 +02006426 with self.assertRaises(TypeError):
6427 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006428
Christian Heimes02b30352016-09-11 19:49:56 +02006429 with self.assertRaises(TypeError):
6430 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6431
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006432 def test_length_restriction(self):
6433 # bpo-35050, off-by-one error in length check
6434 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6435 self.addCleanup(sock.close)
6436
6437 # salg_type[14]
6438 with self.assertRaises(FileNotFoundError):
6439 sock.bind(("t" * 13, "name"))
6440 with self.assertRaisesRegex(ValueError, "type too long"):
6441 sock.bind(("t" * 14, "name"))
6442
6443 # salg_name[64]
6444 with self.assertRaises(FileNotFoundError):
6445 sock.bind(("type", "n" * 63))
6446 with self.assertRaisesRegex(ValueError, "name too long"):
6447 sock.bind(("type", "n" * 64))
6448
6449
animalize19e7d482018-02-27 02:10:36 +08006450@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6451class TestMSWindowsTCPFlags(unittest.TestCase):
6452 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006453 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006454 'TCP_MAXSEG',
6455 'TCP_NODELAY',
6456 # available starting with Windows 10 1607
6457 'TCP_FASTOPEN',
6458 # available starting with Windows 10 1703
6459 'TCP_KEEPCNT',
6460 # available starting with Windows 10 1709
6461 'TCP_KEEPIDLE',
6462 'TCP_KEEPINTVL'
6463 }
6464
6465 def test_new_tcp_flags(self):
6466 provided = [s for s in dir(socket) if s.startswith('TCP')]
6467 unknown = [s for s in provided if s not in self.knownTCPFlags]
6468
6469 self.assertEqual([], unknown,
6470 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006471
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006472
6473class CreateServerTest(unittest.TestCase):
6474
6475 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006476 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006477 with socket.create_server(("127.0.0.1", port)) as sock:
6478 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6479 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006480 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006481 with socket.create_server(("::1", port),
6482 family=socket.AF_INET6) as sock:
6483 self.assertEqual(sock.getsockname()[0], "::1")
6484 self.assertEqual(sock.getsockname()[1], port)
6485
6486 def test_family_and_type(self):
6487 with socket.create_server(("127.0.0.1", 0)) as sock:
6488 self.assertEqual(sock.family, socket.AF_INET)
6489 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006490 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006491 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6492 self.assertEqual(s.family, socket.AF_INET6)
6493 self.assertEqual(sock.type, socket.SOCK_STREAM)
6494
6495 def test_reuse_port(self):
6496 if not hasattr(socket, "SO_REUSEPORT"):
6497 with self.assertRaises(ValueError):
6498 socket.create_server(("localhost", 0), reuse_port=True)
6499 else:
6500 with socket.create_server(("localhost", 0)) as sock:
6501 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6502 self.assertEqual(opt, 0)
6503 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6504 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6505 self.assertNotEqual(opt, 0)
6506
6507 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6508 not hasattr(_socket, 'IPV6_V6ONLY'),
6509 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006510 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006511 def test_ipv6_only_default(self):
6512 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6513 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6514
6515 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6516 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006517 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006518 def test_dualstack_ipv6_family(self):
6519 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6520 dualstack_ipv6=True) as sock:
6521 self.assertEqual(sock.family, socket.AF_INET6)
6522
6523
6524class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006525 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006526
6527 def setUp(self):
6528 self.thread = None
6529
6530 def tearDown(self):
6531 if self.thread is not None:
6532 self.thread.join(self.timeout)
6533
6534 def echo_server(self, sock):
6535 def run(sock):
6536 with sock:
6537 conn, _ = sock.accept()
6538 with conn:
6539 event.wait(self.timeout)
6540 msg = conn.recv(1024)
6541 if not msg:
6542 return
6543 conn.sendall(msg)
6544
6545 event = threading.Event()
6546 sock.settimeout(self.timeout)
6547 self.thread = threading.Thread(target=run, args=(sock, ))
6548 self.thread.start()
6549 event.set()
6550
6551 def echo_client(self, addr, family):
6552 with socket.socket(family=family) as sock:
6553 sock.settimeout(self.timeout)
6554 sock.connect(addr)
6555 sock.sendall(b'foo')
6556 self.assertEqual(sock.recv(1024), b'foo')
6557
6558 def test_tcp4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006559 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006560 with socket.create_server(("", port)) as sock:
6561 self.echo_server(sock)
6562 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6563
Serhiy Storchaka16994912020-04-25 10:06:29 +03006564 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006565 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006566 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006567 with socket.create_server(("", port),
6568 family=socket.AF_INET6) as sock:
6569 self.echo_server(sock)
6570 self.echo_client(("::1", port), socket.AF_INET6)
6571
6572 # --- dual stack tests
6573
6574 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6575 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006576 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006577 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006578 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006579 with socket.create_server(("", port), family=socket.AF_INET6,
6580 dualstack_ipv6=True) as sock:
6581 self.echo_server(sock)
6582 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6583
6584 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6585 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006586 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006587 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006588 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006589 with socket.create_server(("", port), family=socket.AF_INET6,
6590 dualstack_ipv6=True) as sock:
6591 self.echo_server(sock)
6592 self.echo_client(("::1", port), socket.AF_INET6)
6593
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006594@requireAttrs(socket, "send_fds")
6595@requireAttrs(socket, "recv_fds")
6596@requireAttrs(socket, "AF_UNIX")
6597class SendRecvFdsTests(unittest.TestCase):
6598 def testSendAndRecvFds(self):
6599 def close_pipes(pipes):
6600 for fd1, fd2 in pipes:
6601 os.close(fd1)
6602 os.close(fd2)
6603
6604 def close_fds(fds):
6605 for fd in fds:
6606 os.close(fd)
6607
6608 # send 10 file descriptors
6609 pipes = [os.pipe() for _ in range(10)]
6610 self.addCleanup(close_pipes, pipes)
6611 fds = [rfd for rfd, wfd in pipes]
6612
6613 # use a UNIX socket pair to exchange file descriptors locally
6614 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6615 with sock1, sock2:
6616 socket.send_fds(sock1, [MSG], fds)
6617 # request more data and file descriptors than expected
6618 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6619 self.addCleanup(close_fds, fds2)
6620
6621 self.assertEqual(msg, MSG)
6622 self.assertEqual(len(fds2), len(fds))
6623 self.assertEqual(flags, 0)
6624 # don't test addr
6625
6626 # test that file descriptors are connected
6627 for index, fds in enumerate(pipes):
6628 rfd, wfd = fds
6629 os.write(wfd, str(index).encode())
6630
6631 for index, rfd in enumerate(fds2):
6632 data = os.read(rfd, 100)
6633 self.assertEqual(data, str(index).encode())
6634
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006635
Guido van Rossumb995eb72002-07-31 16:08:40 +00006636def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006637 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006638 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006639 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6640 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006641
6642 tests.extend([
6643 NonBlockingTCPTests,
6644 FileObjectClassTestCase,
6645 UnbufferedFileObjectClassTestCase,
6646 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006647 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006648 UnicodeReadFileObjectClassTestCase,
6649 UnicodeWriteFileObjectClassTestCase,
6650 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006651 NetworkConnectionNoServer,
6652 NetworkConnectionAttributesTest,
6653 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006654 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006655 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006656 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006657 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006658 tests.append(BasicSocketPairTest)
6659 tests.append(TestUnixDomain)
6660 tests.append(TestLinuxAbstractNamespace)
6661 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006662 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006663 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006664 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006665 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006666 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006667 BasicVSOCKTest,
6668 ThreadedVSOCKSocketStreamTest,
6669 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006670 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006671 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006672 CmsgMacroTests,
6673 SendmsgUDPTest,
6674 RecvmsgUDPTest,
6675 RecvmsgIntoUDPTest,
6676 SendmsgUDP6Test,
6677 RecvmsgUDP6Test,
6678 RecvmsgRFC3542AncillaryUDP6Test,
6679 RecvmsgIntoRFC3542AncillaryUDP6Test,
6680 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006681 SendmsgUDPLITETest,
6682 RecvmsgUDPLITETest,
6683 RecvmsgIntoUDPLITETest,
6684 SendmsgUDPLITE6Test,
6685 RecvmsgUDPLITE6Test,
6686 RecvmsgRFC3542AncillaryUDPLITE6Test,
6687 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6688 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006689 SendmsgTCPTest,
6690 RecvmsgTCPTest,
6691 RecvmsgIntoTCPTest,
6692 SendmsgSCTPStreamTest,
6693 RecvmsgSCTPStreamTest,
6694 RecvmsgIntoSCTPStreamTest,
6695 SendmsgUnixStreamTest,
6696 RecvmsgUnixStreamTest,
6697 RecvmsgIntoUnixStreamTest,
6698 RecvmsgSCMRightsStreamTest,
6699 RecvmsgIntoSCMRightsStreamTest,
6700 # These are slow when setitimer() is not available
6701 InterruptedRecvTimeoutTest,
6702 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006703 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006704 SendfileUsingSendTest,
6705 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006706 ])
animalize19e7d482018-02-27 02:10:36 +08006707 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006708
Hai Shie80697d2020-05-28 06:10:27 +08006709 thread_info = threading_helper.threading_setup()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006710 support.run_unittest(*tests)
Hai Shie80697d2020-05-28 06:10:27 +08006711 threading_helper.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006712
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006713
Guido van Rossum24e4af82002-06-12 19:18:08 +00006714if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006715 test_main()