blob: e4af713b4c5bf7bf65c95c5a3f78d2af44f98ed2 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Hai Shideb01622020-07-06 20:29:49 +08003from test.support import os_helper
Serhiy Storchaka16994912020-04-25 10:06:29 +03004from test.support import socket_helper
Hai Shie80697d2020-05-28 06:10:27 +08005from test.support import threading_helper
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006
Christian Heimes5e696852008-04-09 08:37:03 +00007import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00008import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01009import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +000010import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +000011import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100012import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000013import time
14import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000015import queue
Jack Jansen522e7692002-09-06 21:57:50 +000016import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000017import os
Michael Felt56614592018-12-26 04:34:37 +010018import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000019import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000020import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000021from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000022import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000023import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010024import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020025import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020026import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010027import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020028import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020029import _thread as thread
30import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000031try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000032 import multiprocessing
33except ImportError:
34 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020035try:
36 import fcntl
37except ImportError:
38 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000039
Serhiy Storchaka16994912020-04-25 10:06:29 +030040HOST = socket_helper.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010041# test unicode string and carriage return
42MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Barry Warsawcf3d4b51997-01-03 20:03:32 +000043
caaveryeffc12f2017-09-06 18:18:10 -040044VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010045AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040046
Victor Stinner45df8202010-04-28 22:31:17 +000047try:
Victor Stinnere254e532014-07-26 14:36:55 +020048 import _socket
49except ImportError:
50 _socket = None
51
caaveryeffc12f2017-09-06 18:18:10 -040052def get_cid():
53 if fcntl is None:
54 return None
Pablo Galindo6eb96192020-04-01 01:48:37 +010055 if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
56 return None
caaveryeffc12f2017-09-06 18:18:10 -040057 try:
58 with open("/dev/vsock", "rb") as f:
59 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
60 except OSError:
61 return None
62 else:
63 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000064
Charles-François Natali47413c12011-10-06 19:47:44 +020065def _have_socket_can():
66 """Check whether CAN sockets are supported on this host."""
67 try:
68 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020069 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020070 return False
71 else:
72 s.close()
73 return True
74
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040075def _have_socket_can_isotp():
76 """Check whether CAN ISOTP sockets are supported on this host."""
77 try:
78 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
79 except (AttributeError, OSError):
80 return False
81 else:
82 s.close()
83 return True
84
karl ding360371f2020-04-29 15:31:19 -070085def _have_socket_can_j1939():
86 """Check whether CAN J1939 sockets are supported on this host."""
87 try:
88 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
89 except (AttributeError, OSError):
90 return False
91 else:
92 s.close()
93 return True
94
Charles-François Natali10b8cf42011-11-10 19:21:37 +010095def _have_socket_rds():
96 """Check whether RDS sockets are supported on this host."""
97 try:
98 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
99 except (AttributeError, OSError):
100 return False
101 else:
102 s.close()
103 return True
104
Christian Heimes48371412016-09-06 00:37:46 +0200105def _have_socket_alg():
106 """Check whether AF_ALG sockets are supported on this host."""
107 try:
108 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
109 except (AttributeError, OSError):
110 return False
111 else:
112 s.close()
113 return True
114
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700115def _have_socket_qipcrtr():
116 """Check whether AF_QIPCRTR sockets are supported on this host."""
117 try:
118 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
119 except (AttributeError, OSError):
120 return False
121 else:
122 s.close()
123 return True
124
caaveryeffc12f2017-09-06 18:18:10 -0400125def _have_socket_vsock():
126 """Check whether AF_VSOCK sockets are supported on this host."""
127 ret = get_cid() is not None
128 return ret
129
Yury Selivanovf11b4602018-01-28 17:27:38 -0500130
Greg Bowser8fbece12019-08-02 16:29:52 -0400131def _have_socket_bluetooth():
132 """Check whether AF_BLUETOOTH sockets are supported on this host."""
133 try:
134 # RFCOMM is supported by all platforms with bluetooth support. Windows
135 # does not support omitting the protocol.
136 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
137 except (AttributeError, OSError):
138 return False
139 else:
140 s.close()
141 return True
142
143
Victor Stinner304315d2018-11-30 13:22:44 +0100144@contextlib.contextmanager
145def socket_setdefaulttimeout(timeout):
146 old_timeout = socket.getdefaulttimeout()
147 try:
148 socket.setdefaulttimeout(timeout)
149 yield
150 finally:
151 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500152
153
Charles-François Natali47413c12011-10-06 19:47:44 +0200154HAVE_SOCKET_CAN = _have_socket_can()
155
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400156HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
157
karl ding360371f2020-04-29 15:31:19 -0700158HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939()
159
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100160HAVE_SOCKET_RDS = _have_socket_rds()
161
Christian Heimes48371412016-09-06 00:37:46 +0200162HAVE_SOCKET_ALG = _have_socket_alg()
163
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700164HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
165
caaveryeffc12f2017-09-06 18:18:10 -0400166HAVE_SOCKET_VSOCK = _have_socket_vsock()
167
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700168HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
169
Greg Bowser8fbece12019-08-02 16:29:52 -0400170HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
171
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000172# Size in bytes of the int type
173SIZEOF_INT = array.array("i").itemsize
174
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000176
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177 def setUp(self):
178 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300179 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100180 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000181
Guido van Rossum24e4af82002-06-12 19:18:08 +0000182 def tearDown(self):
183 self.serv.close()
184 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000185
Guido van Rossum24e4af82002-06-12 19:18:08 +0000186class SocketUDPTest(unittest.TestCase):
187
188 def setUp(self):
189 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300190 self.port = socket_helper.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000191
192 def tearDown(self):
193 self.serv.close()
194 self.serv = None
195
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700196class SocketUDPLITETest(SocketUDPTest):
197
198 def setUp(self):
199 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300200 self.port = socket_helper.bind_port(self.serv)
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700201
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000202class ThreadSafeCleanupTestCase(unittest.TestCase):
203 """Subclass of unittest.TestCase with thread-safe cleanup methods.
204
205 This subclass protects the addCleanup() and doCleanups() methods
206 with a recursive lock.
207 """
208
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200209 def __init__(self, *args, **kwargs):
210 super().__init__(*args, **kwargs)
211 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000212
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200213 def addCleanup(self, *args, **kwargs):
214 with self._cleanup_lock:
215 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000216
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200217 def doCleanups(self, *args, **kwargs):
218 with self._cleanup_lock:
219 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000220
Charles-François Natali47413c12011-10-06 19:47:44 +0200221class SocketCANTest(unittest.TestCase):
222
223 """To be able to run this test, a `vcan0` CAN interface can be created with
224 the following commands:
225 # modprobe vcan
226 # ip link add dev vcan0 type vcan
227 # ifconfig vcan0 up
228 """
229 interface = 'vcan0'
230 bufsize = 128
231
Charles-François Natali773e42d2013-02-05 19:42:01 +0100232 """The CAN frame structure is defined in <linux/can.h>:
233
234 struct can_frame {
235 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
236 __u8 can_dlc; /* data length code: 0 .. 8 */
237 __u8 data[8] __attribute__((aligned(8)));
238 };
239 """
240 can_frame_fmt = "=IB3x8s"
241 can_frame_size = struct.calcsize(can_frame_fmt)
242
243 """The Broadcast Management Command frame structure is defined
244 in <linux/can/bcm.h>:
245
246 struct bcm_msg_head {
247 __u32 opcode;
248 __u32 flags;
249 __u32 count;
250 struct timeval ival1, ival2;
251 canid_t can_id;
252 __u32 nframes;
253 struct can_frame frames[0];
254 }
255
256 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
257 `struct can_frame` definition). Must use native not standard types for packing.
258 """
259 bcm_cmd_msg_fmt = "@3I4l2I"
260 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
261
Charles-François Natali47413c12011-10-06 19:47:44 +0200262 def setUp(self):
263 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200264 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200265 try:
266 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200267 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200268 self.skipTest('network interface `%s` does not exist' %
269 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200270
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100271
272class SocketRDSTest(unittest.TestCase):
273
274 """To be able to run this test, the `rds` kernel module must be loaded:
275 # modprobe rds
276 """
277 bufsize = 8192
278
279 def setUp(self):
280 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
281 self.addCleanup(self.serv.close)
282 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +0300283 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100284 except OSError:
285 self.skipTest('unable to bind RDS socket')
286
287
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000289 """Threadable Test class
290
291 The ThreadableTest class makes it easy to create a threaded
292 client/server pair from an existing unit test. To create a
293 new threaded class from an existing unit test, use multiple
294 inheritance:
295
296 class NewClass (OldClass, ThreadableTest):
297 pass
298
299 This class defines two new fixture functions with obvious
300 purposes for overriding:
301
302 clientSetUp ()
303 clientTearDown ()
304
305 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000306 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000307 '_' to indicate the client portion of the test. Ex:
308
309 def testFoo(self):
310 # Server portion
311
312 def _testFoo(self):
313 # Client portion
314
315 Any exceptions raised by the clients during their tests
316 are caught and transferred to the main thread to alert
317 the testing framework.
318
319 Note, the server setup function cannot call any blocking
320 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000321 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000322 the blocking call (such as in setting up a client/server
323 connection and performing the accept() in setUp().
324 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325
326 def __init__(self):
327 # Swap the true setup function
328 self.__setUp = self.setUp
329 self.__tearDown = self.tearDown
330 self.setUp = self._setUp
331 self.tearDown = self._tearDown
332
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000333 def serverExplicitReady(self):
334 """This method allows the server to explicitly indicate that
335 it wants the client thread to proceed. This is useful if the
336 server is about to execute a blocking routine that is
337 dependent upon the client thread during its setup routine."""
338 self.server_ready.set()
339
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340 def _setUp(self):
Hai Shie80697d2020-05-28 06:10:27 +0800341 self.wait_threads = threading_helper.wait_threads_exit()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700342 self.wait_threads.__enter__()
343
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000344 self.server_ready = threading.Event()
345 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000346 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000347 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200348 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349
350 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000351 methodname = self.id()
352 i = methodname.rfind('.')
353 methodname = methodname[i+1:]
354 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000355 self.client_thread = thread.start_new_thread(
356 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200358 try:
359 self.__setUp()
360 except:
361 self.server_crashed = True
362 raise
363 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000364 self.server_ready.set()
365 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366
367 def _tearDown(self):
368 self.__tearDown()
369 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700370 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000371
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000372 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000373 exc = self.queue.get()
374 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375
376 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000377 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100378 try:
379 self.clientSetUp()
380 except BaseException as e:
381 self.queue.put(e)
382 self.clientTearDown()
383 return
384 finally:
385 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200386 if self.server_crashed:
387 self.clientTearDown()
388 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000389 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000390 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 try:
392 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000393 except BaseException as e:
394 self.queue.put(e)
395 finally:
396 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000397
398 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000399 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000400
401 def clientTearDown(self):
402 self.done.set()
403 thread.exit()
404
405class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
406
407 def __init__(self, methodName='runTest'):
408 SocketTCPTest.__init__(self, methodName=methodName)
409 ThreadableTest.__init__(self)
410
411 def clientSetUp(self):
412 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
413
414 def clientTearDown(self):
415 self.cli.close()
416 self.cli = None
417 ThreadableTest.clientTearDown(self)
418
419class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
420
421 def __init__(self, methodName='runTest'):
422 SocketUDPTest.__init__(self, methodName=methodName)
423 ThreadableTest.__init__(self)
424
425 def clientSetUp(self):
426 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
427
Brian Curtin3beb38f2010-11-04 03:41:43 +0000428 def clientTearDown(self):
429 self.cli.close()
430 self.cli = None
431 ThreadableTest.clientTearDown(self)
432
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700433@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
434 'UDPLITE sockets required for this test.')
435class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
436
437 def __init__(self, methodName='runTest'):
438 SocketUDPLITETest.__init__(self, methodName=methodName)
439 ThreadableTest.__init__(self)
440
441 def clientSetUp(self):
442 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
443
444 def clientTearDown(self):
445 self.cli.close()
446 self.cli = None
447 ThreadableTest.clientTearDown(self)
448
Charles-François Natali47413c12011-10-06 19:47:44 +0200449class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
450
451 def __init__(self, methodName='runTest'):
452 SocketCANTest.__init__(self, methodName=methodName)
453 ThreadableTest.__init__(self)
454
455 def clientSetUp(self):
456 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
457 try:
458 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200459 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200460 # skipTest should not be called here, and will be called in the
461 # server instead
462 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200463
464 def clientTearDown(self):
465 self.cli.close()
466 self.cli = None
467 ThreadableTest.clientTearDown(self)
468
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100469class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
470
471 def __init__(self, methodName='runTest'):
472 SocketRDSTest.__init__(self, methodName=methodName)
473 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100474
475 def clientSetUp(self):
476 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
477 try:
478 # RDS sockets must be bound explicitly to send or receive data
479 self.cli.bind((HOST, 0))
480 self.cli_addr = self.cli.getsockname()
481 except OSError:
482 # skipTest should not be called here, and will be called in the
483 # server instead
484 pass
485
486 def clientTearDown(self):
487 self.cli.close()
488 self.cli = None
489 ThreadableTest.clientTearDown(self)
490
caaveryeffc12f2017-09-06 18:18:10 -0400491@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400492@unittest.skipUnless(HAVE_SOCKET_VSOCK,
493 'VSOCK sockets required for this test.')
494@unittest.skipUnless(get_cid() != 2,
495 "This test can only be run on a virtual guest.")
496class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
497
498 def __init__(self, methodName='runTest'):
499 unittest.TestCase.__init__(self, methodName=methodName)
500 ThreadableTest.__init__(self)
501
502 def setUp(self):
503 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
504 self.addCleanup(self.serv.close)
505 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
506 self.serv.listen()
507 self.serverExplicitReady()
508 self.conn, self.connaddr = self.serv.accept()
509 self.addCleanup(self.conn.close)
510
511 def clientSetUp(self):
512 time.sleep(0.1)
513 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
514 self.addCleanup(self.cli.close)
515 cid = get_cid()
516 self.cli.connect((cid, VSOCKPORT))
517
518 def testStream(self):
519 msg = self.conn.recv(1024)
520 self.assertEqual(msg, MSG)
521
522 def _testStream(self):
523 self.cli.send(MSG)
524 self.cli.close()
525
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000527 """Socket tests for client-server connection.
528
529 self.cli_conn is a client socket connected to the server. The
530 setUp() method guarantees that it is connected to the server.
531 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def __init__(self, methodName='runTest'):
534 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
535
536 def setUp(self):
537 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000538 # Indicate explicitly we're ready for the client thread to
539 # proceed and then perform the blocking call to accept
540 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000541 conn, addr = self.serv.accept()
542 self.cli_conn = conn
543
544 def tearDown(self):
545 self.cli_conn.close()
546 self.cli_conn = None
547 ThreadedTCPSocketTest.tearDown(self)
548
549 def clientSetUp(self):
550 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000551 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552 self.serv_conn = self.cli
553
554 def clientTearDown(self):
555 self.serv_conn.close()
556 self.serv_conn = None
557 ThreadedTCPSocketTest.clientTearDown(self)
558
Dave Cole331708b2004-08-09 04:51:41 +0000559class SocketPairTest(unittest.TestCase, ThreadableTest):
560
561 def __init__(self, methodName='runTest'):
562 unittest.TestCase.__init__(self, methodName=methodName)
563 ThreadableTest.__init__(self)
564
565 def setUp(self):
566 self.serv, self.cli = socket.socketpair()
567
568 def tearDown(self):
569 self.serv.close()
570 self.serv = None
571
572 def clientSetUp(self):
573 pass
574
575 def clientTearDown(self):
576 self.cli.close()
577 self.cli = None
578 ThreadableTest.clientTearDown(self)
579
Tim Peters494aaee2004-08-09 18:54:11 +0000580
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000581# The following classes are used by the sendmsg()/recvmsg() tests.
582# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
583# gives a drop-in replacement for SocketConnectedTest, but different
584# address families can be used, and the attributes serv_addr and
585# cli_addr will be set to the addresses of the endpoints.
586
587class SocketTestBase(unittest.TestCase):
588 """A base class for socket tests.
589
590 Subclasses must provide methods newSocket() to return a new socket
591 and bindSock(sock) to bind it to an unused address.
592
593 Creates a socket self.serv and sets self.serv_addr to its address.
594 """
595
596 def setUp(self):
597 self.serv = self.newSocket()
598 self.bindServer()
599
600 def bindServer(self):
601 """Bind server socket and set self.serv_addr to its address."""
602 self.bindSock(self.serv)
603 self.serv_addr = self.serv.getsockname()
604
605 def tearDown(self):
606 self.serv.close()
607 self.serv = None
608
609
610class SocketListeningTestMixin(SocketTestBase):
611 """Mixin to listen on the server socket."""
612
613 def setUp(self):
614 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100615 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000616
617
618class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
619 ThreadableTest):
620 """Mixin to add client socket and allow client/server tests.
621
622 Client socket is self.cli and its address is self.cli_addr. See
623 ThreadableTest for usage information.
624 """
625
626 def __init__(self, *args, **kwargs):
627 super().__init__(*args, **kwargs)
628 ThreadableTest.__init__(self)
629
630 def clientSetUp(self):
631 self.cli = self.newClientSocket()
632 self.bindClient()
633
634 def newClientSocket(self):
635 """Return a new socket for use as client."""
636 return self.newSocket()
637
638 def bindClient(self):
639 """Bind client socket and set self.cli_addr to its address."""
640 self.bindSock(self.cli)
641 self.cli_addr = self.cli.getsockname()
642
643 def clientTearDown(self):
644 self.cli.close()
645 self.cli = None
646 ThreadableTest.clientTearDown(self)
647
648
649class ConnectedStreamTestMixin(SocketListeningTestMixin,
650 ThreadedSocketTestMixin):
651 """Mixin to allow client/server stream tests with connected client.
652
653 Server's socket representing connection to client is self.cli_conn
654 and client's connection to server is self.serv_conn. (Based on
655 SocketConnectedTest.)
656 """
657
658 def setUp(self):
659 super().setUp()
660 # Indicate explicitly we're ready for the client thread to
661 # proceed and then perform the blocking call to accept
662 self.serverExplicitReady()
663 conn, addr = self.serv.accept()
664 self.cli_conn = conn
665
666 def tearDown(self):
667 self.cli_conn.close()
668 self.cli_conn = None
669 super().tearDown()
670
671 def clientSetUp(self):
672 super().clientSetUp()
673 self.cli.connect(self.serv_addr)
674 self.serv_conn = self.cli
675
676 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100677 try:
678 self.serv_conn.close()
679 self.serv_conn = None
680 except AttributeError:
681 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000682 super().clientTearDown()
683
684
685class UnixSocketTestBase(SocketTestBase):
686 """Base class for Unix-domain socket tests."""
687
688 # This class is used for file descriptor passing tests, so we
689 # create the sockets in a private directory so that other users
690 # can't send anything that might be problematic for a privileged
691 # user running the tests.
692
693 def setUp(self):
694 self.dir_path = tempfile.mkdtemp()
695 self.addCleanup(os.rmdir, self.dir_path)
696 super().setUp()
697
698 def bindSock(self, sock):
699 path = tempfile.mktemp(dir=self.dir_path)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300700 socket_helper.bind_unix_socket(sock, path)
Hai Shideb01622020-07-06 20:29:49 +0800701 self.addCleanup(os_helper.unlink, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000702
703class UnixStreamBase(UnixSocketTestBase):
704 """Base class for Unix-domain SOCK_STREAM tests."""
705
706 def newSocket(self):
707 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
708
709
710class InetTestBase(SocketTestBase):
711 """Base class for IPv4 socket tests."""
712
713 host = HOST
714
715 def setUp(self):
716 super().setUp()
717 self.port = self.serv_addr[1]
718
719 def bindSock(self, sock):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300720 socket_helper.bind_port(sock, host=self.host)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000721
722class TCPTestBase(InetTestBase):
723 """Base class for TCP-over-IPv4 tests."""
724
725 def newSocket(self):
726 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
727
728class UDPTestBase(InetTestBase):
729 """Base class for UDP-over-IPv4 tests."""
730
731 def newSocket(self):
732 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
733
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700734class UDPLITETestBase(InetTestBase):
735 """Base class for UDPLITE-over-IPv4 tests."""
736
737 def newSocket(self):
738 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
739
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000740class SCTPStreamBase(InetTestBase):
741 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
742
743 def newSocket(self):
744 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
745 socket.IPPROTO_SCTP)
746
747
748class Inet6TestBase(InetTestBase):
749 """Base class for IPv6 socket tests."""
750
Serhiy Storchaka16994912020-04-25 10:06:29 +0300751 host = socket_helper.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000752
753class UDP6TestBase(Inet6TestBase):
754 """Base class for UDP-over-IPv6 tests."""
755
756 def newSocket(self):
757 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
758
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700759class UDPLITE6TestBase(Inet6TestBase):
760 """Base class for UDPLITE-over-IPv6 tests."""
761
762 def newSocket(self):
763 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
764
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000765
766# Test-skipping decorators for use with ThreadableTest.
767
768def skipWithClientIf(condition, reason):
769 """Skip decorated test if condition is true, add client_skip decorator.
770
771 If the decorated object is not a class, sets its attribute
772 "client_skip" to a decorator which will return an empty function
773 if the test is to be skipped, or the original function if it is
774 not. This can be used to avoid running the client part of a
775 skipped test when using ThreadableTest.
776 """
777 def client_pass(*args, **kwargs):
778 pass
779 def skipdec(obj):
780 retval = unittest.skip(reason)(obj)
781 if not isinstance(obj, type):
782 retval.client_skip = lambda f: client_pass
783 return retval
784 def noskipdec(obj):
785 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
786 obj.client_skip = lambda f: f
787 return obj
788 return skipdec if condition else noskipdec
789
790
791def requireAttrs(obj, *attributes):
792 """Skip decorated test if obj is missing any of the given attributes.
793
794 Sets client_skip attribute as skipWithClientIf() does.
795 """
796 missing = [name for name in attributes if not hasattr(obj, name)]
797 return skipWithClientIf(
798 missing, "don't have " + ", ".join(name for name in missing))
799
800
801def requireSocket(*args):
802 """Skip decorated test if a socket cannot be created with given arguments.
803
804 When an argument is given as a string, will use the value of that
805 attribute of the socket module, or skip the test if it doesn't
806 exist. Sets client_skip attribute as skipWithClientIf() does.
807 """
808 err = None
809 missing = [obj for obj in args if
810 isinstance(obj, str) and not hasattr(socket, obj)]
811 if missing:
812 err = "don't have " + ", ".join(name for name in missing)
813 else:
814 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
815 for obj in args]
816 try:
817 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200818 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000819 # XXX: check errno?
820 err = str(e)
821 else:
822 s.close()
823 return skipWithClientIf(
824 err is not None,
825 "can't create socket({0}): {1}".format(
826 ", ".join(str(o) for o in args), err))
827
828
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829#######################################################################
830## Begin Tests
831
832class GeneralModuleTests(unittest.TestCase):
833
Ethan Furman7184bac2014-10-14 18:56:53 -0700834 def test_SocketType_is_socketobject(self):
835 import _socket
836 self.assertTrue(socket.SocketType is _socket.socket)
837 s = socket.socket()
838 self.assertIsInstance(s, socket.SocketType)
839 s.close()
840
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000841 def test_repr(self):
842 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200843 with s:
844 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000845 self.assertIn('family=%s' % socket.AF_INET, repr(s))
846 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200847 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200848 self.assertNotIn('raddr', repr(s))
849 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200850 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200851 self.assertIn(str(s.getsockname()), repr(s))
852 self.assertIn('[closed]', repr(s))
853 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000854
Victor Stinnere254e532014-07-26 14:36:55 +0200855 @unittest.skipUnless(_socket is not None, 'need _socket module')
856 def test_csocket_repr(self):
857 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
858 try:
859 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
860 % (s.fileno(), s.family, s.type, s.proto))
861 self.assertEqual(repr(s), expected)
862 finally:
863 s.close()
864 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
865 % (s.family, s.type, s.proto))
866 self.assertEqual(repr(s), expected)
867
Raymond Hettinger027bb632004-05-31 03:09:25 +0000868 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200869 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
870 p = proxy(s)
871 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000872 s = None
873 try:
874 p.fileno()
875 except ReferenceError:
876 pass
877 else:
878 self.fail('Socket proxy still exists')
879
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000881 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300882 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200883 with self.assertRaises(OSError, msg=msg % 'OSError'):
884 raise OSError
885 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200887 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889
Ezio Melotti63e42302011-05-07 19:47:48 +0300890 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000891 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300892 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
893 self.addCleanup(s.close)
894 s.bind(('', 0))
895 sockname = s.getsockname()
896 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300897 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300898 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300899 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400900 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300901 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300902 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300903 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400904 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300905 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300906 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300907 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300908 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300909 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300910 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300911 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400912 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300913 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300914 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300915 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400916 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300917 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300918 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300919 self.assertIn('not NoneType', str(cm.exception))
920 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300921 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300922 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300923 s.sendto(b'foo', None, None)
924 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300925 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300926 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300927 self.assertIn('(1 given)', str(cm.exception))
928 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300929 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300930 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300931
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100935 if socket.has_ipv6:
936 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 socket.SOCK_STREAM
938 socket.SOCK_DGRAM
939 socket.SOCK_RAW
940 socket.SOCK_RDM
941 socket.SOCK_SEQPACKET
942 socket.SOL_SOCKET
943 socket.SO_REUSEADDR
944
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100945 def testCrucialIpProtoConstants(self):
946 socket.IPPROTO_TCP
947 socket.IPPROTO_UDP
948 if socket.has_ipv6:
949 socket.IPPROTO_IPV6
950
951 @unittest.skipUnless(os.name == "nt", "Windows specific")
952 def testWindowsSpecificConstants(self):
953 socket.IPPROTO_ICLFXBM
954 socket.IPPROTO_ST
955 socket.IPPROTO_CBT
956 socket.IPPROTO_IGP
957 socket.IPPROTO_RDP
958 socket.IPPROTO_PGM
959 socket.IPPROTO_L2TP
960 socket.IPPROTO_SCTP
961
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +0200962 @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
963 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
964 def test3542SocketOptions(self):
965 # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542
966 opts = {
967 'IPV6_CHECKSUM',
968 'IPV6_DONTFRAG',
969 'IPV6_DSTOPTS',
970 'IPV6_HOPLIMIT',
971 'IPV6_HOPOPTS',
972 'IPV6_NEXTHOP',
973 'IPV6_PATHMTU',
974 'IPV6_PKTINFO',
975 'IPV6_RECVDSTOPTS',
976 'IPV6_RECVHOPLIMIT',
977 'IPV6_RECVHOPOPTS',
978 'IPV6_RECVPATHMTU',
979 'IPV6_RECVPKTINFO',
980 'IPV6_RECVRTHDR',
981 'IPV6_RECVTCLASS',
982 'IPV6_RTHDR',
983 'IPV6_RTHDRDSTOPTS',
984 'IPV6_RTHDR_TYPE_0',
985 'IPV6_TCLASS',
986 'IPV6_USE_MIN_MTU',
987 }
988 for opt in opts:
989 self.assertTrue(
990 hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'"
991 )
992
Guido van Rossum654c11e2002-06-13 20:24:17 +0000993 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000994 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000995 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000996 try:
997 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200998 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000999 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001000 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001001 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +00001002 try:
1003 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001004 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +00001005 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001006 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +00001007 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001008 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +00001009 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001010 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001011
Charles-François Natali0cc86852013-09-13 19:53:08 +02001012 def test_host_resolution(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03001013 for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014 self.assertEqual(socket.gethostbyname(addr), addr)
1015
Serhiy Storchaka16994912020-04-25 10:06:29 +03001016 # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have
Charles-François Natali0cc86852013-09-13 19:53:08 +02001017 # a matching name entry (e.g. 'ip6-localhost')
Serhiy Storchaka16994912020-04-25 10:06:29 +03001018 for host in [socket_helper.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001019 self.assertIn(host, socket.gethostbyaddr(host)[2])
1020
Xiang Zhangd36a7162017-03-07 11:06:09 +08001021 def test_host_resolution_bad_address(self):
1022 # These are all malformed IP addresses and expected not to resolve to
1023 # any result. But some ISPs, e.g. AWS, may successfully resolve these
1024 # IPs.
1025 explanation = (
1026 "resolving an invalid IP address did not raise OSError; "
1027 "can be caused by a broken DNS server"
1028 )
1029 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
1030 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -04001031 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +08001032 socket.gethostbyname(addr)
1033 with self.assertRaises(OSError, msg=explanation):
1034 socket.gethostbyaddr(addr)
1035
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001036 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
1037 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
1038 def test_sethostname(self):
1039 oldhn = socket.gethostname()
1040 try:
1041 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001042 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001043 if e.errno == errno.EPERM:
1044 self.skipTest("test should be run as root")
1045 else:
1046 raise
1047 try:
1048 # running test as root!
1049 self.assertEqual(socket.gethostname(), 'new')
1050 # Should work with bytes objects too
1051 socket.sethostname(b'bar')
1052 self.assertEqual(socket.gethostname(), 'bar')
1053 finally:
1054 socket.sethostname(oldhn)
1055
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001056 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1057 'socket.if_nameindex() not available.')
1058 def testInterfaceNameIndex(self):
1059 interfaces = socket.if_nameindex()
1060 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001061 self.assertIsInstance(index, int)
1062 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001063 # interface indices are non-zero integers
1064 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001065 _index = socket.if_nametoindex(name)
1066 self.assertIsInstance(_index, int)
1067 self.assertEqual(index, _index)
1068 _name = socket.if_indextoname(index)
1069 self.assertIsInstance(_name, str)
1070 self.assertEqual(name, _name)
1071
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001072 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1073 'socket.if_indextoname() not available.')
1074 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001075 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001076 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001077
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001078 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1079 'socket.if_nametoindex() not available.')
1080 def testInvalidInterfaceNameToIndex(self):
1081 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1082 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1083
Serhiy Storchaka43767632013-11-03 21:31:38 +02001084 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1085 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001086 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001087 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001088 try:
1089 # On some versions, this loses a reference
1090 orig = sys.getrefcount(__name__)
1091 socket.getnameinfo(__name__,0)
1092 except TypeError:
1093 if sys.getrefcount(__name__) != orig:
1094 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001095
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001097 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 try:
1099 # On some versions, this crashes the interpreter.
1100 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001101 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001102 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001103
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001104 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001105 # This just checks that htons etc. are their own inverse,
1106 # when looking at the lower 16 or 32 bits.
1107 sizes = {socket.htonl: 32, socket.ntohl: 32,
1108 socket.htons: 16, socket.ntohs: 16}
1109 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001110 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001111 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1112 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001113
Guido van Rossuma2627af2002-09-14 00:58:46 +00001114 swapped = func(mask)
1115 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001116 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001117
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001118 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001119 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001120 import _testcapi
1121 s_good_values = [0, 1, 2, 0xffff]
1122 l_good_values = s_good_values + [0xffffffff]
1123 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1124 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1125 _testcapi.INT_MAX + 1]
1126 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1127 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001128 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001129 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001130 for k in l_good_values:
1131 socket.ntohl(k)
1132 socket.htonl(k)
1133 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001134 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001135 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001136 for k in l_bad_values:
1137 self.assertRaises(OverflowError, socket.ntohl, k)
1138 self.assertRaises(OverflowError, socket.htonl, k)
1139 for k in s_deprecated_values:
1140 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1141 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001142
Barry Warsaw11b91a02004-06-28 00:50:43 +00001143 def testGetServBy(self):
1144 eq = self.assertEqual
1145 # Find one service that exists, then check all the related interfaces.
1146 # I've ordered this by protocols that have both a tcp and udp
1147 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001148 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001149 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001150 # avoid the 'echo' service on this platform, as there is an
1151 # assumption breaking non-standard port/protocol entry
1152 services = ('daytime', 'qotd', 'domain')
1153 else:
1154 services = ('echo', 'daytime', 'domain')
1155 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001156 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001157 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001158 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001159 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001160 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001161 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001162 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001163 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001164 # Issue #26936: Android getservbyname() was broken before API 23.
1165 if (not hasattr(sys, 'getandroidapilevel') or
1166 sys.getandroidapilevel() >= 23):
1167 port2 = socket.getservbyname(service)
1168 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001169 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001170 try:
1171 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001172 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001173 udpport = None
1174 else:
1175 eq(udpport, port)
1176 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001177 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001178 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001179 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001180 eq(socket.getservbyport(port, 'tcp'), service)
1181 if udpport is not None:
1182 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001183 # Make sure getservbyport does not accept out of range ports.
1184 self.assertRaises(OverflowError, socket.getservbyport, -1)
1185 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001187 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001188 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001189 # The default timeout should initially be None
1190 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001191 with socket.socket() as s:
1192 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001193
1194 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001195 with socket_setdefaulttimeout(10):
1196 self.assertEqual(socket.getdefaulttimeout(), 10)
1197 with socket.socket() as sock:
1198 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001199
Victor Stinner304315d2018-11-30 13:22:44 +01001200 # Reset the default timeout to None, and see if it propagates
1201 socket.setdefaulttimeout(None)
1202 self.assertEqual(socket.getdefaulttimeout(), None)
1203 with socket.socket() as sock:
1204 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001205
1206 # Check that setting it to an invalid value raises ValueError
1207 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1208
1209 # Check that setting it to an invalid type raises TypeError
1210 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1211
Serhiy Storchaka43767632013-11-03 21:31:38 +02001212 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1213 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001214 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001215 # Test that issue1008086 and issue767150 are fixed.
1216 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001217 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1218 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001219
Serhiy Storchaka43767632013-11-03 21:31:38 +02001220 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1221 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001222 def testIPv4toString(self):
1223 from socket import inet_aton as f, inet_pton, AF_INET
1224 g = lambda a: inet_pton(AF_INET, a)
1225
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001226 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001227 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001228 )
1229
Ezio Melottib3aedd42010-11-20 19:04:17 +00001230 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1231 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1232 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1233 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1234 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001235 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001236 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001237 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001238 assertInvalid(f, '300.0.0.0')
1239 assertInvalid(f, 'a.0.0.0')
1240 assertInvalid(f, '1.2.3.4.5')
1241 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001242
Ezio Melottib3aedd42010-11-20 19:04:17 +00001243 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1244 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1245 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1246 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001247 assertInvalid(g, '0.0.0.')
1248 assertInvalid(g, '300.0.0.0')
1249 assertInvalid(g, 'a.0.0.0')
1250 assertInvalid(g, '1.2.3.4.5')
1251 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001252
Serhiy Storchaka43767632013-11-03 21:31:38 +02001253 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1254 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001255 def testIPv6toString(self):
1256 try:
1257 from socket import inet_pton, AF_INET6, has_ipv6
1258 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001259 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001260 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001261 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001262
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001263 if sys.platform == "win32":
1264 try:
1265 inet_pton(AF_INET6, '::')
1266 except OSError as e:
1267 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001268 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001269
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001270 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001271 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001272 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001273 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001274
Ezio Melottib3aedd42010-11-20 19:04:17 +00001275 self.assertEqual(b'\x00' * 16, f('::'))
1276 self.assertEqual(b'\x00' * 16, f('0::0'))
1277 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1278 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001279 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001280 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1281 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001282 self.assertEqual(
1283 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1284 f('ad42:abc::127:0:254:2')
1285 )
1286 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1287 assertInvalid('0x20::')
1288 assertInvalid(':::')
1289 assertInvalid('::0::')
1290 assertInvalid('1::abc::')
1291 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001292 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001293 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001294 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001295 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001296 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001297 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001298
1299 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1300 f('::254.42.23.64')
1301 )
1302 self.assertEqual(
1303 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1304 f('42::a29b:254.42.23.64')
1305 )
1306 self.assertEqual(
1307 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1308 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1309 )
1310 assertInvalid('255.254.253.252')
1311 assertInvalid('1::260.2.3.0')
1312 assertInvalid('1::0.be.e.0')
1313 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1314 assertInvalid('::1.2.3.4:0')
1315 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001316
Serhiy Storchaka43767632013-11-03 21:31:38 +02001317 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1318 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001319 def testStringToIPv4(self):
1320 from socket import inet_ntoa as f, inet_ntop, AF_INET
1321 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001322 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001323 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001324 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001325
Ezio Melottib3aedd42010-11-20 19:04:17 +00001326 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1327 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1328 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1329 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001330 assertInvalid(f, b'\x00' * 3)
1331 assertInvalid(f, b'\x00' * 5)
1332 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001333 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001334
Ezio Melottib3aedd42010-11-20 19:04:17 +00001335 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1336 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1337 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001338 assertInvalid(g, b'\x00' * 3)
1339 assertInvalid(g, b'\x00' * 5)
1340 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001341 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001342
Serhiy Storchaka43767632013-11-03 21:31:38 +02001343 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1344 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001345 def testStringToIPv6(self):
1346 try:
1347 from socket import inet_ntop, AF_INET6, has_ipv6
1348 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001349 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001350 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001351 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001352
1353 if sys.platform == "win32":
1354 try:
1355 inet_ntop(AF_INET6, b'\x00' * 16)
1356 except OSError as e:
1357 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001358 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001359
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001360 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001361 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001362 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001363 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001364
Ezio Melottib3aedd42010-11-20 19:04:17 +00001365 self.assertEqual('::', f(b'\x00' * 16))
1366 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1367 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001368 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001369 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001370 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001371 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001372
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001373 assertInvalid(b'\x12' * 15)
1374 assertInvalid(b'\x12' * 17)
1375 assertInvalid(b'\x12' * 4)
1376
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001377 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001378
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001379 def testSockName(self):
1380 # Testing getsockname()
Serhiy Storchaka16994912020-04-25 10:06:29 +03001381 port = socket_helper.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001382 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001383 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001384 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001385 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001386 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1387 # it reasonable to get the host's addr in addition to 0.0.0.0.
1388 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001389 try:
1390 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001391 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001392 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001393 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001394 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001395 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001396
1397 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001398 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001399 # We know a socket should start without reuse==0
1400 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001401 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001402 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001403 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001404
1405 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001406 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001407 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001408 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001409 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1410 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001411 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001412
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001413 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001414 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001415 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1416 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001417 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001418
Martin Panter50ab1a32016-04-11 00:38:12 +00001419 def testCloseException(self):
1420 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001421 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001422 socket.socket(fileno=sock.fileno()).close()
1423 try:
1424 sock.close()
1425 except OSError as err:
1426 # Winsock apparently raises ENOTSOCK
1427 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1428 else:
1429 self.fail("close() should raise EBADF/ENOTSOCK")
1430
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001431 def testNewAttributes(self):
1432 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001433
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001434 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1435 self.assertEqual(sock.family, socket.AF_INET)
1436 if hasattr(socket, 'SOCK_CLOEXEC'):
1437 self.assertIn(sock.type,
1438 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1439 socket.SOCK_STREAM))
1440 else:
1441 self.assertEqual(sock.type, socket.SOCK_STREAM)
1442 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001443
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001444 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001445 sock = socket.socket()
1446 self.addCleanup(sock.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001447 port = socket_helper.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001448 big_port = port + 65536
1449 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001450 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1451 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1452 # Since find_unused_port() is inherently subject to race conditions, we
1453 # call it a couple times if necessary.
1454 for i in itertools.count():
Serhiy Storchaka16994912020-04-25 10:06:29 +03001455 port = socket_helper.find_unused_port()
Charles-François Natali65708cf2014-07-25 18:44:30 +01001456 try:
1457 sock.bind((HOST, port))
1458 except OSError as e:
1459 if e.errno != errno.EADDRINUSE or i == 5:
1460 raise
1461 else:
1462 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001463
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001464 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001465 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001466 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1467 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1468 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1469 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001470 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1471 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001472 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001473 self.assertRaises(ValueError, s.ioctl, -1, None)
1474 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001475
Steve Dowerea93ac02016-06-17 12:52:18 -07001476 @unittest.skipUnless(os.name == "nt", "Windows specific")
1477 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1478 'Loopback fast path support required for this test')
1479 def test_sio_loopback_fast_path(self):
1480 s = socket.socket()
1481 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001482 try:
1483 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1484 except OSError as exc:
1485 WSAEOPNOTSUPP = 10045
1486 if exc.winerror == WSAEOPNOTSUPP:
1487 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1488 "doesn't implemented in this Windows version")
1489 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001490 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1491
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001492 def testGetaddrinfo(self):
1493 try:
1494 socket.getaddrinfo('localhost', 80)
1495 except socket.gaierror as err:
1496 if err.errno == socket.EAI_SERVICE:
1497 # see http://bugs.python.org/issue1282647
1498 self.skipTest("buggy libc version")
1499 raise
1500 # len of every sequence is supposed to be == 5
1501 for info in socket.getaddrinfo(HOST, None):
1502 self.assertEqual(len(info), 5)
1503 # host can be a domain name, a string representation of an
1504 # IPv4/v6 address or None
1505 socket.getaddrinfo('localhost', 80)
1506 socket.getaddrinfo('127.0.0.1', 80)
1507 socket.getaddrinfo(None, 80)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001508 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001509 socket.getaddrinfo('::1', 80)
1510 # port can be a string service name such as "http", a numeric
1511 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001512 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1513 if (not hasattr(sys, 'getandroidapilevel') or
1514 sys.getandroidapilevel() >= 23):
1515 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001516 socket.getaddrinfo(HOST, 80)
1517 socket.getaddrinfo(HOST, None)
1518 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001519 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1520 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001521 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001522 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1523 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001524 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001525 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1526 for _, socktype, _, _, _ in infos:
1527 self.assertEqual(socktype, socket.SOCK_STREAM)
1528 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001529 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001530 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1531 # a server willing to support both IPv4 and IPv6 will
1532 # usually do this
1533 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1534 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001535 # test keyword arguments
1536 a = socket.getaddrinfo(HOST, None)
1537 b = socket.getaddrinfo(host=HOST, port=None)
1538 self.assertEqual(a, b)
1539 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1540 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1541 self.assertEqual(a, b)
1542 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1543 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1544 self.assertEqual(a, b)
1545 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1546 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1547 self.assertEqual(a, b)
1548 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1549 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1550 self.assertEqual(a, b)
1551 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1552 socket.AI_PASSIVE)
1553 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1554 type=socket.SOCK_STREAM, proto=0,
1555 flags=socket.AI_PASSIVE)
1556 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001557 # Issue #6697.
1558 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001559
Ned Deilyb24f4812014-02-13 22:50:42 -08001560 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001561 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001562 try:
1563 # The arguments here are undefined and the call may succeed
1564 # or fail. All we care here is that it doesn't segfault.
1565 socket.getaddrinfo("localhost", None, 0, 0, 0,
1566 socket.AI_NUMERICSERV)
1567 except socket.gaierror:
1568 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001569
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001570 def test_getnameinfo(self):
1571 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001572 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001573
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001574 @unittest.skipUnless(support.is_resource_enabled('network'),
1575 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001576 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001577 # Check for internet access before running test
1578 # (issue #12804, issue #25138).
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03001579 with socket_helper.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001580 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001581
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001582 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001583 domain = 'испытание.pythontest.net'
1584 socket.gethostbyname(domain)
1585 socket.gethostbyname_ex(domain)
1586 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001587 # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001588 # have a reverse entry yet
1589 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001590
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001591 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001592 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001593 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1594 self.skipTest("signal.alarm and socket.socketpair required for this test")
1595 # Our signal handlers clobber the C errno by calling a math function
1596 # with an invalid domain value.
1597 def ok_handler(*args):
1598 self.assertRaises(ValueError, math.acosh, 0)
1599 def raising_handler(*args):
1600 self.assertRaises(ValueError, math.acosh, 0)
1601 1 // 0
1602 c, s = socket.socketpair()
1603 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1604 try:
1605 if with_timeout:
1606 # Just above the one second minimum for signal.alarm
1607 c.settimeout(1.5)
1608 with self.assertRaises(ZeroDivisionError):
1609 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001610 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001611 if with_timeout:
1612 signal.signal(signal.SIGALRM, ok_handler)
1613 signal.alarm(1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01001614 self.assertRaises(TimeoutError, c.sendall,
Charles-François Natali5fd26422013-08-29 19:01:40 +02001615 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001616 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001617 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001618 signal.signal(signal.SIGALRM, old_alarm)
1619 c.close()
1620 s.close()
1621
1622 def test_sendall_interrupted(self):
1623 self.check_sendall_interrupted(False)
1624
1625 def test_sendall_interrupted_with_timeout(self):
1626 self.check_sendall_interrupted(True)
1627
Antoine Pitroue033e062010-10-29 10:38:18 +00001628 def test_dealloc_warn(self):
1629 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1630 r = repr(sock)
1631 with self.assertWarns(ResourceWarning) as cm:
1632 sock = None
1633 support.gc_collect()
1634 self.assertIn(r, str(cm.warning.args[0]))
1635 # An open socket file object gets dereferenced after the socket
1636 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1637 f = sock.makefile('rb')
1638 r = repr(sock)
1639 sock = None
1640 support.gc_collect()
1641 with self.assertWarns(ResourceWarning):
1642 f = None
1643 support.gc_collect()
1644
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001645 def test_name_closed_socketio(self):
1646 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1647 fp = sock.makefile("rb")
1648 fp.close()
1649 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1650
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001651 def test_unusable_closed_socketio(self):
1652 with socket.socket() as sock:
1653 fp = sock.makefile("rb", buffering=0)
1654 self.assertTrue(fp.readable())
1655 self.assertFalse(fp.writable())
1656 self.assertFalse(fp.seekable())
1657 fp.close()
1658 self.assertRaises(ValueError, fp.readable)
1659 self.assertRaises(ValueError, fp.writable)
1660 self.assertRaises(ValueError, fp.seekable)
1661
Christian Heimesd0e31b92018-01-27 09:54:13 +01001662 def test_socket_close(self):
1663 sock = socket.socket()
1664 try:
1665 sock.bind((HOST, 0))
1666 socket.close(sock.fileno())
1667 with self.assertRaises(OSError):
1668 sock.listen(1)
1669 finally:
1670 with self.assertRaises(OSError):
1671 # sock.close() fails with EBADF
1672 sock.close()
1673 with self.assertRaises(TypeError):
1674 socket.close(None)
1675 with self.assertRaises(OSError):
1676 socket.close(-1)
1677
Berker Peksag3fe64d02016-02-18 17:34:00 +02001678 def test_makefile_mode(self):
1679 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1680 with self.subTest(mode=mode):
1681 with socket.socket() as sock:
1682 with sock.makefile(mode) as fp:
1683 self.assertEqual(fp.mode, mode)
1684
1685 def test_makefile_invalid_mode(self):
1686 for mode in 'rt', 'x', '+', 'a':
1687 with self.subTest(mode=mode):
1688 with socket.socket() as sock:
1689 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1690 sock.makefile(mode)
1691
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001692 def test_pickle(self):
1693 sock = socket.socket()
1694 with sock:
1695 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1696 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001697 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1698 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1699 self.assertEqual(family, socket.AF_INET)
1700 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1701 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001702
Serhiy Storchaka78980432013-01-15 01:12:17 +02001703 def test_listen_backlog(self):
1704 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001705 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1706 srv.bind((HOST, 0))
1707 srv.listen(backlog)
1708
1709 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001710 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001711 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001712
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001713 @support.cpython_only
1714 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001715 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001716 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001717 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1718 srv.bind((HOST, 0))
1719 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001720
Serhiy Storchaka16994912020-04-25 10:06:29 +03001721 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001722 def test_flowinfo(self):
1723 self.assertRaises(OverflowError, socket.getnameinfo,
Serhiy Storchaka16994912020-04-25 10:06:29 +03001724 (socket_helper.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001725 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03001726 self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001727
Serhiy Storchaka16994912020-04-25 10:06:29 +03001728 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001729 def test_getaddrinfo_ipv6_basic(self):
1730 ((*_, sockaddr),) = socket.getaddrinfo(
1731 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1732 1234, socket.AF_INET6,
1733 socket.SOCK_DGRAM,
1734 socket.IPPROTO_UDP
1735 )
1736 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1737
Serhiy Storchaka16994912020-04-25 10:06:29 +03001738 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001739 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001740 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
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:
1797 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001798 self.assertEqual(str(s.type), 'SocketKind.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
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001945
Charles-François Natali47413c12011-10-06 19:47:44 +02001946@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1947class BasicCANTest(unittest.TestCase):
1948
1949 def testCrucialConstants(self):
1950 socket.AF_CAN
1951 socket.PF_CAN
1952 socket.CAN_RAW
1953
Charles-François Natali773e42d2013-02-05 19:42:01 +01001954 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1955 'socket.CAN_BCM required for this test.')
1956 def testBCMConstants(self):
1957 socket.CAN_BCM
1958
1959 # opcodes
1960 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1961 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1962 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1963 socket.CAN_BCM_TX_SEND # send one CAN frame
1964 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1965 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1966 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1967 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1968 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1969 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1970 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1971 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1972
karl ding31c4fd22019-07-31 01:47:16 -07001973 # flags
1974 socket.CAN_BCM_SETTIMER
1975 socket.CAN_BCM_STARTTIMER
1976 socket.CAN_BCM_TX_COUNTEVT
1977 socket.CAN_BCM_TX_ANNOUNCE
1978 socket.CAN_BCM_TX_CP_CAN_ID
1979 socket.CAN_BCM_RX_FILTER_ID
1980 socket.CAN_BCM_RX_CHECK_DLC
1981 socket.CAN_BCM_RX_NO_AUTOTIMER
1982 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1983 socket.CAN_BCM_TX_RESET_MULTI_IDX
1984 socket.CAN_BCM_RX_RTR_FRAME
1985
Charles-François Natali47413c12011-10-06 19:47:44 +02001986 def testCreateSocket(self):
1987 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1988 pass
1989
Charles-François Natali773e42d2013-02-05 19:42:01 +01001990 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1991 'socket.CAN_BCM required for this test.')
1992 def testCreateBCMSocket(self):
1993 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1994 pass
1995
Charles-François Natali47413c12011-10-06 19:47:44 +02001996 def testBindAny(self):
1997 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001998 address = ('', )
1999 s.bind(address)
2000 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02002001
2002 def testTooLongInterfaceName(self):
2003 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2004 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002005 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02002006 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02002007
2008 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
2009 'socket.CAN_RAW_LOOPBACK required for this test.')
2010 def testLoopback(self):
2011 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2012 for loopback in (0, 1):
2013 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
2014 loopback)
2015 self.assertEqual(loopback,
2016 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
2017
2018 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
2019 'socket.CAN_RAW_FILTER required for this test.')
2020 def testFilter(self):
2021 can_id, can_mask = 0x200, 0x700
2022 can_filter = struct.pack("=II", can_id, can_mask)
2023 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2024 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
2025 self.assertEqual(can_filter,
2026 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002027 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02002028
2029
2030@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02002031class CANTest(ThreadedCANSocketTest):
2032
Charles-François Natali47413c12011-10-06 19:47:44 +02002033 def __init__(self, methodName='runTest'):
2034 ThreadedCANSocketTest.__init__(self, methodName=methodName)
2035
2036 @classmethod
2037 def build_can_frame(cls, can_id, data):
2038 """Build a CAN frame."""
2039 can_dlc = len(data)
2040 data = data.ljust(8, b'\x00')
2041 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2042
2043 @classmethod
2044 def dissect_can_frame(cls, frame):
2045 """Dissect a CAN frame."""
2046 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2047 return (can_id, can_dlc, data[:can_dlc])
2048
2049 def testSendFrame(self):
2050 cf, addr = self.s.recvfrom(self.bufsize)
2051 self.assertEqual(self.cf, cf)
2052 self.assertEqual(addr[0], self.interface)
2053 self.assertEqual(addr[1], socket.AF_CAN)
2054
2055 def _testSendFrame(self):
2056 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2057 self.cli.send(self.cf)
2058
2059 def testSendMaxFrame(self):
2060 cf, addr = self.s.recvfrom(self.bufsize)
2061 self.assertEqual(self.cf, cf)
2062
2063 def _testSendMaxFrame(self):
2064 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2065 self.cli.send(self.cf)
2066
2067 def testSendMultiFrames(self):
2068 cf, addr = self.s.recvfrom(self.bufsize)
2069 self.assertEqual(self.cf1, cf)
2070
2071 cf, addr = self.s.recvfrom(self.bufsize)
2072 self.assertEqual(self.cf2, cf)
2073
2074 def _testSendMultiFrames(self):
2075 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2076 self.cli.send(self.cf1)
2077
2078 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2079 self.cli.send(self.cf2)
2080
Charles-François Natali773e42d2013-02-05 19:42:01 +01002081 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2082 'socket.CAN_BCM required for this test.')
2083 def _testBCM(self):
2084 cf, addr = self.cli.recvfrom(self.bufsize)
2085 self.assertEqual(self.cf, cf)
2086 can_id, can_dlc, data = self.dissect_can_frame(cf)
2087 self.assertEqual(self.can_id, can_id)
2088 self.assertEqual(self.data, data)
2089
2090 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2091 'socket.CAN_BCM required for this test.')
2092 def testBCM(self):
2093 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2094 self.addCleanup(bcm.close)
2095 bcm.connect((self.interface,))
2096 self.can_id = 0x123
2097 self.data = bytes([0xc0, 0xff, 0xee])
2098 self.cf = self.build_can_frame(self.can_id, self.data)
2099 opcode = socket.CAN_BCM_TX_SEND
2100 flags = 0
2101 count = 0
2102 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2103 bcm_can_id = 0x0222
2104 nframes = 1
2105 assert len(self.cf) == 16
2106 header = struct.pack(self.bcm_cmd_msg_fmt,
2107 opcode,
2108 flags,
2109 count,
2110 ival1_seconds,
2111 ival1_usec,
2112 ival2_seconds,
2113 ival2_usec,
2114 bcm_can_id,
2115 nframes,
2116 )
2117 header_plus_frame = header + self.cf
2118 bytes_sent = bcm.send(header_plus_frame)
2119 self.assertEqual(bytes_sent, len(header_plus_frame))
2120
Charles-François Natali47413c12011-10-06 19:47:44 +02002121
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002122@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2123class ISOTPTest(unittest.TestCase):
2124
2125 def __init__(self, *args, **kwargs):
2126 super().__init__(*args, **kwargs)
2127 self.interface = "vcan0"
2128
2129 def testCrucialConstants(self):
2130 socket.AF_CAN
2131 socket.PF_CAN
2132 socket.CAN_ISOTP
2133 socket.SOCK_DGRAM
2134
2135 def testCreateSocket(self):
2136 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2137 pass
2138
2139 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2140 'socket.CAN_ISOTP required for this test.')
2141 def testCreateISOTPSocket(self):
2142 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2143 pass
2144
2145 def testTooLongInterfaceName(self):
2146 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2147 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2148 with self.assertRaisesRegex(OSError, 'interface name too long'):
2149 s.bind(('x' * 1024, 1, 2))
2150
2151 def testBind(self):
2152 try:
2153 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2154 addr = self.interface, 0x123, 0x456
2155 s.bind(addr)
2156 self.assertEqual(s.getsockname(), addr)
2157 except OSError as e:
2158 if e.errno == errno.ENODEV:
2159 self.skipTest('network interface `%s` does not exist' %
2160 self.interface)
2161 else:
2162 raise
2163
2164
karl ding360371f2020-04-29 15:31:19 -07002165@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2166class J1939Test(unittest.TestCase):
2167
2168 def __init__(self, *args, **kwargs):
2169 super().__init__(*args, **kwargs)
2170 self.interface = "vcan0"
2171
2172 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2173 'socket.CAN_J1939 required for this test.')
2174 def testJ1939Constants(self):
2175 socket.CAN_J1939
2176
2177 socket.J1939_MAX_UNICAST_ADDR
2178 socket.J1939_IDLE_ADDR
2179 socket.J1939_NO_ADDR
2180 socket.J1939_NO_NAME
2181 socket.J1939_PGN_REQUEST
2182 socket.J1939_PGN_ADDRESS_CLAIMED
2183 socket.J1939_PGN_ADDRESS_COMMANDED
2184 socket.J1939_PGN_PDU1_MAX
2185 socket.J1939_PGN_MAX
2186 socket.J1939_NO_PGN
2187
2188 # J1939 socket options
2189 socket.SO_J1939_FILTER
2190 socket.SO_J1939_PROMISC
2191 socket.SO_J1939_SEND_PRIO
2192 socket.SO_J1939_ERRQUEUE
2193
2194 socket.SCM_J1939_DEST_ADDR
2195 socket.SCM_J1939_DEST_NAME
2196 socket.SCM_J1939_PRIO
2197 socket.SCM_J1939_ERRQUEUE
2198
2199 socket.J1939_NLA_PAD
2200 socket.J1939_NLA_BYTES_ACKED
2201
2202 socket.J1939_EE_INFO_NONE
2203 socket.J1939_EE_INFO_TX_ABORT
2204
2205 socket.J1939_FILTER_MAX
2206
2207 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2208 'socket.CAN_J1939 required for this test.')
2209 def testCreateJ1939Socket(self):
2210 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2211 pass
2212
2213 def testBind(self):
2214 try:
2215 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2216 addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2217 s.bind(addr)
2218 self.assertEqual(s.getsockname(), addr)
2219 except OSError as e:
2220 if e.errno == errno.ENODEV:
2221 self.skipTest('network interface `%s` does not exist' %
2222 self.interface)
2223 else:
2224 raise
2225
2226
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002227@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2228class BasicRDSTest(unittest.TestCase):
2229
2230 def testCrucialConstants(self):
2231 socket.AF_RDS
2232 socket.PF_RDS
2233
2234 def testCreateSocket(self):
2235 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2236 pass
2237
2238 def testSocketBufferSize(self):
2239 bufsize = 16384
2240 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2241 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2242 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2243
2244
2245@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002246class RDSTest(ThreadedRDSSocketTest):
2247
2248 def __init__(self, methodName='runTest'):
2249 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2250
Charles-François Natali240c55f2011-11-10 20:33:36 +01002251 def setUp(self):
2252 super().setUp()
2253 self.evt = threading.Event()
2254
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002255 def testSendAndRecv(self):
2256 data, addr = self.serv.recvfrom(self.bufsize)
2257 self.assertEqual(self.data, data)
2258 self.assertEqual(self.cli_addr, addr)
2259
2260 def _testSendAndRecv(self):
2261 self.data = b'spam'
2262 self.cli.sendto(self.data, 0, (HOST, self.port))
2263
2264 def testPeek(self):
2265 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2266 self.assertEqual(self.data, data)
2267 data, addr = self.serv.recvfrom(self.bufsize)
2268 self.assertEqual(self.data, data)
2269
2270 def _testPeek(self):
2271 self.data = b'spam'
2272 self.cli.sendto(self.data, 0, (HOST, self.port))
2273
2274 @requireAttrs(socket.socket, 'recvmsg')
2275 def testSendAndRecvMsg(self):
2276 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2277 self.assertEqual(self.data, data)
2278
2279 @requireAttrs(socket.socket, 'sendmsg')
2280 def _testSendAndRecvMsg(self):
2281 self.data = b'hello ' * 10
2282 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2283
2284 def testSendAndRecvMulti(self):
2285 data, addr = self.serv.recvfrom(self.bufsize)
2286 self.assertEqual(self.data1, data)
2287
2288 data, addr = self.serv.recvfrom(self.bufsize)
2289 self.assertEqual(self.data2, data)
2290
2291 def _testSendAndRecvMulti(self):
2292 self.data1 = b'bacon'
2293 self.cli.sendto(self.data1, 0, (HOST, self.port))
2294
2295 self.data2 = b'egg'
2296 self.cli.sendto(self.data2, 0, (HOST, self.port))
2297
2298 def testSelect(self):
2299 r, w, x = select.select([self.serv], [], [], 3.0)
2300 self.assertIn(self.serv, r)
2301 data, addr = self.serv.recvfrom(self.bufsize)
2302 self.assertEqual(self.data, data)
2303
2304 def _testSelect(self):
2305 self.data = b'select'
2306 self.cli.sendto(self.data, 0, (HOST, self.port))
2307
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002308@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2309 'QIPCRTR sockets required for this test.')
2310class BasicQIPCRTRTest(unittest.TestCase):
2311
2312 def testCrucialConstants(self):
2313 socket.AF_QIPCRTR
2314
2315 def testCreateSocket(self):
2316 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2317 pass
2318
2319 def testUnbound(self):
2320 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2321 self.assertEqual(s.getsockname()[1], 0)
2322
2323 def testBindSock(self):
2324 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002325 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002326 self.assertNotEqual(s.getsockname()[1], 0)
2327
2328 def testInvalidBindSock(self):
2329 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002330 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002331
2332 def testAutoBindSock(self):
2333 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2334 s.connect((123, 123))
2335 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002336
caaveryeffc12f2017-09-06 18:18:10 -04002337@unittest.skipIf(fcntl is None, "need fcntl")
2338@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2339 'VSOCK sockets required for this test.')
2340class BasicVSOCKTest(unittest.TestCase):
2341
2342 def testCrucialConstants(self):
2343 socket.AF_VSOCK
2344
2345 def testVSOCKConstants(self):
2346 socket.SO_VM_SOCKETS_BUFFER_SIZE
2347 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2348 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2349 socket.VMADDR_CID_ANY
2350 socket.VMADDR_PORT_ANY
2351 socket.VMADDR_CID_HOST
2352 socket.VM_SOCKETS_INVALID_VERSION
2353 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2354
2355 def testCreateSocket(self):
2356 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2357 pass
2358
2359 def testSocketBufferSize(self):
2360 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2361 orig_max = s.getsockopt(socket.AF_VSOCK,
2362 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2363 orig = s.getsockopt(socket.AF_VSOCK,
2364 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2365 orig_min = s.getsockopt(socket.AF_VSOCK,
2366 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2367
2368 s.setsockopt(socket.AF_VSOCK,
2369 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2370 s.setsockopt(socket.AF_VSOCK,
2371 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2372 s.setsockopt(socket.AF_VSOCK,
2373 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2374
2375 self.assertEqual(orig_max * 2,
2376 s.getsockopt(socket.AF_VSOCK,
2377 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2378 self.assertEqual(orig * 2,
2379 s.getsockopt(socket.AF_VSOCK,
2380 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2381 self.assertEqual(orig_min * 2,
2382 s.getsockopt(socket.AF_VSOCK,
2383 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2384
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002385
Greg Bowser8fbece12019-08-02 16:29:52 -04002386@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2387 'Bluetooth sockets required for this test.')
2388class BasicBluetoothTest(unittest.TestCase):
2389
2390 def testBluetoothConstants(self):
2391 socket.BDADDR_ANY
2392 socket.BDADDR_LOCAL
2393 socket.AF_BLUETOOTH
2394 socket.BTPROTO_RFCOMM
2395
2396 if sys.platform != "win32":
2397 socket.BTPROTO_HCI
2398 socket.SOL_HCI
2399 socket.BTPROTO_L2CAP
2400
2401 if not sys.platform.startswith("freebsd"):
2402 socket.BTPROTO_SCO
2403
2404 def testCreateRfcommSocket(self):
2405 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2406 pass
2407
2408 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2409 def testCreateL2capSocket(self):
2410 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2411 pass
2412
2413 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2414 def testCreateHciSocket(self):
2415 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2416 pass
2417
2418 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2419 "windows and freebsd do not support SCO sockets")
2420 def testCreateScoSocket(self):
2421 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2422 pass
2423
2424
Guido van Rossum24e4af82002-06-12 19:18:08 +00002425class BasicTCPTest(SocketConnectedTest):
2426
2427 def __init__(self, methodName='runTest'):
2428 SocketConnectedTest.__init__(self, methodName=methodName)
2429
2430 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002431 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002432 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002433 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002434
2435 def _testRecv(self):
2436 self.serv_conn.send(MSG)
2437
2438 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002439 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002440 seg1 = self.cli_conn.recv(len(MSG) - 3)
2441 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002442 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002443 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002444
2445 def _testOverFlowRecv(self):
2446 self.serv_conn.send(MSG)
2447
2448 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002449 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002450 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002451 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002452
2453 def _testRecvFrom(self):
2454 self.serv_conn.send(MSG)
2455
2456 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002457 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002458 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2459 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002460 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002461 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002462
2463 def _testOverFlowRecvFrom(self):
2464 self.serv_conn.send(MSG)
2465
2466 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002467 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002468 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002469 while 1:
2470 read = self.cli_conn.recv(1024)
2471 if not read:
2472 break
Guido van Rossume531e292002-08-08 20:28:34 +00002473 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002474 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002475
2476 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002477 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002478 self.serv_conn.sendall(big_chunk)
2479
2480 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002481 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002482 fd = self.cli_conn.fileno()
2483 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002484 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002485 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002486 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002487 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002488
2489 def _testFromFd(self):
2490 self.serv_conn.send(MSG)
2491
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002492 def testDup(self):
2493 # Testing dup()
2494 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002495 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002496 msg = sock.recv(1024)
2497 self.assertEqual(msg, MSG)
2498
2499 def _testDup(self):
2500 self.serv_conn.send(MSG)
2501
Guido van Rossum24e4af82002-06-12 19:18:08 +00002502 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002503 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002504 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002505 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002506 # wait for _testShutdown to finish: on OS X, when the server
2507 # closes the connection the client also becomes disconnected,
2508 # and the client's shutdown call will fail. (Issue #4397.)
2509 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002510
2511 def _testShutdown(self):
2512 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002513 self.serv_conn.shutdown(2)
2514
2515 testShutdown_overflow = support.cpython_only(testShutdown)
2516
2517 @support.cpython_only
2518 def _testShutdown_overflow(self):
2519 import _testcapi
2520 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002521 # Issue 15989
2522 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2523 _testcapi.INT_MAX + 1)
2524 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2525 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002526 self.serv_conn.shutdown(2)
2527
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002528 def testDetach(self):
2529 # Testing detach()
2530 fileno = self.cli_conn.fileno()
2531 f = self.cli_conn.detach()
2532 self.assertEqual(f, fileno)
2533 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002534 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002535 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002536 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002537 # ...but we can create another socket using the (still open)
2538 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002539 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002540 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002541 msg = sock.recv(1024)
2542 self.assertEqual(msg, MSG)
2543
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002544 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002545 self.serv_conn.send(MSG)
2546
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002547
Guido van Rossum24e4af82002-06-12 19:18:08 +00002548class BasicUDPTest(ThreadedUDPSocketTest):
2549
2550 def __init__(self, methodName='runTest'):
2551 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2552
2553 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002554 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002555 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002556 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002557
2558 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002559 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002560
Guido van Rossum1c938012002-06-12 21:17:20 +00002561 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002562 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002563 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002564 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002565
Guido van Rossum1c938012002-06-12 21:17:20 +00002566 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002567 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002568
Guido van Rossumd8faa362007-04-27 19:54:29 +00002569 def testRecvFromNegative(self):
2570 # Negative lengths passed to recvfrom should give ValueError.
2571 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2572
2573 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002574 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002575
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002576
2577@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2578 'UDPLITE sockets required for this test.')
2579class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2580
2581 def __init__(self, methodName='runTest'):
2582 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2583
2584 def testSendtoAndRecv(self):
2585 # Testing sendto() and Recv() over UDPLITE
2586 msg = self.serv.recv(len(MSG))
2587 self.assertEqual(msg, MSG)
2588
2589 def _testSendtoAndRecv(self):
2590 self.cli.sendto(MSG, 0, (HOST, self.port))
2591
2592 def testRecvFrom(self):
2593 # Testing recvfrom() over UDPLITE
2594 msg, addr = self.serv.recvfrom(len(MSG))
2595 self.assertEqual(msg, MSG)
2596
2597 def _testRecvFrom(self):
2598 self.cli.sendto(MSG, 0, (HOST, self.port))
2599
2600 def testRecvFromNegative(self):
2601 # Negative lengths passed to recvfrom should give ValueError.
2602 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2603
2604 def _testRecvFromNegative(self):
2605 self.cli.sendto(MSG, 0, (HOST, self.port))
2606
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002607# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2608# same test code is used with different families and types of socket
2609# (e.g. stream, datagram), and tests using recvmsg() are repeated
2610# using recvmsg_into().
2611#
2612# The generic test classes such as SendmsgTests and
2613# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2614# supplied with sockets cli_sock and serv_sock representing the
2615# client's and the server's end of the connection respectively, and
2616# attributes cli_addr and serv_addr holding their (numeric where
2617# appropriate) addresses.
2618#
2619# The final concrete test classes combine these with subclasses of
2620# SocketTestBase which set up client and server sockets of a specific
2621# type, and with subclasses of SendrecvmsgBase such as
2622# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2623# sockets to cli_sock and serv_sock and override the methods and
2624# attributes of SendrecvmsgBase to fill in destination addresses if
2625# needed when sending, check for specific flags in msg_flags, etc.
2626#
2627# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2628# recvmsg_into().
2629
2630# XXX: like the other datagram (UDP) tests in this module, the code
2631# here assumes that datagram delivery on the local machine will be
2632# reliable.
2633
2634class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2635 # Base class for sendmsg()/recvmsg() tests.
2636
2637 # Time in seconds to wait before considering a test failed, or
2638 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002639 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002640
2641 def setUp(self):
2642 self.misc_event = threading.Event()
2643 super().setUp()
2644
2645 def sendToServer(self, msg):
2646 # Send msg to the server.
2647 return self.cli_sock.send(msg)
2648
2649 # Tuple of alternative default arguments for sendmsg() when called
2650 # via sendmsgToServer() (e.g. to include a destination address).
2651 sendmsg_to_server_defaults = ()
2652
2653 def sendmsgToServer(self, *args):
2654 # Call sendmsg() on self.cli_sock with the given arguments,
2655 # filling in any arguments which are not supplied with the
2656 # corresponding items of self.sendmsg_to_server_defaults, if
2657 # any.
2658 return self.cli_sock.sendmsg(
2659 *(args + self.sendmsg_to_server_defaults[len(args):]))
2660
2661 def doRecvmsg(self, sock, bufsize, *args):
2662 # Call recvmsg() on sock with given arguments and return its
2663 # result. Should be used for tests which can use either
2664 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2665 # this method with one which emulates it using recvmsg_into(),
2666 # thus allowing the same test to be used for both methods.
2667 result = sock.recvmsg(bufsize, *args)
2668 self.registerRecvmsgResult(result)
2669 return result
2670
2671 def registerRecvmsgResult(self, result):
2672 # Called by doRecvmsg() with the return value of recvmsg() or
2673 # recvmsg_into(). Can be overridden to arrange cleanup based
2674 # on the returned ancillary data, for instance.
2675 pass
2676
2677 def checkRecvmsgAddress(self, addr1, addr2):
2678 # Called to compare the received address with the address of
2679 # the peer.
2680 self.assertEqual(addr1, addr2)
2681
2682 # Flags that are normally unset in msg_flags
2683 msg_flags_common_unset = 0
2684 for name in ("MSG_CTRUNC", "MSG_OOB"):
2685 msg_flags_common_unset |= getattr(socket, name, 0)
2686
2687 # Flags that are normally set
2688 msg_flags_common_set = 0
2689
2690 # Flags set when a complete record has been received (e.g. MSG_EOR
2691 # for SCTP)
2692 msg_flags_eor_indicator = 0
2693
2694 # Flags set when a complete record has not been received
2695 # (e.g. MSG_TRUNC for datagram sockets)
2696 msg_flags_non_eor_indicator = 0
2697
2698 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2699 # Method to check the value of msg_flags returned by recvmsg[_into]().
2700 #
2701 # Checks that all bits in msg_flags_common_set attribute are
2702 # set in "flags" and all bits in msg_flags_common_unset are
2703 # unset.
2704 #
2705 # The "eor" argument specifies whether the flags should
2706 # indicate that a full record (or datagram) has been received.
2707 # If "eor" is None, no checks are done; otherwise, checks
2708 # that:
2709 #
2710 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2711 # set and all bits in msg_flags_non_eor_indicator are unset
2712 #
2713 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2714 # are set and all bits in msg_flags_eor_indicator are unset
2715 #
2716 # If "checkset" and/or "checkunset" are supplied, they require
2717 # the given bits to be set or unset respectively, overriding
2718 # what the attributes require for those bits.
2719 #
2720 # If any bits are set in "ignore", they will not be checked,
2721 # regardless of the other inputs.
2722 #
2723 # Will raise Exception if the inputs require a bit to be both
2724 # set and unset, and it is not ignored.
2725
2726 defaultset = self.msg_flags_common_set
2727 defaultunset = self.msg_flags_common_unset
2728
2729 if eor:
2730 defaultset |= self.msg_flags_eor_indicator
2731 defaultunset |= self.msg_flags_non_eor_indicator
2732 elif eor is not None:
2733 defaultset |= self.msg_flags_non_eor_indicator
2734 defaultunset |= self.msg_flags_eor_indicator
2735
2736 # Function arguments override defaults
2737 defaultset &= ~checkunset
2738 defaultunset &= ~checkset
2739
2740 # Merge arguments with remaining defaults, and check for conflicts
2741 checkset |= defaultset
2742 checkunset |= defaultunset
2743 inboth = checkset & checkunset & ~ignore
2744 if inboth:
2745 raise Exception("contradictory set, unset requirements for flags "
2746 "{0:#x}".format(inboth))
2747
2748 # Compare with given msg_flags value
2749 mask = (checkset | checkunset) & ~ignore
2750 self.assertEqual(flags & mask, checkset & mask)
2751
2752
2753class RecvmsgIntoMixin(SendrecvmsgBase):
2754 # Mixin to implement doRecvmsg() using recvmsg_into().
2755
2756 def doRecvmsg(self, sock, bufsize, *args):
2757 buf = bytearray(bufsize)
2758 result = sock.recvmsg_into([buf], *args)
2759 self.registerRecvmsgResult(result)
2760 self.assertGreaterEqual(result[0], 0)
2761 self.assertLessEqual(result[0], bufsize)
2762 return (bytes(buf[:result[0]]),) + result[1:]
2763
2764
2765class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2766 # Defines flags to be checked in msg_flags for datagram sockets.
2767
2768 @property
2769 def msg_flags_non_eor_indicator(self):
2770 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2771
2772
2773class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2774 # Defines flags to be checked in msg_flags for SCTP sockets.
2775
2776 @property
2777 def msg_flags_eor_indicator(self):
2778 return super().msg_flags_eor_indicator | socket.MSG_EOR
2779
2780
2781class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2782 # Base class for tests on connectionless-mode sockets. Users must
2783 # supply sockets on attributes cli and serv to be mapped to
2784 # cli_sock and serv_sock respectively.
2785
2786 @property
2787 def serv_sock(self):
2788 return self.serv
2789
2790 @property
2791 def cli_sock(self):
2792 return self.cli
2793
2794 @property
2795 def sendmsg_to_server_defaults(self):
2796 return ([], [], 0, self.serv_addr)
2797
2798 def sendToServer(self, msg):
2799 return self.cli_sock.sendto(msg, self.serv_addr)
2800
2801
2802class SendrecvmsgConnectedBase(SendrecvmsgBase):
2803 # Base class for tests on connected sockets. Users must supply
2804 # sockets on attributes serv_conn and cli_conn (representing the
2805 # connections *to* the server and the client), to be mapped to
2806 # cli_sock and serv_sock respectively.
2807
2808 @property
2809 def serv_sock(self):
2810 return self.cli_conn
2811
2812 @property
2813 def cli_sock(self):
2814 return self.serv_conn
2815
2816 def checkRecvmsgAddress(self, addr1, addr2):
2817 # Address is currently "unspecified" for a connected socket,
2818 # so we don't examine it
2819 pass
2820
2821
2822class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2823 # Base class to set a timeout on server's socket.
2824
2825 def setUp(self):
2826 super().setUp()
2827 self.serv_sock.settimeout(self.fail_timeout)
2828
2829
2830class SendmsgTests(SendrecvmsgServerTimeoutBase):
2831 # Tests for sendmsg() which can use any socket type and do not
2832 # involve recvmsg() or recvmsg_into().
2833
2834 def testSendmsg(self):
2835 # Send a simple message with sendmsg().
2836 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2837
2838 def _testSendmsg(self):
2839 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2840
2841 def testSendmsgDataGenerator(self):
2842 # Send from buffer obtained from a generator (not a sequence).
2843 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2844
2845 def _testSendmsgDataGenerator(self):
2846 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2847 len(MSG))
2848
2849 def testSendmsgAncillaryGenerator(self):
2850 # Gather (empty) ancillary data from a generator.
2851 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2852
2853 def _testSendmsgAncillaryGenerator(self):
2854 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2855 len(MSG))
2856
2857 def testSendmsgArray(self):
2858 # Send data from an array instead of the usual bytes object.
2859 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2860
2861 def _testSendmsgArray(self):
2862 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2863 len(MSG))
2864
2865 def testSendmsgGather(self):
2866 # Send message data from more than one buffer (gather write).
2867 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2868
2869 def _testSendmsgGather(self):
2870 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2871
2872 def testSendmsgBadArgs(self):
2873 # Check that sendmsg() rejects invalid arguments.
2874 self.assertEqual(self.serv_sock.recv(1000), b"done")
2875
2876 def _testSendmsgBadArgs(self):
2877 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2878 self.assertRaises(TypeError, self.sendmsgToServer,
2879 b"not in an iterable")
2880 self.assertRaises(TypeError, self.sendmsgToServer,
2881 object())
2882 self.assertRaises(TypeError, self.sendmsgToServer,
2883 [object()])
2884 self.assertRaises(TypeError, self.sendmsgToServer,
2885 [MSG, object()])
2886 self.assertRaises(TypeError, self.sendmsgToServer,
2887 [MSG], object())
2888 self.assertRaises(TypeError, self.sendmsgToServer,
2889 [MSG], [], object())
2890 self.assertRaises(TypeError, self.sendmsgToServer,
2891 [MSG], [], 0, object())
2892 self.sendToServer(b"done")
2893
2894 def testSendmsgBadCmsg(self):
2895 # Check that invalid ancillary data items are rejected.
2896 self.assertEqual(self.serv_sock.recv(1000), b"done")
2897
2898 def _testSendmsgBadCmsg(self):
2899 self.assertRaises(TypeError, self.sendmsgToServer,
2900 [MSG], [object()])
2901 self.assertRaises(TypeError, self.sendmsgToServer,
2902 [MSG], [(object(), 0, b"data")])
2903 self.assertRaises(TypeError, self.sendmsgToServer,
2904 [MSG], [(0, object(), b"data")])
2905 self.assertRaises(TypeError, self.sendmsgToServer,
2906 [MSG], [(0, 0, object())])
2907 self.assertRaises(TypeError, self.sendmsgToServer,
2908 [MSG], [(0, 0)])
2909 self.assertRaises(TypeError, self.sendmsgToServer,
2910 [MSG], [(0, 0, b"data", 42)])
2911 self.sendToServer(b"done")
2912
2913 @requireAttrs(socket, "CMSG_SPACE")
2914 def testSendmsgBadMultiCmsg(self):
2915 # Check that invalid ancillary data items are rejected when
2916 # more than one item is present.
2917 self.assertEqual(self.serv_sock.recv(1000), b"done")
2918
2919 @testSendmsgBadMultiCmsg.client_skip
2920 def _testSendmsgBadMultiCmsg(self):
2921 self.assertRaises(TypeError, self.sendmsgToServer,
2922 [MSG], [0, 0, b""])
2923 self.assertRaises(TypeError, self.sendmsgToServer,
2924 [MSG], [(0, 0, b""), object()])
2925 self.sendToServer(b"done")
2926
2927 def testSendmsgExcessCmsgReject(self):
2928 # Check that sendmsg() rejects excess ancillary data items
2929 # when the number that can be sent is limited.
2930 self.assertEqual(self.serv_sock.recv(1000), b"done")
2931
2932 def _testSendmsgExcessCmsgReject(self):
2933 if not hasattr(socket, "CMSG_SPACE"):
2934 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002935 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002936 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2937 self.assertIsNone(cm.exception.errno)
2938 self.sendToServer(b"done")
2939
2940 def testSendmsgAfterClose(self):
2941 # Check that sendmsg() fails on a closed socket.
2942 pass
2943
2944 def _testSendmsgAfterClose(self):
2945 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002946 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002947
2948
2949class SendmsgStreamTests(SendmsgTests):
2950 # Tests for sendmsg() which require a stream socket and do not
2951 # involve recvmsg() or recvmsg_into().
2952
2953 def testSendmsgExplicitNoneAddr(self):
2954 # Check that peer address can be specified as None.
2955 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2956
2957 def _testSendmsgExplicitNoneAddr(self):
2958 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2959
2960 def testSendmsgTimeout(self):
2961 # Check that timeout works with sendmsg().
2962 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2963 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2964
2965 def _testSendmsgTimeout(self):
2966 try:
2967 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002968 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002969 while True:
2970 self.sendmsgToServer([b"a"*512])
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002971 except TimeoutError:
Victor Stinner46f40be2018-09-25 08:30:15 -07002972 pass
2973 except OSError as exc:
2974 if exc.errno != errno.ENOMEM:
2975 raise
2976 # bpo-33937 the test randomly fails on Travis CI with
2977 # "OSError: [Errno 12] Cannot allocate memory"
2978 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002979 self.fail("TimeoutError not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002980 finally:
2981 self.misc_event.set()
2982
2983 # XXX: would be nice to have more tests for sendmsg flags argument.
2984
2985 # Linux supports MSG_DONTWAIT when sending, but in general, it
2986 # only works when receiving. Could add other platforms if they
2987 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002988 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002989 "MSG_DONTWAIT not known to work on this platform when "
2990 "sending")
2991 def testSendmsgDontWait(self):
2992 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2993 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2994 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2995
2996 @testSendmsgDontWait.client_skip
2997 def _testSendmsgDontWait(self):
2998 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002999 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003000 while True:
3001 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07003002 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
3003 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003004 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07003005 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003006 finally:
3007 self.misc_event.set()
3008
3009
3010class SendmsgConnectionlessTests(SendmsgTests):
3011 # Tests for sendmsg() which require a connectionless-mode
3012 # (e.g. datagram) socket, and do not involve recvmsg() or
3013 # recvmsg_into().
3014
3015 def testSendmsgNoDestAddr(self):
3016 # Check that sendmsg() fails when no destination address is
3017 # given for unconnected socket.
3018 pass
3019
3020 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003021 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003022 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003023 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003024 [MSG], [], 0, None)
3025
3026
3027class RecvmsgGenericTests(SendrecvmsgBase):
3028 # Tests for recvmsg() which can also be emulated using
3029 # recvmsg_into(), and can use any socket type.
3030
3031 def testRecvmsg(self):
3032 # Receive a simple message with recvmsg[_into]().
3033 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3034 self.assertEqual(msg, MSG)
3035 self.checkRecvmsgAddress(addr, self.cli_addr)
3036 self.assertEqual(ancdata, [])
3037 self.checkFlags(flags, eor=True)
3038
3039 def _testRecvmsg(self):
3040 self.sendToServer(MSG)
3041
3042 def testRecvmsgExplicitDefaults(self):
3043 # Test recvmsg[_into]() with default arguments provided explicitly.
3044 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3045 len(MSG), 0, 0)
3046 self.assertEqual(msg, MSG)
3047 self.checkRecvmsgAddress(addr, self.cli_addr)
3048 self.assertEqual(ancdata, [])
3049 self.checkFlags(flags, eor=True)
3050
3051 def _testRecvmsgExplicitDefaults(self):
3052 self.sendToServer(MSG)
3053
3054 def testRecvmsgShorter(self):
3055 # Receive a message smaller than buffer.
3056 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3057 len(MSG) + 42)
3058 self.assertEqual(msg, MSG)
3059 self.checkRecvmsgAddress(addr, self.cli_addr)
3060 self.assertEqual(ancdata, [])
3061 self.checkFlags(flags, eor=True)
3062
3063 def _testRecvmsgShorter(self):
3064 self.sendToServer(MSG)
3065
3066 def testRecvmsgTrunc(self):
3067 # Receive part of message, check for truncation indicators.
3068 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3069 len(MSG) - 3)
3070 self.assertEqual(msg, MSG[:-3])
3071 self.checkRecvmsgAddress(addr, self.cli_addr)
3072 self.assertEqual(ancdata, [])
3073 self.checkFlags(flags, eor=False)
3074
3075 def _testRecvmsgTrunc(self):
3076 self.sendToServer(MSG)
3077
3078 def testRecvmsgShortAncillaryBuf(self):
3079 # Test ancillary data buffer too small to hold any ancillary data.
3080 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3081 len(MSG), 1)
3082 self.assertEqual(msg, MSG)
3083 self.checkRecvmsgAddress(addr, self.cli_addr)
3084 self.assertEqual(ancdata, [])
3085 self.checkFlags(flags, eor=True)
3086
3087 def _testRecvmsgShortAncillaryBuf(self):
3088 self.sendToServer(MSG)
3089
3090 def testRecvmsgLongAncillaryBuf(self):
3091 # Test large ancillary data buffer.
3092 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3093 len(MSG), 10240)
3094 self.assertEqual(msg, MSG)
3095 self.checkRecvmsgAddress(addr, self.cli_addr)
3096 self.assertEqual(ancdata, [])
3097 self.checkFlags(flags, eor=True)
3098
3099 def _testRecvmsgLongAncillaryBuf(self):
3100 self.sendToServer(MSG)
3101
3102 def testRecvmsgAfterClose(self):
3103 # Check that recvmsg[_into]() fails on a closed socket.
3104 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003105 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003106
3107 def _testRecvmsgAfterClose(self):
3108 pass
3109
3110 def testRecvmsgTimeout(self):
3111 # Check that timeout works.
3112 try:
3113 self.serv_sock.settimeout(0.03)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003114 self.assertRaises(TimeoutError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003115 self.doRecvmsg, self.serv_sock, len(MSG))
3116 finally:
3117 self.misc_event.set()
3118
3119 def _testRecvmsgTimeout(self):
3120 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3121
3122 @requireAttrs(socket, "MSG_PEEK")
3123 def testRecvmsgPeek(self):
3124 # Check that MSG_PEEK in flags enables examination of pending
3125 # data without consuming it.
3126
3127 # Receive part of data with MSG_PEEK.
3128 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3129 len(MSG) - 3, 0,
3130 socket.MSG_PEEK)
3131 self.assertEqual(msg, MSG[:-3])
3132 self.checkRecvmsgAddress(addr, self.cli_addr)
3133 self.assertEqual(ancdata, [])
3134 # Ignoring MSG_TRUNC here (so this test is the same for stream
3135 # and datagram sockets). Some wording in POSIX seems to
3136 # suggest that it needn't be set when peeking, but that may
3137 # just be a slip.
3138 self.checkFlags(flags, eor=False,
3139 ignore=getattr(socket, "MSG_TRUNC", 0))
3140
3141 # Receive all data with MSG_PEEK.
3142 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3143 len(MSG), 0,
3144 socket.MSG_PEEK)
3145 self.assertEqual(msg, MSG)
3146 self.checkRecvmsgAddress(addr, self.cli_addr)
3147 self.assertEqual(ancdata, [])
3148 self.checkFlags(flags, eor=True)
3149
3150 # Check that the same data can still be received normally.
3151 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3152 self.assertEqual(msg, MSG)
3153 self.checkRecvmsgAddress(addr, self.cli_addr)
3154 self.assertEqual(ancdata, [])
3155 self.checkFlags(flags, eor=True)
3156
3157 @testRecvmsgPeek.client_skip
3158 def _testRecvmsgPeek(self):
3159 self.sendToServer(MSG)
3160
3161 @requireAttrs(socket.socket, "sendmsg")
3162 def testRecvmsgFromSendmsg(self):
3163 # Test receiving with recvmsg[_into]() when message is sent
3164 # using sendmsg().
3165 self.serv_sock.settimeout(self.fail_timeout)
3166 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3167 self.assertEqual(msg, MSG)
3168 self.checkRecvmsgAddress(addr, self.cli_addr)
3169 self.assertEqual(ancdata, [])
3170 self.checkFlags(flags, eor=True)
3171
3172 @testRecvmsgFromSendmsg.client_skip
3173 def _testRecvmsgFromSendmsg(self):
3174 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3175
3176
3177class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3178 # Tests which require a stream socket and can use either recvmsg()
3179 # or recvmsg_into().
3180
3181 def testRecvmsgEOF(self):
3182 # Receive end-of-stream indicator (b"", peer socket closed).
3183 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3184 self.assertEqual(msg, b"")
3185 self.checkRecvmsgAddress(addr, self.cli_addr)
3186 self.assertEqual(ancdata, [])
3187 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3188
3189 def _testRecvmsgEOF(self):
3190 self.cli_sock.close()
3191
3192 def testRecvmsgOverflow(self):
3193 # Receive a message in more than one chunk.
3194 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3195 len(MSG) - 3)
3196 self.checkRecvmsgAddress(addr, self.cli_addr)
3197 self.assertEqual(ancdata, [])
3198 self.checkFlags(flags, eor=False)
3199
3200 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3201 self.checkRecvmsgAddress(addr, self.cli_addr)
3202 self.assertEqual(ancdata, [])
3203 self.checkFlags(flags, eor=True)
3204
3205 msg = seg1 + seg2
3206 self.assertEqual(msg, MSG)
3207
3208 def _testRecvmsgOverflow(self):
3209 self.sendToServer(MSG)
3210
3211
3212class RecvmsgTests(RecvmsgGenericTests):
3213 # Tests for recvmsg() which can use any socket type.
3214
3215 def testRecvmsgBadArgs(self):
3216 # Check that recvmsg() rejects invalid arguments.
3217 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3218 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3219 -1, 0, 0)
3220 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3221 len(MSG), -1, 0)
3222 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3223 [bytearray(10)], 0, 0)
3224 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3225 object(), 0, 0)
3226 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3227 len(MSG), object(), 0)
3228 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3229 len(MSG), 0, object())
3230
3231 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3232 self.assertEqual(msg, MSG)
3233 self.checkRecvmsgAddress(addr, self.cli_addr)
3234 self.assertEqual(ancdata, [])
3235 self.checkFlags(flags, eor=True)
3236
3237 def _testRecvmsgBadArgs(self):
3238 self.sendToServer(MSG)
3239
3240
3241class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3242 # Tests for recvmsg_into() which can use any socket type.
3243
3244 def testRecvmsgIntoBadArgs(self):
3245 # Check that recvmsg_into() rejects invalid arguments.
3246 buf = bytearray(len(MSG))
3247 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3248 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3249 len(MSG), 0, 0)
3250 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3251 buf, 0, 0)
3252 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3253 [object()], 0, 0)
3254 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3255 [b"I'm not writable"], 0, 0)
3256 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3257 [buf, object()], 0, 0)
3258 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3259 [buf], -1, 0)
3260 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3261 [buf], object(), 0)
3262 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3263 [buf], 0, object())
3264
3265 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3266 self.assertEqual(nbytes, len(MSG))
3267 self.assertEqual(buf, bytearray(MSG))
3268 self.checkRecvmsgAddress(addr, self.cli_addr)
3269 self.assertEqual(ancdata, [])
3270 self.checkFlags(flags, eor=True)
3271
3272 def _testRecvmsgIntoBadArgs(self):
3273 self.sendToServer(MSG)
3274
3275 def testRecvmsgIntoGenerator(self):
3276 # Receive into buffer obtained from a generator (not a sequence).
3277 buf = bytearray(len(MSG))
3278 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3279 (o for o in [buf]))
3280 self.assertEqual(nbytes, len(MSG))
3281 self.assertEqual(buf, bytearray(MSG))
3282 self.checkRecvmsgAddress(addr, self.cli_addr)
3283 self.assertEqual(ancdata, [])
3284 self.checkFlags(flags, eor=True)
3285
3286 def _testRecvmsgIntoGenerator(self):
3287 self.sendToServer(MSG)
3288
3289 def testRecvmsgIntoArray(self):
3290 # Receive into an array rather than the usual bytearray.
3291 buf = array.array("B", [0] * len(MSG))
3292 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3293 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003294 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003295 self.checkRecvmsgAddress(addr, self.cli_addr)
3296 self.assertEqual(ancdata, [])
3297 self.checkFlags(flags, eor=True)
3298
3299 def _testRecvmsgIntoArray(self):
3300 self.sendToServer(MSG)
3301
3302 def testRecvmsgIntoScatter(self):
3303 # Receive into multiple buffers (scatter write).
3304 b1 = bytearray(b"----")
3305 b2 = bytearray(b"0123456789")
3306 b3 = bytearray(b"--------------")
3307 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3308 [b1, memoryview(b2)[2:9], b3])
3309 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3310 self.assertEqual(b1, bytearray(b"Mary"))
3311 self.assertEqual(b2, bytearray(b"01 had a 9"))
3312 self.assertEqual(b3, bytearray(b"little lamb---"))
3313 self.checkRecvmsgAddress(addr, self.cli_addr)
3314 self.assertEqual(ancdata, [])
3315 self.checkFlags(flags, eor=True)
3316
3317 def _testRecvmsgIntoScatter(self):
3318 self.sendToServer(b"Mary had a little lamb")
3319
3320
3321class CmsgMacroTests(unittest.TestCase):
3322 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3323 # assumptions used by sendmsg() and recvmsg[_into](), which share
3324 # code with these functions.
3325
3326 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003327 try:
3328 import _testcapi
3329 except ImportError:
3330 socklen_t_limit = 0x7fffffff
3331 else:
3332 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003333
3334 @requireAttrs(socket, "CMSG_LEN")
3335 def testCMSG_LEN(self):
3336 # Test CMSG_LEN() with various valid and invalid values,
3337 # checking the assumptions used by recvmsg() and sendmsg().
3338 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3339 values = list(range(257)) + list(range(toobig - 257, toobig))
3340
3341 # struct cmsghdr has at least three members, two of which are ints
3342 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3343 for n in values:
3344 ret = socket.CMSG_LEN(n)
3345 # This is how recvmsg() calculates the data size
3346 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3347 self.assertLessEqual(ret, self.socklen_t_limit)
3348
3349 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3350 # sendmsg() shares code with these functions, and requires
3351 # that it reject values over the limit.
3352 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3353 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3354
3355 @requireAttrs(socket, "CMSG_SPACE")
3356 def testCMSG_SPACE(self):
3357 # Test CMSG_SPACE() with various valid and invalid values,
3358 # checking the assumptions used by sendmsg().
3359 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3360 values = list(range(257)) + list(range(toobig - 257, toobig))
3361
3362 last = socket.CMSG_SPACE(0)
3363 # struct cmsghdr has at least three members, two of which are ints
3364 self.assertGreater(last, array.array("i").itemsize * 2)
3365 for n in values:
3366 ret = socket.CMSG_SPACE(n)
3367 self.assertGreaterEqual(ret, last)
3368 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3369 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3370 self.assertLessEqual(ret, self.socklen_t_limit)
3371 last = ret
3372
3373 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3374 # sendmsg() shares code with these functions, and requires
3375 # that it reject values over the limit.
3376 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3377 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3378
3379
3380class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3381 # Tests for file descriptor passing on Unix-domain sockets.
3382
3383 # Invalid file descriptor value that's unlikely to evaluate to a
3384 # real FD even if one of its bytes is replaced with a different
3385 # value (which shouldn't actually happen).
3386 badfd = -0x5555
3387
3388 def newFDs(self, n):
3389 # Return a list of n file descriptors for newly-created files
3390 # containing their list indices as ASCII numbers.
3391 fds = []
3392 for i in range(n):
3393 fd, path = tempfile.mkstemp()
3394 self.addCleanup(os.unlink, path)
3395 self.addCleanup(os.close, fd)
3396 os.write(fd, str(i).encode())
3397 fds.append(fd)
3398 return fds
3399
3400 def checkFDs(self, fds):
3401 # Check that the file descriptors in the given list contain
3402 # their correct list indices as ASCII numbers.
3403 for n, fd in enumerate(fds):
3404 os.lseek(fd, 0, os.SEEK_SET)
3405 self.assertEqual(os.read(fd, 1024), str(n).encode())
3406
3407 def registerRecvmsgResult(self, result):
3408 self.addCleanup(self.closeRecvmsgFDs, result)
3409
3410 def closeRecvmsgFDs(self, recvmsg_result):
3411 # Close all file descriptors specified in the ancillary data
3412 # of the given return value from recvmsg() or recvmsg_into().
3413 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3414 if (cmsg_level == socket.SOL_SOCKET and
3415 cmsg_type == socket.SCM_RIGHTS):
3416 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003417 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003418 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3419 for fd in fds:
3420 os.close(fd)
3421
3422 def createAndSendFDs(self, n):
3423 # Send n new file descriptors created by newFDs() to the
3424 # server, with the constant MSG as the non-ancillary data.
3425 self.assertEqual(
3426 self.sendmsgToServer([MSG],
3427 [(socket.SOL_SOCKET,
3428 socket.SCM_RIGHTS,
3429 array.array("i", self.newFDs(n)))]),
3430 len(MSG))
3431
3432 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3433 # Check that constant MSG was received with numfds file
3434 # descriptors in a maximum of maxcmsgs control messages (which
3435 # must contain only complete integers). By default, check
3436 # that MSG_CTRUNC is unset, but ignore any flags in
3437 # ignoreflags.
3438 msg, ancdata, flags, addr = result
3439 self.assertEqual(msg, MSG)
3440 self.checkRecvmsgAddress(addr, self.cli_addr)
3441 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3442 ignore=ignoreflags)
3443
3444 self.assertIsInstance(ancdata, list)
3445 self.assertLessEqual(len(ancdata), maxcmsgs)
3446 fds = array.array("i")
3447 for item in ancdata:
3448 self.assertIsInstance(item, tuple)
3449 cmsg_level, cmsg_type, cmsg_data = item
3450 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3451 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3452 self.assertIsInstance(cmsg_data, bytes)
3453 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003454 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003455
3456 self.assertEqual(len(fds), numfds)
3457 self.checkFDs(fds)
3458
3459 def testFDPassSimple(self):
3460 # Pass a single FD (array read from bytes object).
3461 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3462 len(MSG), 10240))
3463
3464 def _testFDPassSimple(self):
3465 self.assertEqual(
3466 self.sendmsgToServer(
3467 [MSG],
3468 [(socket.SOL_SOCKET,
3469 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003470 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003471 len(MSG))
3472
3473 def testMultipleFDPass(self):
3474 # Pass multiple FDs in a single array.
3475 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3476 len(MSG), 10240))
3477
3478 def _testMultipleFDPass(self):
3479 self.createAndSendFDs(4)
3480
3481 @requireAttrs(socket, "CMSG_SPACE")
3482 def testFDPassCMSG_SPACE(self):
3483 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3484 self.checkRecvmsgFDs(
3485 4, self.doRecvmsg(self.serv_sock, len(MSG),
3486 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3487
3488 @testFDPassCMSG_SPACE.client_skip
3489 def _testFDPassCMSG_SPACE(self):
3490 self.createAndSendFDs(4)
3491
3492 def testFDPassCMSG_LEN(self):
3493 # Test using CMSG_LEN() to calculate ancillary buffer size.
3494 self.checkRecvmsgFDs(1,
3495 self.doRecvmsg(self.serv_sock, len(MSG),
3496 socket.CMSG_LEN(4 * SIZEOF_INT)),
3497 # RFC 3542 says implementations may set
3498 # MSG_CTRUNC if there isn't enough space
3499 # for trailing padding.
3500 ignoreflags=socket.MSG_CTRUNC)
3501
3502 def _testFDPassCMSG_LEN(self):
3503 self.createAndSendFDs(1)
3504
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003505 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003506 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003507 @requireAttrs(socket, "CMSG_SPACE")
3508 def testFDPassSeparate(self):
3509 # Pass two FDs in two separate arrays. Arrays may be combined
3510 # into a single control message by the OS.
3511 self.checkRecvmsgFDs(2,
3512 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3513 maxcmsgs=2)
3514
3515 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003516 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003517 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003518 def _testFDPassSeparate(self):
3519 fd0, fd1 = self.newFDs(2)
3520 self.assertEqual(
3521 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3522 socket.SCM_RIGHTS,
3523 array.array("i", [fd0])),
3524 (socket.SOL_SOCKET,
3525 socket.SCM_RIGHTS,
3526 array.array("i", [fd1]))]),
3527 len(MSG))
3528
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003529 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003530 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003531 @requireAttrs(socket, "CMSG_SPACE")
3532 def testFDPassSeparateMinSpace(self):
3533 # Pass two FDs in two separate arrays, receiving them into the
3534 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003535 num_fds = 2
3536 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003537 self.doRecvmsg(self.serv_sock, len(MSG),
3538 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003539 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003540 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3541
3542 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003543 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003544 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003545 def _testFDPassSeparateMinSpace(self):
3546 fd0, fd1 = self.newFDs(2)
3547 self.assertEqual(
3548 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3549 socket.SCM_RIGHTS,
3550 array.array("i", [fd0])),
3551 (socket.SOL_SOCKET,
3552 socket.SCM_RIGHTS,
3553 array.array("i", [fd1]))]),
3554 len(MSG))
3555
3556 def sendAncillaryIfPossible(self, msg, ancdata):
3557 # Try to send msg and ancdata to server, but if the system
3558 # call fails, just send msg with no ancillary data.
3559 try:
3560 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003561 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003562 # Check that it was the system call that failed
3563 self.assertIsInstance(e.errno, int)
3564 nbytes = self.sendmsgToServer([msg])
3565 self.assertEqual(nbytes, len(msg))
3566
Brett Cannon3bbad122015-12-28 17:21:44 -08003567 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003568 def testFDPassEmpty(self):
3569 # Try to pass an empty FD array. Can receive either no array
3570 # or an empty array.
3571 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3572 len(MSG), 10240),
3573 ignoreflags=socket.MSG_CTRUNC)
3574
3575 def _testFDPassEmpty(self):
3576 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3577 socket.SCM_RIGHTS,
3578 b"")])
3579
3580 def testFDPassPartialInt(self):
3581 # Try to pass a truncated FD array.
3582 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3583 len(MSG), 10240)
3584 self.assertEqual(msg, MSG)
3585 self.checkRecvmsgAddress(addr, self.cli_addr)
3586 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3587 self.assertLessEqual(len(ancdata), 1)
3588 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3589 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3590 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3591 self.assertLess(len(cmsg_data), SIZEOF_INT)
3592
3593 def _testFDPassPartialInt(self):
3594 self.sendAncillaryIfPossible(
3595 MSG,
3596 [(socket.SOL_SOCKET,
3597 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003598 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003599
3600 @requireAttrs(socket, "CMSG_SPACE")
3601 def testFDPassPartialIntInMiddle(self):
3602 # Try to pass two FD arrays, the first of which is truncated.
3603 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3604 len(MSG), 10240)
3605 self.assertEqual(msg, MSG)
3606 self.checkRecvmsgAddress(addr, self.cli_addr)
3607 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3608 self.assertLessEqual(len(ancdata), 2)
3609 fds = array.array("i")
3610 # Arrays may have been combined in a single control message
3611 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3612 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3613 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003614 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003615 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3616 self.assertLessEqual(len(fds), 2)
3617 self.checkFDs(fds)
3618
3619 @testFDPassPartialIntInMiddle.client_skip
3620 def _testFDPassPartialIntInMiddle(self):
3621 fd0, fd1 = self.newFDs(2)
3622 self.sendAncillaryIfPossible(
3623 MSG,
3624 [(socket.SOL_SOCKET,
3625 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003626 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003627 (socket.SOL_SOCKET,
3628 socket.SCM_RIGHTS,
3629 array.array("i", [fd1]))])
3630
3631 def checkTruncatedHeader(self, result, ignoreflags=0):
3632 # Check that no ancillary data items are returned when data is
3633 # truncated inside the cmsghdr structure.
3634 msg, ancdata, flags, addr = result
3635 self.assertEqual(msg, MSG)
3636 self.checkRecvmsgAddress(addr, self.cli_addr)
3637 self.assertEqual(ancdata, [])
3638 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3639 ignore=ignoreflags)
3640
3641 def testCmsgTruncNoBufSize(self):
3642 # Check that no ancillary data is received when no buffer size
3643 # is specified.
3644 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3645 # BSD seems to set MSG_CTRUNC only
3646 # if an item has been partially
3647 # received.
3648 ignoreflags=socket.MSG_CTRUNC)
3649
3650 def _testCmsgTruncNoBufSize(self):
3651 self.createAndSendFDs(1)
3652
3653 def testCmsgTrunc0(self):
3654 # Check that no ancillary data is received when buffer size is 0.
3655 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3656 ignoreflags=socket.MSG_CTRUNC)
3657
3658 def _testCmsgTrunc0(self):
3659 self.createAndSendFDs(1)
3660
3661 # Check that no ancillary data is returned for various non-zero
3662 # (but still too small) buffer sizes.
3663
3664 def testCmsgTrunc1(self):
3665 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3666
3667 def _testCmsgTrunc1(self):
3668 self.createAndSendFDs(1)
3669
3670 def testCmsgTrunc2Int(self):
3671 # The cmsghdr structure has at least three members, two of
3672 # which are ints, so we still shouldn't see any ancillary
3673 # data.
3674 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3675 SIZEOF_INT * 2))
3676
3677 def _testCmsgTrunc2Int(self):
3678 self.createAndSendFDs(1)
3679
3680 def testCmsgTruncLen0Minus1(self):
3681 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3682 socket.CMSG_LEN(0) - 1))
3683
3684 def _testCmsgTruncLen0Minus1(self):
3685 self.createAndSendFDs(1)
3686
3687 # The following tests try to truncate the control message in the
3688 # middle of the FD array.
3689
3690 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3691 # Check that file descriptor data is truncated to between
3692 # mindata and maxdata bytes when received with buffer size
3693 # ancbuf, and that any complete file descriptor numbers are
3694 # valid.
3695 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3696 len(MSG), ancbuf)
3697 self.assertEqual(msg, MSG)
3698 self.checkRecvmsgAddress(addr, self.cli_addr)
3699 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3700
3701 if mindata == 0 and ancdata == []:
3702 return
3703 self.assertEqual(len(ancdata), 1)
3704 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3705 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3706 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3707 self.assertGreaterEqual(len(cmsg_data), mindata)
3708 self.assertLessEqual(len(cmsg_data), maxdata)
3709 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003710 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003711 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3712 self.checkFDs(fds)
3713
3714 def testCmsgTruncLen0(self):
3715 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3716
3717 def _testCmsgTruncLen0(self):
3718 self.createAndSendFDs(1)
3719
3720 def testCmsgTruncLen0Plus1(self):
3721 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3722
3723 def _testCmsgTruncLen0Plus1(self):
3724 self.createAndSendFDs(2)
3725
3726 def testCmsgTruncLen1(self):
3727 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3728 maxdata=SIZEOF_INT)
3729
3730 def _testCmsgTruncLen1(self):
3731 self.createAndSendFDs(2)
3732
3733 def testCmsgTruncLen2Minus1(self):
3734 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3735 maxdata=(2 * SIZEOF_INT) - 1)
3736
3737 def _testCmsgTruncLen2Minus1(self):
3738 self.createAndSendFDs(2)
3739
3740
3741class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3742 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3743 # features of the RFC 3542 Advanced Sockets API for IPv6.
3744 # Currently we can only handle certain data items (e.g. traffic
3745 # class, hop limit, MTU discovery and fragmentation settings)
3746 # without resorting to unportable means such as the struct module,
3747 # but the tests here are aimed at testing the ancillary data
3748 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3749 # itself.
3750
3751 # Test value to use when setting hop limit of packet
3752 hop_limit = 2
3753
3754 # Test value to use when setting traffic class of packet.
3755 # -1 means "use kernel default".
3756 traffic_class = -1
3757
3758 def ancillaryMapping(self, ancdata):
3759 # Given ancillary data list ancdata, return a mapping from
3760 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3761 # Check that no (level, type) pair appears more than once.
3762 d = {}
3763 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3764 self.assertNotIn((cmsg_level, cmsg_type), d)
3765 d[(cmsg_level, cmsg_type)] = cmsg_data
3766 return d
3767
3768 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3769 # Receive hop limit into ancbufsize bytes of ancillary data
3770 # space. Check that data is MSG, ancillary data is not
3771 # truncated (but ignore any flags in ignoreflags), and hop
3772 # limit is between 0 and maxhop inclusive.
3773 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3774 socket.IPV6_RECVHOPLIMIT, 1)
3775 self.misc_event.set()
3776 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3777 len(MSG), ancbufsize)
3778
3779 self.assertEqual(msg, MSG)
3780 self.checkRecvmsgAddress(addr, self.cli_addr)
3781 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3782 ignore=ignoreflags)
3783
3784 self.assertEqual(len(ancdata), 1)
3785 self.assertIsInstance(ancdata[0], tuple)
3786 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3787 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3788 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3789 self.assertIsInstance(cmsg_data, bytes)
3790 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3791 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003792 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003793 self.assertGreaterEqual(a[0], 0)
3794 self.assertLessEqual(a[0], maxhop)
3795
3796 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3797 def testRecvHopLimit(self):
3798 # Test receiving the packet hop limit as ancillary data.
3799 self.checkHopLimit(ancbufsize=10240)
3800
3801 @testRecvHopLimit.client_skip
3802 def _testRecvHopLimit(self):
3803 # Need to wait until server has asked to receive ancillary
3804 # data, as implementations are not required to buffer it
3805 # otherwise.
3806 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3807 self.sendToServer(MSG)
3808
3809 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3810 def testRecvHopLimitCMSG_SPACE(self):
3811 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3812 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3813
3814 @testRecvHopLimitCMSG_SPACE.client_skip
3815 def _testRecvHopLimitCMSG_SPACE(self):
3816 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3817 self.sendToServer(MSG)
3818
3819 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3820 # 3542 says portable applications must provide space for trailing
3821 # padding. Implementations may set MSG_CTRUNC if there isn't
3822 # enough space for the padding.
3823
3824 @requireAttrs(socket.socket, "sendmsg")
3825 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3826 def testSetHopLimit(self):
3827 # Test setting hop limit on outgoing packet and receiving it
3828 # at the other end.
3829 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3830
3831 @testSetHopLimit.client_skip
3832 def _testSetHopLimit(self):
3833 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3834 self.assertEqual(
3835 self.sendmsgToServer([MSG],
3836 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3837 array.array("i", [self.hop_limit]))]),
3838 len(MSG))
3839
3840 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3841 ignoreflags=0):
3842 # Receive traffic class and hop limit into ancbufsize bytes of
3843 # ancillary data space. Check that data is MSG, ancillary
3844 # data is not truncated (but ignore any flags in ignoreflags),
3845 # and traffic class and hop limit are in range (hop limit no
3846 # more than maxhop).
3847 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3848 socket.IPV6_RECVHOPLIMIT, 1)
3849 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3850 socket.IPV6_RECVTCLASS, 1)
3851 self.misc_event.set()
3852 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3853 len(MSG), ancbufsize)
3854
3855 self.assertEqual(msg, MSG)
3856 self.checkRecvmsgAddress(addr, self.cli_addr)
3857 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3858 ignore=ignoreflags)
3859 self.assertEqual(len(ancdata), 2)
3860 ancmap = self.ancillaryMapping(ancdata)
3861
3862 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3863 self.assertEqual(len(tcdata), SIZEOF_INT)
3864 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003865 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003866 self.assertGreaterEqual(a[0], 0)
3867 self.assertLessEqual(a[0], 255)
3868
3869 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3870 self.assertEqual(len(hldata), SIZEOF_INT)
3871 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003872 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003873 self.assertGreaterEqual(a[0], 0)
3874 self.assertLessEqual(a[0], maxhop)
3875
3876 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3877 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3878 def testRecvTrafficClassAndHopLimit(self):
3879 # Test receiving traffic class and hop limit as ancillary data.
3880 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3881
3882 @testRecvTrafficClassAndHopLimit.client_skip
3883 def _testRecvTrafficClassAndHopLimit(self):
3884 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3885 self.sendToServer(MSG)
3886
3887 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3888 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3889 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3890 # Test receiving traffic class and hop limit, using
3891 # CMSG_SPACE() to calculate buffer size.
3892 self.checkTrafficClassAndHopLimit(
3893 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3894
3895 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3896 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3897 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3898 self.sendToServer(MSG)
3899
3900 @requireAttrs(socket.socket, "sendmsg")
3901 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3902 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3903 def testSetTrafficClassAndHopLimit(self):
3904 # Test setting traffic class and hop limit on outgoing packet,
3905 # and receiving them at the other end.
3906 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3907 maxhop=self.hop_limit)
3908
3909 @testSetTrafficClassAndHopLimit.client_skip
3910 def _testSetTrafficClassAndHopLimit(self):
3911 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3912 self.assertEqual(
3913 self.sendmsgToServer([MSG],
3914 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3915 array.array("i", [self.traffic_class])),
3916 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3917 array.array("i", [self.hop_limit]))]),
3918 len(MSG))
3919
3920 @requireAttrs(socket.socket, "sendmsg")
3921 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3922 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3923 def testOddCmsgSize(self):
3924 # Try to send ancillary data with first item one byte too
3925 # long. Fall back to sending with correct size if this fails,
3926 # and check that second item was handled correctly.
3927 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3928 maxhop=self.hop_limit)
3929
3930 @testOddCmsgSize.client_skip
3931 def _testOddCmsgSize(self):
3932 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3933 try:
3934 nbytes = self.sendmsgToServer(
3935 [MSG],
3936 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003937 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003938 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3939 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003940 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003941 self.assertIsInstance(e.errno, int)
3942 nbytes = self.sendmsgToServer(
3943 [MSG],
3944 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3945 array.array("i", [self.traffic_class])),
3946 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3947 array.array("i", [self.hop_limit]))])
3948 self.assertEqual(nbytes, len(MSG))
3949
3950 # Tests for proper handling of truncated ancillary data
3951
3952 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3953 # Receive hop limit into ancbufsize bytes of ancillary data
3954 # space, which should be too small to contain the ancillary
3955 # data header (if ancbufsize is None, pass no second argument
3956 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3957 # (unless included in ignoreflags), and no ancillary data is
3958 # returned.
3959 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3960 socket.IPV6_RECVHOPLIMIT, 1)
3961 self.misc_event.set()
3962 args = () if ancbufsize is None else (ancbufsize,)
3963 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3964 len(MSG), *args)
3965
3966 self.assertEqual(msg, MSG)
3967 self.checkRecvmsgAddress(addr, self.cli_addr)
3968 self.assertEqual(ancdata, [])
3969 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3970 ignore=ignoreflags)
3971
3972 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3973 def testCmsgTruncNoBufSize(self):
3974 # Check that no ancillary data is received when no ancillary
3975 # buffer size is provided.
3976 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3977 # BSD seems to set
3978 # MSG_CTRUNC only if an item
3979 # has been partially
3980 # received.
3981 ignoreflags=socket.MSG_CTRUNC)
3982
3983 @testCmsgTruncNoBufSize.client_skip
3984 def _testCmsgTruncNoBufSize(self):
3985 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3986 self.sendToServer(MSG)
3987
3988 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3989 def testSingleCmsgTrunc0(self):
3990 # Check that no ancillary data is received when ancillary
3991 # buffer size is zero.
3992 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3993 ignoreflags=socket.MSG_CTRUNC)
3994
3995 @testSingleCmsgTrunc0.client_skip
3996 def _testSingleCmsgTrunc0(self):
3997 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3998 self.sendToServer(MSG)
3999
4000 # Check that no ancillary data is returned for various non-zero
4001 # (but still too small) buffer sizes.
4002
4003 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4004 def testSingleCmsgTrunc1(self):
4005 self.checkHopLimitTruncatedHeader(ancbufsize=1)
4006
4007 @testSingleCmsgTrunc1.client_skip
4008 def _testSingleCmsgTrunc1(self):
4009 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4010 self.sendToServer(MSG)
4011
4012 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4013 def testSingleCmsgTrunc2Int(self):
4014 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
4015
4016 @testSingleCmsgTrunc2Int.client_skip
4017 def _testSingleCmsgTrunc2Int(self):
4018 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4019 self.sendToServer(MSG)
4020
4021 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4022 def testSingleCmsgTruncLen0Minus1(self):
4023 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
4024
4025 @testSingleCmsgTruncLen0Minus1.client_skip
4026 def _testSingleCmsgTruncLen0Minus1(self):
4027 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4028 self.sendToServer(MSG)
4029
4030 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4031 def testSingleCmsgTruncInData(self):
4032 # Test truncation of a control message inside its associated
4033 # data. The message may be returned with its data truncated,
4034 # or not returned at all.
4035 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4036 socket.IPV6_RECVHOPLIMIT, 1)
4037 self.misc_event.set()
4038 msg, ancdata, flags, addr = self.doRecvmsg(
4039 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4040
4041 self.assertEqual(msg, MSG)
4042 self.checkRecvmsgAddress(addr, self.cli_addr)
4043 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4044
4045 self.assertLessEqual(len(ancdata), 1)
4046 if ancdata:
4047 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4048 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4049 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4050 self.assertLess(len(cmsg_data), SIZEOF_INT)
4051
4052 @testSingleCmsgTruncInData.client_skip
4053 def _testSingleCmsgTruncInData(self):
4054 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4055 self.sendToServer(MSG)
4056
4057 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4058 # Receive traffic class and hop limit into ancbufsize bytes of
4059 # ancillary data space, which should be large enough to
4060 # contain the first item, but too small to contain the header
4061 # of the second. Check that data is MSG, MSG_CTRUNC is set
4062 # (unless included in ignoreflags), and only one ancillary
4063 # data item is returned.
4064 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4065 socket.IPV6_RECVHOPLIMIT, 1)
4066 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4067 socket.IPV6_RECVTCLASS, 1)
4068 self.misc_event.set()
4069 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4070 len(MSG), ancbufsize)
4071
4072 self.assertEqual(msg, MSG)
4073 self.checkRecvmsgAddress(addr, self.cli_addr)
4074 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4075 ignore=ignoreflags)
4076
4077 self.assertEqual(len(ancdata), 1)
4078 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4079 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4080 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4081 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4082 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004083 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084 self.assertGreaterEqual(a[0], 0)
4085 self.assertLessEqual(a[0], 255)
4086
4087 # Try the above test with various buffer sizes.
4088
4089 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4090 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4091 def testSecondCmsgTrunc0(self):
4092 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4093 ignoreflags=socket.MSG_CTRUNC)
4094
4095 @testSecondCmsgTrunc0.client_skip
4096 def _testSecondCmsgTrunc0(self):
4097 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4098 self.sendToServer(MSG)
4099
4100 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4101 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4102 def testSecondCmsgTrunc1(self):
4103 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4104
4105 @testSecondCmsgTrunc1.client_skip
4106 def _testSecondCmsgTrunc1(self):
4107 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4108 self.sendToServer(MSG)
4109
4110 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4111 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4112 def testSecondCmsgTrunc2Int(self):
4113 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4114 2 * SIZEOF_INT)
4115
4116 @testSecondCmsgTrunc2Int.client_skip
4117 def _testSecondCmsgTrunc2Int(self):
4118 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4119 self.sendToServer(MSG)
4120
4121 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4122 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4123 def testSecondCmsgTruncLen0Minus1(self):
4124 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4125 socket.CMSG_LEN(0) - 1)
4126
4127 @testSecondCmsgTruncLen0Minus1.client_skip
4128 def _testSecondCmsgTruncLen0Minus1(self):
4129 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4130 self.sendToServer(MSG)
4131
4132 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4133 "IPV6_RECVTCLASS", "IPV6_TCLASS")
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304134 def testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004135 # Test truncation of the second of two control messages inside
4136 # its associated data.
4137 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4138 socket.IPV6_RECVHOPLIMIT, 1)
4139 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4140 socket.IPV6_RECVTCLASS, 1)
4141 self.misc_event.set()
4142 msg, ancdata, flags, addr = self.doRecvmsg(
4143 self.serv_sock, len(MSG),
4144 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4145
4146 self.assertEqual(msg, MSG)
4147 self.checkRecvmsgAddress(addr, self.cli_addr)
4148 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4149
4150 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4151
4152 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4153 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4154 cmsg_types.remove(cmsg_type)
4155 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4156 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004157 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004158 self.assertGreaterEqual(a[0], 0)
4159 self.assertLessEqual(a[0], 255)
4160
4161 if ancdata:
4162 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4163 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4164 cmsg_types.remove(cmsg_type)
4165 self.assertLess(len(cmsg_data), SIZEOF_INT)
4166
4167 self.assertEqual(ancdata, [])
4168
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304169 @testSecondCmsgTruncInData.client_skip
4170 def _testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004171 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4172 self.sendToServer(MSG)
4173
4174
4175# Derive concrete test classes for different socket types.
4176
4177class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4178 SendrecvmsgConnectionlessBase,
4179 ThreadedSocketTestMixin, UDPTestBase):
4180 pass
4181
4182@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004183class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4184 pass
4185
4186@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004187class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4188 pass
4189
4190@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004191class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4192 pass
4193
4194
4195class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4196 SendrecvmsgConnectionlessBase,
4197 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004198
4199 def checkRecvmsgAddress(self, addr1, addr2):
4200 # Called to compare the received address with the address of
4201 # the peer, ignoring scope ID
4202 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004203
4204@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004205@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004206@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004207class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4208 pass
4209
4210@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004211@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004212@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004213class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4214 pass
4215
4216@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004217@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004218@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004219class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4220 pass
4221
4222@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004223@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004224@requireAttrs(socket, "IPPROTO_IPV6")
4225@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004226class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4227 SendrecvmsgUDP6TestBase):
4228 pass
4229
4230@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004231@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004232@requireAttrs(socket, "IPPROTO_IPV6")
4233@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004234class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4235 RFC3542AncillaryTest,
4236 SendrecvmsgUDP6TestBase):
4237 pass
4238
4239
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004240@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4241 'UDPLITE sockets required for this test.')
4242class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4243 SendrecvmsgConnectionlessBase,
4244 ThreadedSocketTestMixin, UDPLITETestBase):
4245 pass
4246
4247@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4248 'UDPLITE sockets required for this test.')
4249@requireAttrs(socket.socket, "sendmsg")
4250class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4251 pass
4252
4253@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4254 'UDPLITE sockets required for this test.')
4255@requireAttrs(socket.socket, "recvmsg")
4256class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4257 pass
4258
4259@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4260 'UDPLITE sockets required for this test.')
4261@requireAttrs(socket.socket, "recvmsg_into")
4262class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4263 pass
4264
4265
4266@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4267 'UDPLITE sockets required for this test.')
4268class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4269 SendrecvmsgConnectionlessBase,
4270 ThreadedSocketTestMixin, UDPLITE6TestBase):
4271
4272 def checkRecvmsgAddress(self, addr1, addr2):
4273 # Called to compare the received address with the address of
4274 # the peer, ignoring scope ID
4275 self.assertEqual(addr1[:-1], addr2[:-1])
4276
4277@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004278@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004279@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4280 'UDPLITE sockets required for this test.')
4281@requireSocket("AF_INET6", "SOCK_DGRAM")
4282class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4283 pass
4284
4285@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004286@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004287@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4288 'UDPLITE sockets required for this test.')
4289@requireSocket("AF_INET6", "SOCK_DGRAM")
4290class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4291 pass
4292
4293@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004294@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004295@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4296 'UDPLITE sockets required for this test.')
4297@requireSocket("AF_INET6", "SOCK_DGRAM")
4298class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4299 pass
4300
4301@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004302@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004303@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4304 'UDPLITE sockets required for this test.')
4305@requireAttrs(socket, "IPPROTO_IPV6")
4306@requireSocket("AF_INET6", "SOCK_DGRAM")
4307class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4308 SendrecvmsgUDPLITE6TestBase):
4309 pass
4310
4311@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004312@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004313@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4314 'UDPLITE sockets required for this test.')
4315@requireAttrs(socket, "IPPROTO_IPV6")
4316@requireSocket("AF_INET6", "SOCK_DGRAM")
4317class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4318 RFC3542AncillaryTest,
4319 SendrecvmsgUDPLITE6TestBase):
4320 pass
4321
4322
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004323class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4324 ConnectedStreamTestMixin, TCPTestBase):
4325 pass
4326
4327@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004328class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4329 pass
4330
4331@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004332class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4333 SendrecvmsgTCPTestBase):
4334 pass
4335
4336@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004337class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4338 SendrecvmsgTCPTestBase):
4339 pass
4340
4341
4342class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4343 SendrecvmsgConnectedBase,
4344 ConnectedStreamTestMixin, SCTPStreamBase):
4345 pass
4346
4347@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004348@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004349@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004350class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4351 pass
4352
4353@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004354@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004355@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004356class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4357 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004358
4359 def testRecvmsgEOF(self):
4360 try:
4361 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4362 except OSError as e:
4363 if e.errno != errno.ENOTCONN:
4364 raise
4365 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004366
4367@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004368@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004369@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004370class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4371 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004372
4373 def testRecvmsgEOF(self):
4374 try:
4375 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4376 except OSError as e:
4377 if e.errno != errno.ENOTCONN:
4378 raise
4379 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004380
4381
4382class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4383 ConnectedStreamTestMixin, UnixStreamBase):
4384 pass
4385
4386@requireAttrs(socket.socket, "sendmsg")
4387@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004388class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4389 pass
4390
4391@requireAttrs(socket.socket, "recvmsg")
4392@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004393class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4394 SendrecvmsgUnixStreamTestBase):
4395 pass
4396
4397@requireAttrs(socket.socket, "recvmsg_into")
4398@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004399class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4400 SendrecvmsgUnixStreamTestBase):
4401 pass
4402
4403@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4404@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004405class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4406 pass
4407
4408@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4409@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004410class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4411 SendrecvmsgUnixStreamTestBase):
4412 pass
4413
4414
4415# Test interrupting the interruptible send/receive methods with a
4416# signal when a timeout is set. These tests avoid having multiple
4417# threads alive during the test so that the OS cannot deliver the
4418# signal to the wrong one.
4419
4420class InterruptedTimeoutBase(unittest.TestCase):
4421 # Base class for interrupted send/receive tests. Installs an
4422 # empty handler for SIGALRM and removes it on teardown, along with
4423 # any scheduled alarms.
4424
4425 def setUp(self):
4426 super().setUp()
4427 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004428 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004429 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004430
4431 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004432 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004433
4434 # Provide setAlarm() method to schedule delivery of SIGALRM after
4435 # given number of seconds, or cancel it if zero, and an
4436 # appropriate time value to use. Use setitimer() if available.
4437 if hasattr(signal, "setitimer"):
4438 alarm_time = 0.05
4439
4440 def setAlarm(self, seconds):
4441 signal.setitimer(signal.ITIMER_REAL, seconds)
4442 else:
4443 # Old systems may deliver the alarm up to one second early
4444 alarm_time = 2
4445
4446 def setAlarm(self, seconds):
4447 signal.alarm(seconds)
4448
4449
4450# Require siginterrupt() in order to ensure that system calls are
4451# interrupted by default.
4452@requireAttrs(signal, "siginterrupt")
4453@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4454 "Don't have signal.alarm or signal.setitimer")
4455class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4456 # Test interrupting the recv*() methods with signals when a
4457 # timeout is set.
4458
4459 def setUp(self):
4460 super().setUp()
4461 self.serv.settimeout(self.timeout)
4462
4463 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004464 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004465 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004466 try:
4467 self.setAlarm(self.alarm_time)
4468 with self.assertRaises(ZeroDivisionError) as cm:
4469 func(*args, **kwargs)
4470 finally:
4471 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004472
4473 def testInterruptedRecvTimeout(self):
4474 self.checkInterruptedRecv(self.serv.recv, 1024)
4475
4476 def testInterruptedRecvIntoTimeout(self):
4477 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4478
4479 def testInterruptedRecvfromTimeout(self):
4480 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4481
4482 def testInterruptedRecvfromIntoTimeout(self):
4483 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4484
4485 @requireAttrs(socket.socket, "recvmsg")
4486 def testInterruptedRecvmsgTimeout(self):
4487 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4488
4489 @requireAttrs(socket.socket, "recvmsg_into")
4490 def testInterruptedRecvmsgIntoTimeout(self):
4491 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4492
4493
4494# Require siginterrupt() in order to ensure that system calls are
4495# interrupted by default.
4496@requireAttrs(signal, "siginterrupt")
4497@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4498 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004499class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4500 ThreadSafeCleanupTestCase,
4501 SocketListeningTestMixin, TCPTestBase):
4502 # Test interrupting the interruptible send*() methods with signals
4503 # when a timeout is set.
4504
4505 def setUp(self):
4506 super().setUp()
4507 self.serv_conn = self.newSocket()
4508 self.addCleanup(self.serv_conn.close)
4509 # Use a thread to complete the connection, but wait for it to
4510 # terminate before running the test, so that there is only one
4511 # thread to accept the signal.
4512 cli_thread = threading.Thread(target=self.doConnect)
4513 cli_thread.start()
4514 self.cli_conn, addr = self.serv.accept()
4515 self.addCleanup(self.cli_conn.close)
4516 cli_thread.join()
4517 self.serv_conn.settimeout(self.timeout)
4518
4519 def doConnect(self):
4520 self.serv_conn.connect(self.serv_addr)
4521
4522 def checkInterruptedSend(self, func, *args, **kwargs):
4523 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004524 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004525 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004526 try:
4527 with self.assertRaises(ZeroDivisionError) as cm:
4528 while True:
4529 self.setAlarm(self.alarm_time)
4530 func(*args, **kwargs)
4531 finally:
4532 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004533
Ned Deilyc5640382014-02-03 13:58:31 -08004534 # Issue #12958: The following tests have problems on OS X prior to 10.7
4535 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004536 def testInterruptedSendTimeout(self):
4537 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4538
Ned Deilyc5640382014-02-03 13:58:31 -08004539 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004540 def testInterruptedSendtoTimeout(self):
4541 # Passing an actual address here as Python's wrapper for
4542 # sendto() doesn't allow passing a zero-length one; POSIX
4543 # requires that the address is ignored since the socket is
4544 # connection-mode, however.
4545 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4546 self.serv_addr)
4547
Ned Deilyc5640382014-02-03 13:58:31 -08004548 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004549 @requireAttrs(socket.socket, "sendmsg")
4550 def testInterruptedSendmsgTimeout(self):
4551 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4552
4553
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004554class TCPCloserTest(ThreadedTCPSocketTest):
4555
4556 def testClose(self):
4557 conn, addr = self.serv.accept()
4558 conn.close()
4559
4560 sd = self.cli
4561 read, write, err = select.select([sd], [], [], 1.0)
4562 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004563 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004564
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004565 # Calling close() many times should be safe.
4566 conn.close()
4567 conn.close()
4568
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004569 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004570 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004571 time.sleep(1.0)
4572
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004573
Dave Cole331708b2004-08-09 04:51:41 +00004574class BasicSocketPairTest(SocketPairTest):
4575
4576 def __init__(self, methodName='runTest'):
4577 SocketPairTest.__init__(self, methodName=methodName)
4578
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004579 def _check_defaults(self, sock):
4580 self.assertIsInstance(sock, socket.socket)
4581 if hasattr(socket, 'AF_UNIX'):
4582 self.assertEqual(sock.family, socket.AF_UNIX)
4583 else:
4584 self.assertEqual(sock.family, socket.AF_INET)
4585 self.assertEqual(sock.type, socket.SOCK_STREAM)
4586 self.assertEqual(sock.proto, 0)
4587
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004588 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004589 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004590
4591 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004592 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004593
Dave Cole331708b2004-08-09 04:51:41 +00004594 def testRecv(self):
4595 msg = self.serv.recv(1024)
4596 self.assertEqual(msg, MSG)
4597
4598 def _testRecv(self):
4599 self.cli.send(MSG)
4600
4601 def testSend(self):
4602 self.serv.send(MSG)
4603
4604 def _testSend(self):
4605 msg = self.cli.recv(1024)
4606 self.assertEqual(msg, MSG)
4607
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004608
Guido van Rossum24e4af82002-06-12 19:18:08 +00004609class NonBlockingTCPTests(ThreadedTCPSocketTest):
4610
4611 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004612 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004613 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4614
Victor Stinner304315d2018-11-30 13:22:44 +01004615 def assert_sock_timeout(self, sock, timeout):
4616 self.assertEqual(self.serv.gettimeout(), timeout)
4617
4618 blocking = (timeout != 0.0)
4619 self.assertEqual(sock.getblocking(), blocking)
4620
4621 if fcntl is not None:
4622 # When a Python socket has a non-zero timeout, it's switched
4623 # internally to a non-blocking mode. Later, sock.sendall(),
4624 # sock.recv(), and other socket operations use a select() call and
4625 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4626 # timeouts are enforced.
4627 fd_blocking = (timeout is None)
4628
4629 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4630 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4631
Guido van Rossum24e4af82002-06-12 19:18:08 +00004632 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004633 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004634 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004635 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004636
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004637 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004638 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004639
4640 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004641 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004642
4643 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004644 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004645
4646 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004647 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004648
4649 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004650 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004651
4652 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004653 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004654
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004655 @support.cpython_only
4656 def testSetBlocking_overflow(self):
4657 # Issue 15989
4658 import _testcapi
4659 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4660 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004661
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004662 self.serv.setblocking(False)
4663 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004664
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004665 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4666 self.assertIsNone(self.serv.gettimeout())
4667
4668 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4669
Serhiy Storchaka43767632013-11-03 21:31:38 +02004670 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4671 'test needs socket.SOCK_NONBLOCK')
4672 @support.requires_linux_version(2, 6, 28)
4673 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004674 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004675 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004676 self.serv = socket.socket(socket.AF_INET,
4677 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4678 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004679
4680 def _testInitNonBlocking(self):
4681 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004682
Victor Stinner304315d2018-11-30 13:22:44 +01004683 def testInheritFlagsBlocking(self):
4684 # bpo-7995: accept() on a listening socket with a timeout and the
4685 # default timeout is None, the resulting socket must be blocking.
4686 with socket_setdefaulttimeout(None):
4687 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004688 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004689 self.addCleanup(conn.close)
4690 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004691
Victor Stinner304315d2018-11-30 13:22:44 +01004692 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004693 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004694
4695 def testInheritFlagsTimeout(self):
4696 # bpo-7995: accept() on a listening socket with a timeout and the
4697 # default timeout is None, the resulting socket must inherit
4698 # the default timeout.
4699 default_timeout = 20.0
4700 with socket_setdefaulttimeout(default_timeout):
4701 self.serv.settimeout(10)
4702 conn, addr = self.serv.accept()
4703 self.addCleanup(conn.close)
4704 self.assertEqual(conn.gettimeout(), default_timeout)
4705
4706 def _testInheritFlagsTimeout(self):
4707 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004708
Guido van Rossum24e4af82002-06-12 19:18:08 +00004709 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004710 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004711 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004712
4713 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004714 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004715 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004716 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004717 dt = time.monotonic() - start_time
4718 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004719
4720 self.event.set()
4721
Victor Stinner24c62582019-10-30 12:41:43 +01004722 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004723 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004724 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004725
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004726 # connect() completed: non-blocking accept() doesn't block
4727 conn, addr = self.serv.accept()
4728 self.addCleanup(conn.close)
4729 self.assertIsNone(conn.gettimeout())
4730
Guido van Rossum24e4af82002-06-12 19:18:08 +00004731 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004732 # don't connect before event is set to check
4733 # that non-blocking accept() raises BlockingIOError
4734 self.event.wait()
4735
Christian Heimes5e696852008-04-09 08:37:03 +00004736 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004737
Guido van Rossum24e4af82002-06-12 19:18:08 +00004738 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004739 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004740 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004741 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004742 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004743
4744 # the server didn't send data yet: non-blocking recv() fails
4745 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004746 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004747
4748 self.event.set()
4749
Victor Stinner24c62582019-10-30 12:41:43 +01004750 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004751 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004752 self.fail("Error during select call to non-blocking socket.")
4753
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004754 # the server sent data yet: non-blocking recv() doesn't block
4755 msg = conn.recv(len(MSG))
4756 self.assertEqual(msg, MSG)
4757
Guido van Rossum24e4af82002-06-12 19:18:08 +00004758 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004759 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004760
4761 # don't send anything before event is set to check
4762 # that non-blocking recv() raises BlockingIOError
4763 self.event.wait()
4764
4765 # send data: recv() will no longer block
4766 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004767
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004768
Guido van Rossum24e4af82002-06-12 19:18:08 +00004769class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004770 """Unit tests for the object returned by socket.makefile()
4771
Antoine Pitrou834bd812010-10-13 16:17:14 +00004772 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004773 the client connection. You can read from this file to
4774 get output from the server.
4775
Antoine Pitrou834bd812010-10-13 16:17:14 +00004776 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004777 server connection. You can write to this file to send output
4778 to the client.
4779 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004780
Guido van Rossume9f66142002-08-07 15:46:19 +00004781 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004782 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004783 errors = 'strict'
4784 newline = None
4785
4786 read_mode = 'rb'
4787 read_msg = MSG
4788 write_mode = 'wb'
4789 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004790
Guido van Rossum24e4af82002-06-12 19:18:08 +00004791 def __init__(self, methodName='runTest'):
4792 SocketConnectedTest.__init__(self, methodName=methodName)
4793
4794 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004795 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4796 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004797 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004798 self.read_file = self.cli_conn.makefile(
4799 self.read_mode, self.bufsize,
4800 encoding = self.encoding,
4801 errors = self.errors,
4802 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004803
4804 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004805 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004806 self.read_file.close()
4807 self.assertTrue(self.read_file.closed)
4808 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004809 SocketConnectedTest.tearDown(self)
4810
4811 def clientSetUp(self):
4812 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004813 self.write_file = self.serv_conn.makefile(
4814 self.write_mode, self.bufsize,
4815 encoding = self.encoding,
4816 errors = self.errors,
4817 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004818
4819 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004820 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004821 self.write_file.close()
4822 self.assertTrue(self.write_file.closed)
4823 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004824 SocketConnectedTest.clientTearDown(self)
4825
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004826 def testReadAfterTimeout(self):
4827 # Issue #7322: A file object must disallow further reads
4828 # after a timeout has occurred.
4829 self.cli_conn.settimeout(1)
4830 self.read_file.read(3)
4831 # First read raises a timeout
Christian Heimes03c8ddd2020-11-20 09:26:07 +01004832 self.assertRaises(TimeoutError, self.read_file.read, 1)
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004833 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004834 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004835 self.read_file.read(1)
4836 self.assertIn("cannot read from timed out object", str(ctx.exception))
4837
4838 def _testReadAfterTimeout(self):
4839 self.write_file.write(self.write_msg[0:3])
4840 self.write_file.flush()
4841 self.serv_finished.wait()
4842
Guido van Rossum24e4af82002-06-12 19:18:08 +00004843 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004844 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004845 first_seg = self.read_file.read(len(self.read_msg)-3)
4846 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004847 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004848 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004849
4850 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004851 self.write_file.write(self.write_msg)
4852 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004853
Guido van Rossum8c943832002-08-08 01:00:28 +00004854 def testFullRead(self):
4855 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004856 msg = self.read_file.read()
4857 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004858
4859 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004860 self.write_file.write(self.write_msg)
4861 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004862
Guido van Rossum24e4af82002-06-12 19:18:08 +00004863 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004864 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004865 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004866 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004867 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004868 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004869 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004870 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004871 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004872
4873 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004874 self.write_file.write(self.write_msg)
4875 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004876
4877 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004878 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004879 line = self.read_file.readline()
4880 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004881
4882 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004883 self.write_file.write(self.write_msg)
4884 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004885
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004886 def testCloseAfterMakefile(self):
4887 # The file returned by makefile should keep the socket open.
4888 self.cli_conn.close()
4889 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004890 msg = self.read_file.read()
4891 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004892
4893 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004894 self.write_file.write(self.write_msg)
4895 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004896
4897 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004898 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004899 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004900 if isinstance(self.read_msg, str):
4901 msg = msg.decode()
4902 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004903
4904 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004905 self.write_file.write(self.write_msg)
4906 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004907
Tim Peters116d83c2004-03-28 02:20:45 +00004908 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004909 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004910
4911 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004912 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004913
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004914 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004915 self.assertEqual(self.read_file.mode, self.read_mode)
4916 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004917
4918 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004919 self.assertEqual(self.write_file.mode, self.write_mode)
4920 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004921
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004922 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004923 self.read_file.close()
4924 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004925 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004926 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004927
4928 def _testRealClose(self):
4929 pass
4930
4931
Guido van Rossume9f66142002-08-07 15:46:19 +00004932class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4933
4934 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004935
Guido van Rossume9f66142002-08-07 15:46:19 +00004936 In this case (and in this case only), it should be possible to
4937 create a file object, read a line from it, create another file
4938 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004939 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004940 when reading multiple requests from the same socket."""
4941
4942 bufsize = 0 # Use unbuffered mode
4943
4944 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004945 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004946 line = self.read_file.readline() # first line
4947 self.assertEqual(line, b"A. " + self.write_msg) # first line
4948 self.read_file = self.cli_conn.makefile('rb', 0)
4949 line = self.read_file.readline() # second line
4950 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004951
4952 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004953 self.write_file.write(b"A. " + self.write_msg)
4954 self.write_file.write(b"B. " + self.write_msg)
4955 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004956
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004957 def testMakefileClose(self):
4958 # The file returned by makefile should keep the socket open...
4959 self.cli_conn.close()
4960 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004961 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004962 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004963 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004964 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004965
4966 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004967 self.write_file.write(self.write_msg)
4968 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004969
4970 def testMakefileCloseSocketDestroy(self):
4971 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004972 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004973 refcount_after = sys.getrefcount(self.cli_conn)
4974 self.assertEqual(refcount_before - 1, refcount_after)
4975
4976 def _testMakefileCloseSocketDestroy(self):
4977 pass
4978
Antoine Pitrou98b46702010-09-18 22:59:00 +00004979 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004980 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004981 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4982
4983 def testSmallReadNonBlocking(self):
4984 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004985 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4986 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004987 self.evt1.set()
4988 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004989 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004990 if first_seg is None:
4991 # Data not arrived (can happen under Windows), wait a bit
4992 time.sleep(0.5)
4993 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004994 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004995 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004996 self.assertEqual(n, 3)
4997 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004998 self.assertEqual(msg, self.read_msg)
4999 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
5000 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005001
5002 def _testSmallReadNonBlocking(self):
5003 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005004 self.write_file.write(self.write_msg)
5005 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00005006 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03005007 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00005008 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
5009 self.serv_finished.wait(5.0)
5010
5011 def testWriteNonBlocking(self):
5012 self.cli_finished.wait(5.0)
5013 # The client thread can't skip directly - the SkipTest exception
5014 # would appear as a failure.
5015 if self.serv_skipped:
5016 self.skipTest(self.serv_skipped)
5017
5018 def _testWriteNonBlocking(self):
5019 self.serv_skipped = None
5020 self.serv_conn.setblocking(False)
5021 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02005022 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00005023 LIMIT = 10
5024 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00005025 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005026 self.assertGreater(n, 0)
5027 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005028 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005029 if n is None:
5030 # Succeeded
5031 break
5032 self.assertGreater(n, 0)
5033 else:
5034 # Let us know that this test didn't manage to establish
5035 # the expected conditions. This is not a failure in itself but,
5036 # if it happens repeatedly, the test should be fixed.
5037 self.serv_skipped = "failed to saturate the socket buffer"
5038
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005039
Guido van Rossum8c943832002-08-08 01:00:28 +00005040class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5041
5042 bufsize = 1 # Default-buffered for reading; line-buffered for writing
5043
5044
5045class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5046
5047 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00005048
Thomas Woutersb2137042007-02-01 18:02:27 +00005049
Antoine Pitrou834bd812010-10-13 16:17:14 +00005050class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5051 """Tests for socket.makefile() in text mode (rather than binary)"""
5052
5053 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005054 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005055 write_mode = 'wb'
5056 write_msg = MSG
5057 newline = ''
5058
5059
5060class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5061 """Tests for socket.makefile() in text mode (rather than binary)"""
5062
5063 read_mode = 'rb'
5064 read_msg = MSG
5065 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005066 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005067 newline = ''
5068
5069
5070class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5071 """Tests for socket.makefile() in text mode (rather than binary)"""
5072
5073 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005074 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005075 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005076 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005077 newline = ''
5078
5079
Guido van Rossumd8faa362007-04-27 19:54:29 +00005080class NetworkConnectionTest(object):
5081 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005082
Guido van Rossumd8faa362007-04-27 19:54:29 +00005083 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005084 # We're inherited below by BasicTCPTest2, which also inherits
5085 # BasicTCPTest, which defines self.port referenced below.
5086 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005087 self.serv_conn = self.cli
5088
5089class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5090 """Tests that NetworkConnection does not break existing TCP functionality.
5091 """
5092
5093class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005094
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005095 class MockSocket(socket.socket):
5096 def connect(self, *args):
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005097 raise TimeoutError('timed out')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005098
5099 @contextlib.contextmanager
5100 def mocked_socket_module(self):
5101 """Return a socket which times out on connect"""
5102 old_socket = socket.socket
5103 socket.socket = self.MockSocket
5104 try:
5105 yield
5106 finally:
5107 socket.socket = old_socket
5108
5109 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005110 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005111 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005112 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005113 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005114 cli.connect((HOST, port))
5115 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5116
5117 def test_create_connection(self):
5118 # Issue #9792: errors raised by create_connection() should have
5119 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005120 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005121 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005122 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005123
5124 # Issue #16257: create_connection() calls getaddrinfo() against
5125 # 'localhost'. This may result in an IPV6 addr being returned
5126 # as well as an IPV4 one:
5127 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5128 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5129 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5130 #
5131 # create_connection() enumerates through all the addresses returned
5132 # and if it doesn't successfully bind to any of them, it propagates
5133 # the last exception it encountered.
5134 #
5135 # On Solaris, ENETUNREACH is returned in this circumstance instead
5136 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5137 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005138 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005139 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005140
5141 def test_create_connection_timeout(self):
5142 # Issue #9792: create_connection() should not recast timeout errors
5143 # as generic socket errors.
5144 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005145 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005146 socket.create_connection((HOST, 1234))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005147 except TimeoutError:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005148 pass
5149 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005150 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005151 raise
5152 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005153 self.fail('TimeoutError not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005154
Guido van Rossumd8faa362007-04-27 19:54:29 +00005155
5156class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5157
5158 def __init__(self, methodName='runTest'):
5159 SocketTCPTest.__init__(self, methodName=methodName)
5160 ThreadableTest.__init__(self)
5161
5162 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005163 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005164
5165 def clientTearDown(self):
5166 self.cli.close()
5167 self.cli = None
5168 ThreadableTest.clientTearDown(self)
5169
5170 def _justAccept(self):
5171 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005172 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005173
5174 testFamily = _justAccept
5175 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005176 self.cli = socket.create_connection((HOST, self.port),
5177 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005178 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005179 self.assertEqual(self.cli.family, 2)
5180
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005181 testSourceAddress = _justAccept
5182 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005183 self.cli = socket.create_connection((HOST, self.port),
5184 timeout=support.LOOPBACK_TIMEOUT,
5185 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005186 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005187 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005188 # The port number being used is sufficient to show that the bind()
5189 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005190
Guido van Rossumd8faa362007-04-27 19:54:29 +00005191 testTimeoutDefault = _justAccept
5192 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005193 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005194 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005195 socket.setdefaulttimeout(42)
5196 try:
5197 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005198 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005199 finally:
5200 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005201 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005202
5203 testTimeoutNone = _justAccept
5204 def _testTimeoutNone(self):
5205 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005206 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005207 socket.setdefaulttimeout(30)
5208 try:
5209 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005210 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005211 finally:
5212 socket.setdefaulttimeout(None)
5213 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005214
5215 testTimeoutValueNamed = _justAccept
5216 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005217 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005218 self.assertEqual(self.cli.gettimeout(), 30)
5219
5220 testTimeoutValueNonamed = _justAccept
5221 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005222 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005223 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005224 self.assertEqual(self.cli.gettimeout(), 30)
5225
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005226
Guido van Rossumd8faa362007-04-27 19:54:29 +00005227class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5228
5229 def __init__(self, methodName='runTest'):
5230 SocketTCPTest.__init__(self, methodName=methodName)
5231 ThreadableTest.__init__(self)
5232
5233 def clientSetUp(self):
5234 pass
5235
5236 def clientTearDown(self):
5237 self.cli.close()
5238 self.cli = None
5239 ThreadableTest.clientTearDown(self)
5240
5241 def testInsideTimeout(self):
5242 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005243 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005244 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005245 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005246 testOutsideTimeout = testInsideTimeout
5247
5248 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005249 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005250 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005251 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005252
5253 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005254 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005255 self.assertRaises(TimeoutError, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005256
5257
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005258class TCPTimeoutTest(SocketTCPTest):
5259
5260 def testTCPTimeout(self):
5261 def raise_timeout(*args, **kwargs):
5262 self.serv.settimeout(1.0)
5263 self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005264 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005265 "Error generating a timeout exception (TCP)")
5266
5267 def testTimeoutZero(self):
5268 ok = False
5269 try:
5270 self.serv.settimeout(0.0)
5271 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005272 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005273 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005274 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005275 ok = True
5276 except:
5277 self.fail("caught unexpected exception (TCP)")
5278 if not ok:
5279 self.fail("accept() returned success when we did not expect it")
5280
Serhiy Storchaka43767632013-11-03 21:31:38 +02005281 @unittest.skipUnless(hasattr(signal, 'alarm'),
5282 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005283 def testInterruptedTimeout(self):
5284 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005285 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005286 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005287 self.serv.settimeout(5.0) # must be longer than alarm
5288 class Alarm(Exception):
5289 pass
5290 def alarm_handler(signal, frame):
5291 raise Alarm
5292 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5293 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005294 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005295 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005296 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005297 except TimeoutError:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005298 self.fail("caught timeout instead of Alarm")
5299 except Alarm:
5300 pass
5301 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005302 self.fail("caught other exception instead of Alarm:"
5303 " %s(%s):\n%s" %
5304 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005305 else:
5306 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005307 finally:
5308 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005309 except Alarm:
5310 self.fail("got Alarm in wrong place")
5311 finally:
5312 # no alarm can be pending. Safe to restore old handler.
5313 signal.signal(signal.SIGALRM, old_alarm)
5314
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005315class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005316
5317 def testUDPTimeout(self):
5318 def raise_timeout(*args, **kwargs):
5319 self.serv.settimeout(1.0)
5320 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005321 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005322 "Error generating a timeout exception (UDP)")
5323
5324 def testTimeoutZero(self):
5325 ok = False
5326 try:
5327 self.serv.settimeout(0.0)
5328 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005329 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005330 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005331 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005332 ok = True
5333 except:
5334 self.fail("caught unexpected exception (UDP)")
5335 if not ok:
5336 self.fail("recv() returned success when we did not expect it")
5337
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005338@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5339 'UDPLITE sockets required for this test.')
5340class UDPLITETimeoutTest(SocketUDPLITETest):
5341
5342 def testUDPLITETimeout(self):
5343 def raise_timeout(*args, **kwargs):
5344 self.serv.settimeout(1.0)
5345 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005346 self.assertRaises(TimeoutError, raise_timeout,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005347 "Error generating a timeout exception (UDPLITE)")
5348
5349 def testTimeoutZero(self):
5350 ok = False
5351 try:
5352 self.serv.settimeout(0.0)
5353 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005354 except TimeoutError:
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005355 self.fail("caught timeout instead of error (UDPLITE)")
5356 except OSError:
5357 ok = True
5358 except:
5359 self.fail("caught unexpected exception (UDPLITE)")
5360 if not ok:
5361 self.fail("recv() returned success when we did not expect it")
5362
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005363class TestExceptions(unittest.TestCase):
5364
5365 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005366 self.assertTrue(issubclass(OSError, Exception))
5367 self.assertTrue(issubclass(socket.herror, OSError))
5368 self.assertTrue(issubclass(socket.gaierror, OSError))
5369 self.assertTrue(issubclass(socket.timeout, OSError))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005370 self.assertIs(socket.error, OSError)
5371 self.assertIs(socket.timeout, TimeoutError)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005372
Yury Selivanovfa22b292016-10-18 16:03:52 -04005373 def test_setblocking_invalidfd(self):
5374 # Regression test for issue #28471
5375
5376 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5377 sock = socket.socket(
5378 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5379 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005380 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005381
5382 with self.assertRaises(OSError):
5383 sock.setblocking(False)
5384
5385
Serhiy Storchaka43767632013-11-03 21:31:38 +02005386@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005387class TestLinuxAbstractNamespace(unittest.TestCase):
5388
5389 UNIX_PATH_MAX = 108
5390
5391 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005392 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005393 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5394 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005395 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005396 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5397 s2.connect(s1.getsockname())
5398 with s1.accept()[0] as s3:
5399 self.assertEqual(s1.getsockname(), address)
5400 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005401
5402 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005403 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005404 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5405 s.bind(address)
5406 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005407
5408 def testNameOverflow(self):
5409 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005410 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005411 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005412
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005413 def testStrName(self):
5414 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005415 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5416 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005417 s.bind("\x00python\x00test\x00")
5418 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005419 finally:
5420 s.close()
5421
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005422 def testBytearrayName(self):
5423 # Check that an abstract name can be passed as a bytearray.
5424 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5425 s.bind(bytearray(b"\x00python\x00test\x00"))
5426 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5427
Serhiy Storchaka43767632013-11-03 21:31:38 +02005428@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005429class TestUnixDomain(unittest.TestCase):
5430
5431 def setUp(self):
5432 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5433
5434 def tearDown(self):
5435 self.sock.close()
5436
5437 def encoded(self, path):
5438 # Return the given path encoded in the file system encoding,
5439 # or skip the test if this is not possible.
5440 try:
5441 return os.fsencode(path)
5442 except UnicodeEncodeError:
5443 self.skipTest(
5444 "Pathname {0!a} cannot be represented in file "
5445 "system encoding {1!r}".format(
5446 path, sys.getfilesystemencoding()))
5447
Antoine Pitrou16374872011-12-16 15:04:12 +01005448 def bind(self, sock, path):
5449 # Bind the socket
5450 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005451 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005452 except OSError as e:
5453 if str(e) == "AF_UNIX path too long":
5454 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005455 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005456 .format(path))
5457 else:
5458 raise
5459
Antoine Pitrou495b5022017-05-02 17:20:00 +02005460 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005461 # Issue #30205 (note getsockname() can return None on OS X)
5462 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005463
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005464 def testStrAddr(self):
5465 # Test binding to and retrieving a normal string pathname.
Hai Shideb01622020-07-06 20:29:49 +08005466 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005467 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005468 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005469 self.assertEqual(self.sock.getsockname(), path)
5470
5471 def testBytesAddr(self):
5472 # Test binding to a bytes pathname.
Hai Shideb01622020-07-06 20:29:49 +08005473 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005474 self.bind(self.sock, self.encoded(path))
Hai Shideb01622020-07-06 20:29:49 +08005475 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005476 self.assertEqual(self.sock.getsockname(), path)
5477
5478 def testSurrogateescapeBind(self):
5479 # Test binding to a valid non-ASCII pathname, with the
5480 # non-ASCII bytes supplied using surrogateescape encoding.
Hai Shideb01622020-07-06 20:29:49 +08005481 path = os.path.abspath(os_helper.TESTFN_UNICODE)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005482 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005483 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Hai Shideb01622020-07-06 20:29:49 +08005484 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005485 self.assertEqual(self.sock.getsockname(), path)
5486
5487 def testUnencodableAddr(self):
5488 # Test binding to a pathname that cannot be encoded in the
5489 # file system encoding.
Hai Shideb01622020-07-06 20:29:49 +08005490 if os_helper.TESTFN_UNENCODABLE is None:
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005491 self.skipTest("No unencodable filename available")
Hai Shideb01622020-07-06 20:29:49 +08005492 path = os.path.abspath(os_helper.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005493 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005494 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005495 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005496
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005497
Thomas Wouters477c8d52006-05-27 19:21:47 +00005498class BufferIOTest(SocketConnectedTest):
5499 """
5500 Test the buffer versions of socket.recv() and socket.send().
5501 """
5502 def __init__(self, methodName='runTest'):
5503 SocketConnectedTest.__init__(self, methodName=methodName)
5504
Antoine Pitrou25480782010-03-17 22:50:28 +00005505 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005506 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005507 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005508 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005509 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005510 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005511 self.assertEqual(msg, MSG)
5512
Antoine Pitrou25480782010-03-17 22:50:28 +00005513 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005514 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005515 self.serv_conn.send(buf)
5516
Antoine Pitrou25480782010-03-17 22:50:28 +00005517 def testRecvIntoBytearray(self):
5518 buf = bytearray(1024)
5519 nbytes = self.cli_conn.recv_into(buf)
5520 self.assertEqual(nbytes, len(MSG))
5521 msg = buf[:len(MSG)]
5522 self.assertEqual(msg, MSG)
5523
5524 _testRecvIntoBytearray = _testRecvIntoArray
5525
5526 def testRecvIntoMemoryview(self):
5527 buf = bytearray(1024)
5528 nbytes = self.cli_conn.recv_into(memoryview(buf))
5529 self.assertEqual(nbytes, len(MSG))
5530 msg = buf[:len(MSG)]
5531 self.assertEqual(msg, MSG)
5532
5533 _testRecvIntoMemoryview = _testRecvIntoArray
5534
5535 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005536 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005537 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005538 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005539 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005540 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005541 self.assertEqual(msg, MSG)
5542
Antoine Pitrou25480782010-03-17 22:50:28 +00005543 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005544 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005545 self.serv_conn.send(buf)
5546
Antoine Pitrou25480782010-03-17 22:50:28 +00005547 def testRecvFromIntoBytearray(self):
5548 buf = bytearray(1024)
5549 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5550 self.assertEqual(nbytes, len(MSG))
5551 msg = buf[:len(MSG)]
5552 self.assertEqual(msg, MSG)
5553
5554 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5555
5556 def testRecvFromIntoMemoryview(self):
5557 buf = bytearray(1024)
5558 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5559 self.assertEqual(nbytes, len(MSG))
5560 msg = buf[:len(MSG)]
5561 self.assertEqual(msg, MSG)
5562
5563 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5564
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005565 def testRecvFromIntoSmallBuffer(self):
5566 # See issue #20246.
5567 buf = bytearray(8)
5568 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5569
5570 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005571 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005572
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005573 def testRecvFromIntoEmptyBuffer(self):
5574 buf = bytearray()
5575 self.cli_conn.recvfrom_into(buf)
5576 self.cli_conn.recvfrom_into(buf, 0)
5577
5578 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5579
Christian Heimes043d6f62008-01-07 17:19:16 +00005580
5581TIPC_STYPE = 2000
5582TIPC_LOWER = 200
5583TIPC_UPPER = 210
5584
5585def isTipcAvailable():
5586 """Check if the TIPC module is loaded
5587
5588 The TIPC module is not loaded automatically on Ubuntu and probably
5589 other Linux distros.
5590 """
5591 if not hasattr(socket, "AF_TIPC"):
5592 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005593 try:
5594 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005595 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005596 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005597 # have not the permission to read it.
5598 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005599 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005600 for line in f:
5601 if line.startswith("tipc "):
5602 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005603 return False
5604
Serhiy Storchaka43767632013-11-03 21:31:38 +02005605@unittest.skipUnless(isTipcAvailable(),
5606 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005607class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005608 def testRDM(self):
5609 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5610 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005611 self.addCleanup(srv.close)
5612 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005613
5614 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5615 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5616 TIPC_LOWER, TIPC_UPPER)
5617 srv.bind(srvaddr)
5618
5619 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5620 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5621 cli.sendto(MSG, sendaddr)
5622
5623 msg, recvaddr = srv.recvfrom(1024)
5624
5625 self.assertEqual(cli.getsockname(), recvaddr)
5626 self.assertEqual(msg, MSG)
5627
5628
Serhiy Storchaka43767632013-11-03 21:31:38 +02005629@unittest.skipUnless(isTipcAvailable(),
5630 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005631class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005632 def __init__(self, methodName = 'runTest'):
5633 unittest.TestCase.__init__(self, methodName = methodName)
5634 ThreadableTest.__init__(self)
5635
5636 def setUp(self):
5637 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005638 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005639 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5640 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5641 TIPC_LOWER, TIPC_UPPER)
5642 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005643 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005644 self.serverExplicitReady()
5645 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005646 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005647
5648 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005649 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005650 # accept() call; sleep a little while to avoid it, otherwise
5651 # we could get an exception
5652 time.sleep(0.1)
5653 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005654 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005655 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5656 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5657 self.cli.connect(addr)
5658 self.cliaddr = self.cli.getsockname()
5659
5660 def testStream(self):
5661 msg = self.conn.recv(1024)
5662 self.assertEqual(msg, MSG)
5663 self.assertEqual(self.cliaddr, self.connaddr)
5664
5665 def _testStream(self):
5666 self.cli.send(MSG)
5667 self.cli.close()
5668
5669
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005670class ContextManagersTest(ThreadedTCPSocketTest):
5671
5672 def _testSocketClass(self):
5673 # base test
5674 with socket.socket() as sock:
5675 self.assertFalse(sock._closed)
5676 self.assertTrue(sock._closed)
5677 # close inside with block
5678 with socket.socket() as sock:
5679 sock.close()
5680 self.assertTrue(sock._closed)
5681 # exception inside with block
5682 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005683 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005684 self.assertTrue(sock._closed)
5685
5686 def testCreateConnectionBase(self):
5687 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005688 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005689 data = conn.recv(1024)
5690 conn.sendall(data)
5691
5692 def _testCreateConnectionBase(self):
5693 address = self.serv.getsockname()
5694 with socket.create_connection(address) as sock:
5695 self.assertFalse(sock._closed)
5696 sock.sendall(b'foo')
5697 self.assertEqual(sock.recv(1024), b'foo')
5698 self.assertTrue(sock._closed)
5699
5700 def testCreateConnectionClose(self):
5701 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005702 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005703 data = conn.recv(1024)
5704 conn.sendall(data)
5705
5706 def _testCreateConnectionClose(self):
5707 address = self.serv.getsockname()
5708 with socket.create_connection(address) as sock:
5709 sock.close()
5710 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005711 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005712
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005713
Victor Stinnerdaf45552013-08-28 00:53:59 +02005714class InheritanceTest(unittest.TestCase):
5715 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5716 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005717 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005718 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005719 with socket.socket(socket.AF_INET,
5720 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005721 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005722 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005723
5724 def test_default_inheritable(self):
5725 sock = socket.socket()
5726 with sock:
5727 self.assertEqual(sock.get_inheritable(), False)
5728
5729 def test_dup(self):
5730 sock = socket.socket()
5731 with sock:
5732 newsock = sock.dup()
5733 sock.close()
5734 with newsock:
5735 self.assertEqual(newsock.get_inheritable(), False)
5736
5737 def test_set_inheritable(self):
5738 sock = socket.socket()
5739 with sock:
5740 sock.set_inheritable(True)
5741 self.assertEqual(sock.get_inheritable(), True)
5742
5743 sock.set_inheritable(False)
5744 self.assertEqual(sock.get_inheritable(), False)
5745
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005746 @unittest.skipIf(fcntl is None, "need fcntl")
5747 def test_get_inheritable_cloexec(self):
5748 sock = socket.socket()
5749 with sock:
5750 fd = sock.fileno()
5751 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005752
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005753 # clear FD_CLOEXEC flag
5754 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5755 flags &= ~fcntl.FD_CLOEXEC
5756 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005757
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005758 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005759
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005760 @unittest.skipIf(fcntl is None, "need fcntl")
5761 def test_set_inheritable_cloexec(self):
5762 sock = socket.socket()
5763 with sock:
5764 fd = sock.fileno()
5765 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5766 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005767
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005768 sock.set_inheritable(True)
5769 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5770 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005771
5772
Victor Stinnerdaf45552013-08-28 00:53:59 +02005773 def test_socketpair(self):
5774 s1, s2 = socket.socketpair()
5775 self.addCleanup(s1.close)
5776 self.addCleanup(s2.close)
5777 self.assertEqual(s1.get_inheritable(), False)
5778 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005779
5780
5781@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5782 "SOCK_NONBLOCK not defined")
5783class NonblockConstantTest(unittest.TestCase):
5784 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5785 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005786 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005787 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005788 self.assertTrue(
5789 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005790 if timeout == 0:
5791 # timeout == 0: means that getblocking() must be False.
5792 self.assertFalse(s.getblocking())
5793 else:
5794 # If timeout > 0, the socket will be in a "blocking" mode
5795 # from the standpoint of the Python API. For Python socket
5796 # object, "blocking" means that operations like 'sock.recv()'
5797 # will block. Internally, file descriptors for
5798 # "blocking" Python sockets *with timeouts* are in a
5799 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5800 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5801 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005802 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005803 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005804 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005805 self.assertFalse(
5806 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005807 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005808
Charles-François Natali239bb962011-06-03 12:55:15 +02005809 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005810 def test_SOCK_NONBLOCK(self):
5811 # a lot of it seems silly and redundant, but I wanted to test that
5812 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005813 with socket.socket(socket.AF_INET,
5814 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5815 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005816 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005817 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005818 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005819 self.checkNonblock(s)
5820 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005821 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005822 s.settimeout(2.0)
5823 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005824 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005825 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005826 # defaulttimeout
5827 t = socket.getdefaulttimeout()
5828 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005829 with socket.socket() as s:
5830 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005831 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005832 with socket.socket() as s:
5833 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005834 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005835 with socket.socket() as s:
5836 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005837 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005838 with socket.socket() as s:
5839 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005840 socket.setdefaulttimeout(t)
5841
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005842
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005843@unittest.skipUnless(os.name == "nt", "Windows specific")
5844@unittest.skipUnless(multiprocessing, "need multiprocessing")
5845class TestSocketSharing(SocketTCPTest):
5846 # This must be classmethod and not staticmethod or multiprocessing
5847 # won't be able to bootstrap it.
5848 @classmethod
5849 def remoteProcessServer(cls, q):
5850 # Recreate socket from shared data
5851 sdata = q.get()
5852 message = q.get()
5853
5854 s = socket.fromshare(sdata)
5855 s2, c = s.accept()
5856
5857 # Send the message
5858 s2.sendall(message)
5859 s2.close()
5860 s.close()
5861
5862 def testShare(self):
5863 # Transfer the listening server socket to another process
5864 # and service it from there.
5865
5866 # Create process:
5867 q = multiprocessing.Queue()
5868 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5869 p.start()
5870
5871 # Get the shared socket data
5872 data = self.serv.share(p.pid)
5873
5874 # Pass the shared socket to the other process
5875 addr = self.serv.getsockname()
5876 self.serv.close()
5877 q.put(data)
5878
5879 # The data that the server will send us
5880 message = b"slapmahfro"
5881 q.put(message)
5882
5883 # Connect
5884 s = socket.create_connection(addr)
5885 # listen for the data
5886 m = []
5887 while True:
5888 data = s.recv(100)
5889 if not data:
5890 break
5891 m.append(data)
5892 s.close()
5893 received = b"".join(m)
5894 self.assertEqual(received, message)
5895 p.join()
5896
5897 def testShareLength(self):
5898 data = self.serv.share(os.getpid())
5899 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5900 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5901
5902 def compareSockets(self, org, other):
5903 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005904 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005905 self.assertEqual(org.gettimeout(), None)
5906 self.assertEqual(org.gettimeout(), other.gettimeout())
5907
5908 self.assertEqual(org.family, other.family)
5909 self.assertEqual(org.type, other.type)
5910 # If the user specified "0" for proto, then
5911 # internally windows will have picked the correct value.
5912 # Python introspection on the socket however will still return
5913 # 0. For the shared socket, the python value is recreated
5914 # from the actual value, so it may not compare correctly.
5915 if org.proto != 0:
5916 self.assertEqual(org.proto, other.proto)
5917
5918 def testShareLocal(self):
5919 data = self.serv.share(os.getpid())
5920 s = socket.fromshare(data)
5921 try:
5922 self.compareSockets(self.serv, s)
5923 finally:
5924 s.close()
5925
5926 def testTypes(self):
5927 families = [socket.AF_INET, socket.AF_INET6]
5928 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5929 for f in families:
5930 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005931 try:
5932 source = socket.socket(f, t)
5933 except OSError:
5934 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005935 try:
5936 data = source.share(os.getpid())
5937 shared = socket.fromshare(data)
5938 try:
5939 self.compareSockets(source, shared)
5940 finally:
5941 shared.close()
5942 finally:
5943 source.close()
5944
5945
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005946class SendfileUsingSendTest(ThreadedTCPSocketTest):
5947 """
5948 Test the send() implementation of socket.sendfile().
5949 """
5950
Victor Stinner8c663fd2017-11-08 14:44:44 -08005951 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005952 BUFSIZE = 8192
5953 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005954 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005955
5956 @classmethod
5957 def setUpClass(cls):
5958 def chunks(total, step):
5959 assert total >= step
5960 while total > step:
5961 yield step
5962 total -= step
5963 if total:
5964 yield total
5965
5966 chunk = b"".join([random.choice(string.ascii_letters).encode()
5967 for i in range(cls.BUFSIZE)])
Hai Shideb01622020-07-06 20:29:49 +08005968 with open(os_helper.TESTFN, 'wb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005969 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5970 f.write(chunk)
Hai Shideb01622020-07-06 20:29:49 +08005971 with open(os_helper.TESTFN, 'rb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005972 cls.FILEDATA = f.read()
5973 assert len(cls.FILEDATA) == cls.FILESIZE
5974
5975 @classmethod
5976 def tearDownClass(cls):
Hai Shideb01622020-07-06 20:29:49 +08005977 os_helper.unlink(os_helper.TESTFN)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005978
5979 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005980 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005981 conn, addr = self.serv.accept()
5982 conn.settimeout(self.TIMEOUT)
5983 self.addCleanup(conn.close)
5984 return conn
5985
5986 def recv_data(self, conn):
5987 received = []
5988 while True:
5989 chunk = conn.recv(self.BUFSIZE)
5990 if not chunk:
5991 break
5992 received.append(chunk)
5993 return b''.join(received)
5994
5995 def meth_from_sock(self, sock):
5996 # Depending on the mixin class being run return either send()
5997 # or sendfile() method implementation.
5998 return getattr(sock, "_sendfile_use_send")
5999
6000 # regular file
6001
6002 def _testRegularFile(self):
6003 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006004 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006005 with socket.create_connection(address) as sock, file as file:
6006 meth = self.meth_from_sock(sock)
6007 sent = meth(file)
6008 self.assertEqual(sent, self.FILESIZE)
6009 self.assertEqual(file.tell(), self.FILESIZE)
6010
6011 def testRegularFile(self):
6012 conn = self.accept_conn()
6013 data = self.recv_data(conn)
6014 self.assertEqual(len(data), self.FILESIZE)
6015 self.assertEqual(data, self.FILEDATA)
6016
6017 # non regular file
6018
6019 def _testNonRegularFile(self):
6020 address = self.serv.getsockname()
6021 file = io.BytesIO(self.FILEDATA)
6022 with socket.create_connection(address) as sock, file as file:
6023 sent = sock.sendfile(file)
6024 self.assertEqual(sent, self.FILESIZE)
6025 self.assertEqual(file.tell(), self.FILESIZE)
6026 self.assertRaises(socket._GiveupOnSendfile,
6027 sock._sendfile_use_sendfile, file)
6028
6029 def testNonRegularFile(self):
6030 conn = self.accept_conn()
6031 data = self.recv_data(conn)
6032 self.assertEqual(len(data), self.FILESIZE)
6033 self.assertEqual(data, self.FILEDATA)
6034
6035 # empty file
6036
6037 def _testEmptyFileSend(self):
6038 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006039 filename = os_helper.TESTFN + "2"
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006040 with open(filename, 'wb'):
Hai Shideb01622020-07-06 20:29:49 +08006041 self.addCleanup(os_helper.unlink, filename)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006042 file = open(filename, 'rb')
6043 with socket.create_connection(address) as sock, file as file:
6044 meth = self.meth_from_sock(sock)
6045 sent = meth(file)
6046 self.assertEqual(sent, 0)
6047 self.assertEqual(file.tell(), 0)
6048
6049 def testEmptyFileSend(self):
6050 conn = self.accept_conn()
6051 data = self.recv_data(conn)
6052 self.assertEqual(data, b"")
6053
6054 # offset
6055
6056 def _testOffset(self):
6057 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006058 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006059 with socket.create_connection(address) as sock, file as file:
6060 meth = self.meth_from_sock(sock)
6061 sent = meth(file, offset=5000)
6062 self.assertEqual(sent, self.FILESIZE - 5000)
6063 self.assertEqual(file.tell(), self.FILESIZE)
6064
6065 def testOffset(self):
6066 conn = self.accept_conn()
6067 data = self.recv_data(conn)
6068 self.assertEqual(len(data), self.FILESIZE - 5000)
6069 self.assertEqual(data, self.FILEDATA[5000:])
6070
6071 # count
6072
6073 def _testCount(self):
6074 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006075 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006076 sock = socket.create_connection(address,
6077 timeout=support.LOOPBACK_TIMEOUT)
6078 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006079 count = 5000007
6080 meth = self.meth_from_sock(sock)
6081 sent = meth(file, count=count)
6082 self.assertEqual(sent, count)
6083 self.assertEqual(file.tell(), count)
6084
6085 def testCount(self):
6086 count = 5000007
6087 conn = self.accept_conn()
6088 data = self.recv_data(conn)
6089 self.assertEqual(len(data), count)
6090 self.assertEqual(data, self.FILEDATA[:count])
6091
6092 # count small
6093
6094 def _testCountSmall(self):
6095 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006096 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006097 sock = socket.create_connection(address,
6098 timeout=support.LOOPBACK_TIMEOUT)
6099 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006100 count = 1
6101 meth = self.meth_from_sock(sock)
6102 sent = meth(file, count=count)
6103 self.assertEqual(sent, count)
6104 self.assertEqual(file.tell(), count)
6105
6106 def testCountSmall(self):
6107 count = 1
6108 conn = self.accept_conn()
6109 data = self.recv_data(conn)
6110 self.assertEqual(len(data), count)
6111 self.assertEqual(data, self.FILEDATA[:count])
6112
6113 # count + offset
6114
6115 def _testCountWithOffset(self):
6116 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006117 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006118 with socket.create_connection(address, timeout=2) as sock, file as file:
6119 count = 100007
6120 meth = self.meth_from_sock(sock)
6121 sent = meth(file, offset=2007, count=count)
6122 self.assertEqual(sent, count)
6123 self.assertEqual(file.tell(), count + 2007)
6124
6125 def testCountWithOffset(self):
6126 count = 100007
6127 conn = self.accept_conn()
6128 data = self.recv_data(conn)
6129 self.assertEqual(len(data), count)
6130 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6131
6132 # non blocking sockets are not supposed to work
6133
6134 def _testNonBlocking(self):
6135 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006136 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006137 with socket.create_connection(address) as sock, file as file:
6138 sock.setblocking(False)
6139 meth = self.meth_from_sock(sock)
6140 self.assertRaises(ValueError, meth, file)
6141 self.assertRaises(ValueError, sock.sendfile, file)
6142
6143 def testNonBlocking(self):
6144 conn = self.accept_conn()
6145 if conn.recv(8192):
6146 self.fail('was not supposed to receive any data')
6147
6148 # timeout (non-triggered)
6149
6150 def _testWithTimeout(self):
6151 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006152 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006153 sock = socket.create_connection(address,
6154 timeout=support.LOOPBACK_TIMEOUT)
6155 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006156 meth = self.meth_from_sock(sock)
6157 sent = meth(file)
6158 self.assertEqual(sent, self.FILESIZE)
6159
6160 def testWithTimeout(self):
6161 conn = self.accept_conn()
6162 data = self.recv_data(conn)
6163 self.assertEqual(len(data), self.FILESIZE)
6164 self.assertEqual(data, self.FILEDATA)
6165
6166 # timeout (triggered)
6167
6168 def _testWithTimeoutTriggeredSend(self):
6169 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006170 with open(os_helper.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006171 with socket.create_connection(address) as sock:
6172 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006173 meth = self.meth_from_sock(sock)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01006174 self.assertRaises(TimeoutError, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006175
6176 def testWithTimeoutTriggeredSend(self):
6177 conn = self.accept_conn()
6178 conn.recv(88192)
6179
6180 # errors
6181
6182 def _test_errors(self):
6183 pass
6184
6185 def test_errors(self):
Hai Shideb01622020-07-06 20:29:49 +08006186 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006187 with socket.socket(type=socket.SOCK_DGRAM) as s:
6188 meth = self.meth_from_sock(s)
6189 self.assertRaisesRegex(
6190 ValueError, "SOCK_STREAM", meth, file)
Hai Shideb01622020-07-06 20:29:49 +08006191 with open(os_helper.TESTFN, 'rt') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006192 with socket.socket() as s:
6193 meth = self.meth_from_sock(s)
6194 self.assertRaisesRegex(
6195 ValueError, "binary mode", meth, file)
Hai Shideb01622020-07-06 20:29:49 +08006196 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006197 with socket.socket() as s:
6198 meth = self.meth_from_sock(s)
6199 self.assertRaisesRegex(TypeError, "positive integer",
6200 meth, file, count='2')
6201 self.assertRaisesRegex(TypeError, "positive integer",
6202 meth, file, count=0.1)
6203 self.assertRaisesRegex(ValueError, "positive integer",
6204 meth, file, count=0)
6205 self.assertRaisesRegex(ValueError, "positive integer",
6206 meth, file, count=-1)
6207
6208
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006209@unittest.skipUnless(hasattr(os, "sendfile"),
6210 'os.sendfile() required for this test.')
6211class SendfileUsingSendfileTest(SendfileUsingSendTest):
6212 """
6213 Test the sendfile() implementation of socket.sendfile().
6214 """
6215 def meth_from_sock(self, sock):
6216 return getattr(sock, "_sendfile_use_sendfile")
6217
Christian Heimes48371412016-09-06 00:37:46 +02006218
6219@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006220class LinuxKernelCryptoAPI(unittest.TestCase):
6221 # tests for AF_ALG
6222 def create_alg(self, typ, name):
6223 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006224 try:
6225 sock.bind((typ, name))
6226 except FileNotFoundError as e:
6227 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006228 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006229 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006230 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006231 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006232
Victor Stinner86afc1f2017-11-30 13:58:43 +01006233 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6234 # at least on ppc64le architecture
6235 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006236 def test_sha256(self):
6237 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6238 "177a9cb410ff61f20015ad")
6239 with self.create_alg('hash', 'sha256') as algo:
6240 op, _ = algo.accept()
6241 with op:
6242 op.sendall(b"abc")
6243 self.assertEqual(op.recv(512), expected)
6244
6245 op, _ = algo.accept()
6246 with op:
6247 op.send(b'a', socket.MSG_MORE)
6248 op.send(b'b', socket.MSG_MORE)
6249 op.send(b'c', socket.MSG_MORE)
6250 op.send(b'')
6251 self.assertEqual(op.recv(512), expected)
6252
6253 def test_hmac_sha1(self):
6254 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6255 with self.create_alg('hash', 'hmac(sha1)') as algo:
6256 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6257 op, _ = algo.accept()
6258 with op:
6259 op.sendall(b"what do ya want for nothing?")
6260 self.assertEqual(op.recv(512), expected)
6261
Christian Heimese084f842016-09-11 20:11:30 +02006262 # Although it should work with 3.19 and newer the test blocks on
6263 # Ubuntu 15.10 with Kernel 4.2.0-19.
6264 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006265 def test_aes_cbc(self):
6266 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6267 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6268 msg = b"Single block msg"
6269 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6270 msglen = len(msg)
6271 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6272 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6273 op, _ = algo.accept()
6274 with op:
6275 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6276 flags=socket.MSG_MORE)
6277 op.sendall(msg)
6278 self.assertEqual(op.recv(msglen), ciphertext)
6279
6280 op, _ = algo.accept()
6281 with op:
6282 op.sendmsg_afalg([ciphertext],
6283 op=socket.ALG_OP_DECRYPT, iv=iv)
6284 self.assertEqual(op.recv(msglen), msg)
6285
6286 # long message
6287 multiplier = 1024
6288 longmsg = [msg] * multiplier
6289 op, _ = algo.accept()
6290 with op:
6291 op.sendmsg_afalg(longmsg,
6292 op=socket.ALG_OP_ENCRYPT, iv=iv)
6293 enc = op.recv(msglen * multiplier)
6294 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006295 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006296
6297 op, _ = algo.accept()
6298 with op:
6299 op.sendmsg_afalg([enc],
6300 op=socket.ALG_OP_DECRYPT, iv=iv)
6301 dec = op.recv(msglen * multiplier)
6302 self.assertEqual(len(dec), msglen * multiplier)
6303 self.assertEqual(dec, msg * multiplier)
6304
matejcik9764c152017-02-16 14:41:31 +01006305 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006306 def test_aead_aes_gcm(self):
6307 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6308 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6309 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6310 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6311 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6312 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6313
6314 taglen = len(expected_tag)
6315 assoclen = len(assoc)
6316
6317 with self.create_alg('aead', 'gcm(aes)') as algo:
6318 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6319 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6320 None, taglen)
6321
6322 # send assoc, plain and tag buffer in separate steps
6323 op, _ = algo.accept()
6324 with op:
6325 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6326 assoclen=assoclen, flags=socket.MSG_MORE)
6327 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006328 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006329 res = op.recv(assoclen + len(plain) + taglen)
6330 self.assertEqual(expected_ct, res[assoclen:-taglen])
6331 self.assertEqual(expected_tag, res[-taglen:])
6332
6333 # now with msg
6334 op, _ = algo.accept()
6335 with op:
matejcik9764c152017-02-16 14:41:31 +01006336 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006337 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6338 assoclen=assoclen)
6339 res = op.recv(assoclen + len(plain) + taglen)
6340 self.assertEqual(expected_ct, res[assoclen:-taglen])
6341 self.assertEqual(expected_tag, res[-taglen:])
6342
6343 # create anc data manually
6344 pack_uint32 = struct.Struct('I').pack
6345 op, _ = algo.accept()
6346 with op:
matejcik9764c152017-02-16 14:41:31 +01006347 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006348 op.sendmsg(
6349 [msg],
6350 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6351 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6352 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6353 )
6354 )
matejcik9764c152017-02-16 14:41:31 +01006355 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006356 self.assertEqual(expected_ct, res[assoclen:-taglen])
6357 self.assertEqual(expected_tag, res[-taglen:])
6358
6359 # decrypt and verify
6360 op, _ = algo.accept()
6361 with op:
6362 msg = assoc + expected_ct + expected_tag
6363 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6364 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006365 res = op.recv(len(msg) - taglen)
6366 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006367
Christian Heimese084f842016-09-11 20:11:30 +02006368 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006369 def test_drbg_pr_sha256(self):
6370 # deterministic random bit generator, prediction resistance, sha256
6371 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6372 extra_seed = os.urandom(32)
6373 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6374 op, _ = algo.accept()
6375 with op:
6376 rn = op.recv(32)
6377 self.assertEqual(len(rn), 32)
6378
6379 def test_sendmsg_afalg_args(self):
6380 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006381 with sock:
6382 with self.assertRaises(TypeError):
6383 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006384
Christian Heimes02b30352016-09-11 19:49:56 +02006385 with self.assertRaises(TypeError):
6386 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006387
Christian Heimes02b30352016-09-11 19:49:56 +02006388 with self.assertRaises(TypeError):
6389 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006390
Christian Heimes02b30352016-09-11 19:49:56 +02006391 with self.assertRaises(TypeError):
6392 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006393
Christian Heimes02b30352016-09-11 19:49:56 +02006394 with self.assertRaises(TypeError):
6395 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6396
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006397 def test_length_restriction(self):
6398 # bpo-35050, off-by-one error in length check
6399 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6400 self.addCleanup(sock.close)
6401
6402 # salg_type[14]
6403 with self.assertRaises(FileNotFoundError):
6404 sock.bind(("t" * 13, "name"))
6405 with self.assertRaisesRegex(ValueError, "type too long"):
6406 sock.bind(("t" * 14, "name"))
6407
6408 # salg_name[64]
6409 with self.assertRaises(FileNotFoundError):
6410 sock.bind(("type", "n" * 63))
6411 with self.assertRaisesRegex(ValueError, "name too long"):
6412 sock.bind(("type", "n" * 64))
6413
6414
animalize19e7d482018-02-27 02:10:36 +08006415@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6416class TestMSWindowsTCPFlags(unittest.TestCase):
6417 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006418 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006419 'TCP_MAXSEG',
6420 'TCP_NODELAY',
6421 # available starting with Windows 10 1607
6422 'TCP_FASTOPEN',
6423 # available starting with Windows 10 1703
6424 'TCP_KEEPCNT',
6425 # available starting with Windows 10 1709
6426 'TCP_KEEPIDLE',
6427 'TCP_KEEPINTVL'
6428 }
6429
6430 def test_new_tcp_flags(self):
6431 provided = [s for s in dir(socket) if s.startswith('TCP')]
6432 unknown = [s for s in provided if s not in self.knownTCPFlags]
6433
6434 self.assertEqual([], unknown,
6435 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006436
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006437
6438class CreateServerTest(unittest.TestCase):
6439
6440 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006441 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006442 with socket.create_server(("127.0.0.1", port)) as sock:
6443 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6444 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006445 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006446 with socket.create_server(("::1", port),
6447 family=socket.AF_INET6) as sock:
6448 self.assertEqual(sock.getsockname()[0], "::1")
6449 self.assertEqual(sock.getsockname()[1], port)
6450
6451 def test_family_and_type(self):
6452 with socket.create_server(("127.0.0.1", 0)) as sock:
6453 self.assertEqual(sock.family, socket.AF_INET)
6454 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006455 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006456 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6457 self.assertEqual(s.family, socket.AF_INET6)
6458 self.assertEqual(sock.type, socket.SOCK_STREAM)
6459
6460 def test_reuse_port(self):
6461 if not hasattr(socket, "SO_REUSEPORT"):
6462 with self.assertRaises(ValueError):
6463 socket.create_server(("localhost", 0), reuse_port=True)
6464 else:
6465 with socket.create_server(("localhost", 0)) as sock:
6466 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6467 self.assertEqual(opt, 0)
6468 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6469 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6470 self.assertNotEqual(opt, 0)
6471
6472 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6473 not hasattr(_socket, 'IPV6_V6ONLY'),
6474 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006475 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006476 def test_ipv6_only_default(self):
6477 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6478 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6479
6480 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6481 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006482 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006483 def test_dualstack_ipv6_family(self):
6484 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6485 dualstack_ipv6=True) as sock:
6486 self.assertEqual(sock.family, socket.AF_INET6)
6487
6488
6489class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006490 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006491
6492 def setUp(self):
6493 self.thread = None
6494
6495 def tearDown(self):
6496 if self.thread is not None:
6497 self.thread.join(self.timeout)
6498
6499 def echo_server(self, sock):
6500 def run(sock):
6501 with sock:
6502 conn, _ = sock.accept()
6503 with conn:
6504 event.wait(self.timeout)
6505 msg = conn.recv(1024)
6506 if not msg:
6507 return
6508 conn.sendall(msg)
6509
6510 event = threading.Event()
6511 sock.settimeout(self.timeout)
6512 self.thread = threading.Thread(target=run, args=(sock, ))
6513 self.thread.start()
6514 event.set()
6515
6516 def echo_client(self, addr, family):
6517 with socket.socket(family=family) as sock:
6518 sock.settimeout(self.timeout)
6519 sock.connect(addr)
6520 sock.sendall(b'foo')
6521 self.assertEqual(sock.recv(1024), b'foo')
6522
6523 def test_tcp4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006524 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006525 with socket.create_server(("", port)) as sock:
6526 self.echo_server(sock)
6527 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6528
Serhiy Storchaka16994912020-04-25 10:06:29 +03006529 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006530 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006531 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006532 with socket.create_server(("", port),
6533 family=socket.AF_INET6) as sock:
6534 self.echo_server(sock)
6535 self.echo_client(("::1", port), socket.AF_INET6)
6536
6537 # --- dual stack tests
6538
6539 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6540 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006541 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006542 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006543 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006544 with socket.create_server(("", port), family=socket.AF_INET6,
6545 dualstack_ipv6=True) as sock:
6546 self.echo_server(sock)
6547 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6548
6549 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6550 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006551 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006552 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006553 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006554 with socket.create_server(("", port), family=socket.AF_INET6,
6555 dualstack_ipv6=True) as sock:
6556 self.echo_server(sock)
6557 self.echo_client(("::1", port), socket.AF_INET6)
6558
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006559@requireAttrs(socket, "send_fds")
6560@requireAttrs(socket, "recv_fds")
6561@requireAttrs(socket, "AF_UNIX")
6562class SendRecvFdsTests(unittest.TestCase):
6563 def testSendAndRecvFds(self):
6564 def close_pipes(pipes):
6565 for fd1, fd2 in pipes:
6566 os.close(fd1)
6567 os.close(fd2)
6568
6569 def close_fds(fds):
6570 for fd in fds:
6571 os.close(fd)
6572
6573 # send 10 file descriptors
6574 pipes = [os.pipe() for _ in range(10)]
6575 self.addCleanup(close_pipes, pipes)
6576 fds = [rfd for rfd, wfd in pipes]
6577
6578 # use a UNIX socket pair to exchange file descriptors locally
6579 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6580 with sock1, sock2:
6581 socket.send_fds(sock1, [MSG], fds)
6582 # request more data and file descriptors than expected
6583 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6584 self.addCleanup(close_fds, fds2)
6585
6586 self.assertEqual(msg, MSG)
6587 self.assertEqual(len(fds2), len(fds))
6588 self.assertEqual(flags, 0)
6589 # don't test addr
6590
6591 # test that file descriptors are connected
6592 for index, fds in enumerate(pipes):
6593 rfd, wfd = fds
6594 os.write(wfd, str(index).encode())
6595
6596 for index, rfd in enumerate(fds2):
6597 data = os.read(rfd, 100)
6598 self.assertEqual(data, str(index).encode())
6599
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006600
Guido van Rossumb995eb72002-07-31 16:08:40 +00006601def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006602 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006603 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006604 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6605 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006606
6607 tests.extend([
6608 NonBlockingTCPTests,
6609 FileObjectClassTestCase,
6610 UnbufferedFileObjectClassTestCase,
6611 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006612 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006613 UnicodeReadFileObjectClassTestCase,
6614 UnicodeWriteFileObjectClassTestCase,
6615 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006616 NetworkConnectionNoServer,
6617 NetworkConnectionAttributesTest,
6618 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006619 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006620 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006621 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006622 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006623 tests.append(BasicSocketPairTest)
6624 tests.append(TestUnixDomain)
6625 tests.append(TestLinuxAbstractNamespace)
6626 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006627 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006628 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006629 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006630 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006631 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006632 BasicVSOCKTest,
6633 ThreadedVSOCKSocketStreamTest,
6634 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006635 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006636 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006637 CmsgMacroTests,
6638 SendmsgUDPTest,
6639 RecvmsgUDPTest,
6640 RecvmsgIntoUDPTest,
6641 SendmsgUDP6Test,
6642 RecvmsgUDP6Test,
6643 RecvmsgRFC3542AncillaryUDP6Test,
6644 RecvmsgIntoRFC3542AncillaryUDP6Test,
6645 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006646 SendmsgUDPLITETest,
6647 RecvmsgUDPLITETest,
6648 RecvmsgIntoUDPLITETest,
6649 SendmsgUDPLITE6Test,
6650 RecvmsgUDPLITE6Test,
6651 RecvmsgRFC3542AncillaryUDPLITE6Test,
6652 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6653 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006654 SendmsgTCPTest,
6655 RecvmsgTCPTest,
6656 RecvmsgIntoTCPTest,
6657 SendmsgSCTPStreamTest,
6658 RecvmsgSCTPStreamTest,
6659 RecvmsgIntoSCTPStreamTest,
6660 SendmsgUnixStreamTest,
6661 RecvmsgUnixStreamTest,
6662 RecvmsgIntoUnixStreamTest,
6663 RecvmsgSCMRightsStreamTest,
6664 RecvmsgIntoSCMRightsStreamTest,
6665 # These are slow when setitimer() is not available
6666 InterruptedRecvTimeoutTest,
6667 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006668 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006669 SendfileUsingSendTest,
6670 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006671 ])
animalize19e7d482018-02-27 02:10:36 +08006672 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006673
Hai Shie80697d2020-05-28 06:10:27 +08006674 thread_info = threading_helper.threading_setup()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006675 support.run_unittest(*tests)
Hai Shie80697d2020-05-28 06:10:27 +08006676 threading_helper.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006677
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006678
Guido van Rossum24e4af82002-06-12 19:18:08 +00006679if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006680 test_main()