blob: 828d1f3dcc67012fb471fff57c248417bf1ce1f6 [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
Miss Islington (bot)7b4725a2021-05-04 14:01:42 -0700227 # ip link set up vcan0
Charles-François Natali47413c12011-10-06 19:47:44 +0200228 """
229 interface = 'vcan0'
230 bufsize = 128
231
Charles-François Natali773e42d2013-02-05 19:42:01 +0100232 """The CAN frame structure is defined in <linux/can.h>:
233
234 struct can_frame {
235 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
236 __u8 can_dlc; /* data length code: 0 .. 8 */
237 __u8 data[8] __attribute__((aligned(8)));
238 };
239 """
240 can_frame_fmt = "=IB3x8s"
241 can_frame_size = struct.calcsize(can_frame_fmt)
242
243 """The Broadcast Management Command frame structure is defined
244 in <linux/can/bcm.h>:
245
246 struct bcm_msg_head {
247 __u32 opcode;
248 __u32 flags;
249 __u32 count;
250 struct timeval ival1, ival2;
251 canid_t can_id;
252 __u32 nframes;
253 struct can_frame frames[0];
254 }
255
256 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
257 `struct can_frame` definition). Must use native not standard types for packing.
258 """
259 bcm_cmd_msg_fmt = "@3I4l2I"
260 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
261
Charles-François Natali47413c12011-10-06 19:47:44 +0200262 def setUp(self):
263 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200264 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200265 try:
266 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200267 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200268 self.skipTest('network interface `%s` does not exist' %
269 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200270
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100271
272class SocketRDSTest(unittest.TestCase):
273
274 """To be able to run this test, the `rds` kernel module must be loaded:
275 # modprobe rds
276 """
277 bufsize = 8192
278
279 def setUp(self):
280 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
281 self.addCleanup(self.serv.close)
282 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +0300283 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100284 except OSError:
285 self.skipTest('unable to bind RDS socket')
286
287
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000289 """Threadable Test class
290
291 The ThreadableTest class makes it easy to create a threaded
292 client/server pair from an existing unit test. To create a
293 new threaded class from an existing unit test, use multiple
294 inheritance:
295
296 class NewClass (OldClass, ThreadableTest):
297 pass
298
299 This class defines two new fixture functions with obvious
300 purposes for overriding:
301
302 clientSetUp ()
303 clientTearDown ()
304
305 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000306 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000307 '_' to indicate the client portion of the test. Ex:
308
309 def testFoo(self):
310 # Server portion
311
312 def _testFoo(self):
313 # Client portion
314
315 Any exceptions raised by the clients during their tests
316 are caught and transferred to the main thread to alert
317 the testing framework.
318
319 Note, the server setup function cannot call any blocking
320 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000321 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000322 the blocking call (such as in setting up a client/server
323 connection and performing the accept() in setUp().
324 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325
326 def __init__(self):
327 # Swap the true setup function
328 self.__setUp = self.setUp
329 self.__tearDown = self.tearDown
330 self.setUp = self._setUp
331 self.tearDown = self._tearDown
332
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000333 def serverExplicitReady(self):
334 """This method allows the server to explicitly indicate that
335 it wants the client thread to proceed. This is useful if the
336 server is about to execute a blocking routine that is
337 dependent upon the client thread during its setup routine."""
338 self.server_ready.set()
339
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340 def _setUp(self):
Hai Shie80697d2020-05-28 06:10:27 +0800341 self.wait_threads = threading_helper.wait_threads_exit()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700342 self.wait_threads.__enter__()
343
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000344 self.server_ready = threading.Event()
345 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000346 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000347 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200348 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349
350 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000351 methodname = self.id()
352 i = methodname.rfind('.')
353 methodname = methodname[i+1:]
354 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000355 self.client_thread = thread.start_new_thread(
356 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200358 try:
359 self.__setUp()
360 except:
361 self.server_crashed = True
362 raise
363 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000364 self.server_ready.set()
365 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366
367 def _tearDown(self):
368 self.__tearDown()
369 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700370 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000371
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000372 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000373 exc = self.queue.get()
374 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375
376 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000377 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100378 try:
379 self.clientSetUp()
380 except BaseException as e:
381 self.queue.put(e)
382 self.clientTearDown()
383 return
384 finally:
385 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200386 if self.server_crashed:
387 self.clientTearDown()
388 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000389 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000390 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 try:
392 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000393 except BaseException as e:
394 self.queue.put(e)
395 finally:
396 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000397
398 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000399 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000400
401 def clientTearDown(self):
402 self.done.set()
403 thread.exit()
404
405class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
406
407 def __init__(self, methodName='runTest'):
408 SocketTCPTest.__init__(self, methodName=methodName)
409 ThreadableTest.__init__(self)
410
411 def clientSetUp(self):
412 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
413
414 def clientTearDown(self):
415 self.cli.close()
416 self.cli = None
417 ThreadableTest.clientTearDown(self)
418
419class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
420
421 def __init__(self, methodName='runTest'):
422 SocketUDPTest.__init__(self, methodName=methodName)
423 ThreadableTest.__init__(self)
424
425 def clientSetUp(self):
426 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
427
Brian Curtin3beb38f2010-11-04 03:41:43 +0000428 def clientTearDown(self):
429 self.cli.close()
430 self.cli = None
431 ThreadableTest.clientTearDown(self)
432
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700433@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
434 'UDPLITE sockets required for this test.')
435class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
436
437 def __init__(self, methodName='runTest'):
438 SocketUDPLITETest.__init__(self, methodName=methodName)
439 ThreadableTest.__init__(self)
440
441 def clientSetUp(self):
442 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
443
444 def clientTearDown(self):
445 self.cli.close()
446 self.cli = None
447 ThreadableTest.clientTearDown(self)
448
Charles-François Natali47413c12011-10-06 19:47:44 +0200449class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
450
451 def __init__(self, methodName='runTest'):
452 SocketCANTest.__init__(self, methodName=methodName)
453 ThreadableTest.__init__(self)
454
455 def clientSetUp(self):
456 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
457 try:
458 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200459 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200460 # skipTest should not be called here, and will be called in the
461 # server instead
462 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200463
464 def clientTearDown(self):
465 self.cli.close()
466 self.cli = None
467 ThreadableTest.clientTearDown(self)
468
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100469class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
470
471 def __init__(self, methodName='runTest'):
472 SocketRDSTest.__init__(self, methodName=methodName)
473 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100474
475 def clientSetUp(self):
476 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
477 try:
478 # RDS sockets must be bound explicitly to send or receive data
479 self.cli.bind((HOST, 0))
480 self.cli_addr = self.cli.getsockname()
481 except OSError:
482 # skipTest should not be called here, and will be called in the
483 # server instead
484 pass
485
486 def clientTearDown(self):
487 self.cli.close()
488 self.cli = None
489 ThreadableTest.clientTearDown(self)
490
caaveryeffc12f2017-09-06 18:18:10 -0400491@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400492@unittest.skipUnless(HAVE_SOCKET_VSOCK,
493 'VSOCK sockets required for this test.')
494@unittest.skipUnless(get_cid() != 2,
495 "This test can only be run on a virtual guest.")
496class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
497
498 def __init__(self, methodName='runTest'):
499 unittest.TestCase.__init__(self, methodName=methodName)
500 ThreadableTest.__init__(self)
501
502 def setUp(self):
503 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
504 self.addCleanup(self.serv.close)
505 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
506 self.serv.listen()
507 self.serverExplicitReady()
508 self.conn, self.connaddr = self.serv.accept()
509 self.addCleanup(self.conn.close)
510
511 def clientSetUp(self):
512 time.sleep(0.1)
513 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
514 self.addCleanup(self.cli.close)
515 cid = get_cid()
516 self.cli.connect((cid, VSOCKPORT))
517
518 def testStream(self):
519 msg = self.conn.recv(1024)
520 self.assertEqual(msg, MSG)
521
522 def _testStream(self):
523 self.cli.send(MSG)
524 self.cli.close()
525
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000527 """Socket tests for client-server connection.
528
529 self.cli_conn is a client socket connected to the server. The
530 setUp() method guarantees that it is connected to the server.
531 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def __init__(self, methodName='runTest'):
534 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
535
536 def setUp(self):
537 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000538 # Indicate explicitly we're ready for the client thread to
539 # proceed and then perform the blocking call to accept
540 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000541 conn, addr = self.serv.accept()
542 self.cli_conn = conn
543
544 def tearDown(self):
545 self.cli_conn.close()
546 self.cli_conn = None
547 ThreadedTCPSocketTest.tearDown(self)
548
549 def clientSetUp(self):
550 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000551 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552 self.serv_conn = self.cli
553
554 def clientTearDown(self):
555 self.serv_conn.close()
556 self.serv_conn = None
557 ThreadedTCPSocketTest.clientTearDown(self)
558
Dave Cole331708b2004-08-09 04:51:41 +0000559class SocketPairTest(unittest.TestCase, ThreadableTest):
560
561 def __init__(self, methodName='runTest'):
562 unittest.TestCase.__init__(self, methodName=methodName)
563 ThreadableTest.__init__(self)
564
565 def setUp(self):
566 self.serv, self.cli = socket.socketpair()
567
568 def tearDown(self):
569 self.serv.close()
570 self.serv = None
571
572 def clientSetUp(self):
573 pass
574
575 def clientTearDown(self):
576 self.cli.close()
577 self.cli = None
578 ThreadableTest.clientTearDown(self)
579
Tim Peters494aaee2004-08-09 18:54:11 +0000580
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000581# The following classes are used by the sendmsg()/recvmsg() tests.
582# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
583# gives a drop-in replacement for SocketConnectedTest, but different
584# address families can be used, and the attributes serv_addr and
585# cli_addr will be set to the addresses of the endpoints.
586
587class SocketTestBase(unittest.TestCase):
588 """A base class for socket tests.
589
590 Subclasses must provide methods newSocket() to return a new socket
591 and bindSock(sock) to bind it to an unused address.
592
593 Creates a socket self.serv and sets self.serv_addr to its address.
594 """
595
596 def setUp(self):
597 self.serv = self.newSocket()
598 self.bindServer()
599
600 def bindServer(self):
601 """Bind server socket and set self.serv_addr to its address."""
602 self.bindSock(self.serv)
603 self.serv_addr = self.serv.getsockname()
604
605 def tearDown(self):
606 self.serv.close()
607 self.serv = None
608
609
610class SocketListeningTestMixin(SocketTestBase):
611 """Mixin to listen on the server socket."""
612
613 def setUp(self):
614 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100615 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000616
617
618class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
619 ThreadableTest):
620 """Mixin to add client socket and allow client/server tests.
621
622 Client socket is self.cli and its address is self.cli_addr. See
623 ThreadableTest for usage information.
624 """
625
626 def __init__(self, *args, **kwargs):
627 super().__init__(*args, **kwargs)
628 ThreadableTest.__init__(self)
629
630 def clientSetUp(self):
631 self.cli = self.newClientSocket()
632 self.bindClient()
633
634 def newClientSocket(self):
635 """Return a new socket for use as client."""
636 return self.newSocket()
637
638 def bindClient(self):
639 """Bind client socket and set self.cli_addr to its address."""
640 self.bindSock(self.cli)
641 self.cli_addr = self.cli.getsockname()
642
643 def clientTearDown(self):
644 self.cli.close()
645 self.cli = None
646 ThreadableTest.clientTearDown(self)
647
648
649class ConnectedStreamTestMixin(SocketListeningTestMixin,
650 ThreadedSocketTestMixin):
651 """Mixin to allow client/server stream tests with connected client.
652
653 Server's socket representing connection to client is self.cli_conn
654 and client's connection to server is self.serv_conn. (Based on
655 SocketConnectedTest.)
656 """
657
658 def setUp(self):
659 super().setUp()
660 # Indicate explicitly we're ready for the client thread to
661 # proceed and then perform the blocking call to accept
662 self.serverExplicitReady()
663 conn, addr = self.serv.accept()
664 self.cli_conn = conn
665
666 def tearDown(self):
667 self.cli_conn.close()
668 self.cli_conn = None
669 super().tearDown()
670
671 def clientSetUp(self):
672 super().clientSetUp()
673 self.cli.connect(self.serv_addr)
674 self.serv_conn = self.cli
675
676 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100677 try:
678 self.serv_conn.close()
679 self.serv_conn = None
680 except AttributeError:
681 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000682 super().clientTearDown()
683
684
685class UnixSocketTestBase(SocketTestBase):
686 """Base class for Unix-domain socket tests."""
687
688 # This class is used for file descriptor passing tests, so we
689 # create the sockets in a private directory so that other users
690 # can't send anything that might be problematic for a privileged
691 # user running the tests.
692
693 def setUp(self):
694 self.dir_path = tempfile.mkdtemp()
695 self.addCleanup(os.rmdir, self.dir_path)
696 super().setUp()
697
698 def bindSock(self, sock):
699 path = tempfile.mktemp(dir=self.dir_path)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300700 socket_helper.bind_unix_socket(sock, path)
Hai Shideb01622020-07-06 20:29:49 +0800701 self.addCleanup(os_helper.unlink, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000702
703class UnixStreamBase(UnixSocketTestBase):
704 """Base class for Unix-domain SOCK_STREAM tests."""
705
706 def newSocket(self):
707 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
708
709
710class InetTestBase(SocketTestBase):
711 """Base class for IPv4 socket tests."""
712
713 host = HOST
714
715 def setUp(self):
716 super().setUp()
717 self.port = self.serv_addr[1]
718
719 def bindSock(self, sock):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300720 socket_helper.bind_port(sock, host=self.host)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000721
722class TCPTestBase(InetTestBase):
723 """Base class for TCP-over-IPv4 tests."""
724
725 def newSocket(self):
726 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
727
728class UDPTestBase(InetTestBase):
729 """Base class for UDP-over-IPv4 tests."""
730
731 def newSocket(self):
732 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
733
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700734class UDPLITETestBase(InetTestBase):
735 """Base class for UDPLITE-over-IPv4 tests."""
736
737 def newSocket(self):
738 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
739
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000740class SCTPStreamBase(InetTestBase):
741 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
742
743 def newSocket(self):
744 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
745 socket.IPPROTO_SCTP)
746
747
748class Inet6TestBase(InetTestBase):
749 """Base class for IPv6 socket tests."""
750
Serhiy Storchaka16994912020-04-25 10:06:29 +0300751 host = socket_helper.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000752
753class UDP6TestBase(Inet6TestBase):
754 """Base class for UDP-over-IPv6 tests."""
755
756 def newSocket(self):
757 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
758
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700759class UDPLITE6TestBase(Inet6TestBase):
760 """Base class for UDPLITE-over-IPv6 tests."""
761
762 def newSocket(self):
763 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
764
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000765
766# Test-skipping decorators for use with ThreadableTest.
767
768def skipWithClientIf(condition, reason):
769 """Skip decorated test if condition is true, add client_skip decorator.
770
771 If the decorated object is not a class, sets its attribute
772 "client_skip" to a decorator which will return an empty function
773 if the test is to be skipped, or the original function if it is
774 not. This can be used to avoid running the client part of a
775 skipped test when using ThreadableTest.
776 """
777 def client_pass(*args, **kwargs):
778 pass
779 def skipdec(obj):
780 retval = unittest.skip(reason)(obj)
781 if not isinstance(obj, type):
782 retval.client_skip = lambda f: client_pass
783 return retval
784 def noskipdec(obj):
785 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
786 obj.client_skip = lambda f: f
787 return obj
788 return skipdec if condition else noskipdec
789
790
791def requireAttrs(obj, *attributes):
792 """Skip decorated test if obj is missing any of the given attributes.
793
794 Sets client_skip attribute as skipWithClientIf() does.
795 """
796 missing = [name for name in attributes if not hasattr(obj, name)]
797 return skipWithClientIf(
798 missing, "don't have " + ", ".join(name for name in missing))
799
800
801def requireSocket(*args):
802 """Skip decorated test if a socket cannot be created with given arguments.
803
804 When an argument is given as a string, will use the value of that
805 attribute of the socket module, or skip the test if it doesn't
806 exist. Sets client_skip attribute as skipWithClientIf() does.
807 """
808 err = None
809 missing = [obj for obj in args if
810 isinstance(obj, str) and not hasattr(socket, obj)]
811 if missing:
812 err = "don't have " + ", ".join(name for name in missing)
813 else:
814 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
815 for obj in args]
816 try:
817 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200818 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000819 # XXX: check errno?
820 err = str(e)
821 else:
822 s.close()
823 return skipWithClientIf(
824 err is not None,
825 "can't create socket({0}): {1}".format(
826 ", ".join(str(o) for o in args), err))
827
828
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829#######################################################################
830## Begin Tests
831
832class GeneralModuleTests(unittest.TestCase):
833
Ethan Furman7184bac2014-10-14 18:56:53 -0700834 def test_SocketType_is_socketobject(self):
835 import _socket
836 self.assertTrue(socket.SocketType is _socket.socket)
837 s = socket.socket()
838 self.assertIsInstance(s, socket.SocketType)
839 s.close()
840
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000841 def test_repr(self):
842 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200843 with s:
844 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000845 self.assertIn('family=%s' % socket.AF_INET, repr(s))
846 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200847 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200848 self.assertNotIn('raddr', repr(s))
849 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200850 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200851 self.assertIn(str(s.getsockname()), repr(s))
852 self.assertIn('[closed]', repr(s))
853 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000854
Victor Stinnere254e532014-07-26 14:36:55 +0200855 @unittest.skipUnless(_socket is not None, 'need _socket module')
856 def test_csocket_repr(self):
857 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
858 try:
859 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
860 % (s.fileno(), s.family, s.type, s.proto))
861 self.assertEqual(repr(s), expected)
862 finally:
863 s.close()
864 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
865 % (s.family, s.type, s.proto))
866 self.assertEqual(repr(s), expected)
867
Raymond Hettinger027bb632004-05-31 03:09:25 +0000868 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200869 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
870 p = proxy(s)
871 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000872 s = None
873 try:
874 p.fileno()
875 except ReferenceError:
876 pass
877 else:
878 self.fail('Socket proxy still exists')
879
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000881 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300882 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200883 with self.assertRaises(OSError, msg=msg % 'OSError'):
884 raise OSError
885 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200887 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889
Ezio Melotti63e42302011-05-07 19:47:48 +0300890 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000891 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300892 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
893 self.addCleanup(s.close)
894 s.bind(('', 0))
895 sockname = s.getsockname()
896 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300897 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300898 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300899 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400900 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300901 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300902 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300903 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400904 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300905 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300906 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300907 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300908 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300909 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300910 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300911 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400912 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300913 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300914 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300915 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400916 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300917 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300918 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300919 self.assertIn('not NoneType', str(cm.exception))
920 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300921 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300922 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300923 s.sendto(b'foo', None, None)
924 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300925 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300926 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300927 self.assertIn('(1 given)', str(cm.exception))
928 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300929 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300930 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300931
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100935 if socket.has_ipv6:
936 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 socket.SOCK_STREAM
938 socket.SOCK_DGRAM
939 socket.SOCK_RAW
940 socket.SOCK_RDM
941 socket.SOCK_SEQPACKET
942 socket.SOL_SOCKET
943 socket.SO_REUSEADDR
944
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100945 def testCrucialIpProtoConstants(self):
946 socket.IPPROTO_TCP
947 socket.IPPROTO_UDP
948 if socket.has_ipv6:
949 socket.IPPROTO_IPV6
950
951 @unittest.skipUnless(os.name == "nt", "Windows specific")
952 def testWindowsSpecificConstants(self):
953 socket.IPPROTO_ICLFXBM
954 socket.IPPROTO_ST
955 socket.IPPROTO_CBT
956 socket.IPPROTO_IGP
957 socket.IPPROTO_RDP
958 socket.IPPROTO_PGM
959 socket.IPPROTO_L2TP
960 socket.IPPROTO_SCTP
961
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +0200962 @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
963 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
964 def test3542SocketOptions(self):
965 # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542
966 opts = {
967 'IPV6_CHECKSUM',
968 'IPV6_DONTFRAG',
969 'IPV6_DSTOPTS',
970 'IPV6_HOPLIMIT',
971 'IPV6_HOPOPTS',
972 'IPV6_NEXTHOP',
973 'IPV6_PATHMTU',
974 'IPV6_PKTINFO',
975 'IPV6_RECVDSTOPTS',
976 'IPV6_RECVHOPLIMIT',
977 'IPV6_RECVHOPOPTS',
978 'IPV6_RECVPATHMTU',
979 'IPV6_RECVPKTINFO',
980 'IPV6_RECVRTHDR',
981 'IPV6_RECVTCLASS',
982 'IPV6_RTHDR',
983 'IPV6_RTHDRDSTOPTS',
984 'IPV6_RTHDR_TYPE_0',
985 'IPV6_TCLASS',
986 'IPV6_USE_MIN_MTU',
987 }
988 for opt in opts:
989 self.assertTrue(
990 hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'"
991 )
992
Guido van Rossum654c11e2002-06-13 20:24:17 +0000993 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000994 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000995 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000996 try:
997 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200998 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000999 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001000 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001001 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +00001002 try:
1003 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001004 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +00001005 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001006 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +00001007 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001008 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +00001009 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001010 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001011
Charles-François Natali0cc86852013-09-13 19:53:08 +02001012 def test_host_resolution(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03001013 for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014 self.assertEqual(socket.gethostbyname(addr), addr)
1015
Serhiy Storchaka16994912020-04-25 10:06:29 +03001016 # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have
Charles-François Natali0cc86852013-09-13 19:53:08 +02001017 # a matching name entry (e.g. 'ip6-localhost')
Serhiy Storchaka16994912020-04-25 10:06:29 +03001018 for host in [socket_helper.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001019 self.assertIn(host, socket.gethostbyaddr(host)[2])
1020
Xiang Zhangd36a7162017-03-07 11:06:09 +08001021 def test_host_resolution_bad_address(self):
1022 # These are all malformed IP addresses and expected not to resolve to
1023 # any result. But some ISPs, e.g. AWS, may successfully resolve these
1024 # IPs.
1025 explanation = (
1026 "resolving an invalid IP address did not raise OSError; "
1027 "can be caused by a broken DNS server"
1028 )
1029 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
1030 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -04001031 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +08001032 socket.gethostbyname(addr)
1033 with self.assertRaises(OSError, msg=explanation):
1034 socket.gethostbyaddr(addr)
1035
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001036 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
1037 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
1038 def test_sethostname(self):
1039 oldhn = socket.gethostname()
1040 try:
1041 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001042 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001043 if e.errno == errno.EPERM:
1044 self.skipTest("test should be run as root")
1045 else:
1046 raise
1047 try:
1048 # running test as root!
1049 self.assertEqual(socket.gethostname(), 'new')
1050 # Should work with bytes objects too
1051 socket.sethostname(b'bar')
1052 self.assertEqual(socket.gethostname(), 'bar')
1053 finally:
1054 socket.sethostname(oldhn)
1055
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001056 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1057 'socket.if_nameindex() not available.')
1058 def testInterfaceNameIndex(self):
1059 interfaces = socket.if_nameindex()
1060 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001061 self.assertIsInstance(index, int)
1062 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001063 # interface indices are non-zero integers
1064 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001065 _index = socket.if_nametoindex(name)
1066 self.assertIsInstance(_index, int)
1067 self.assertEqual(index, _index)
1068 _name = socket.if_indextoname(index)
1069 self.assertIsInstance(_name, str)
1070 self.assertEqual(name, _name)
1071
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001072 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1073 'socket.if_indextoname() not available.')
1074 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001075 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001076 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001077
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001078 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1079 'socket.if_nametoindex() not available.')
1080 def testInvalidInterfaceNameToIndex(self):
1081 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1082 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1083
Serhiy Storchaka43767632013-11-03 21:31:38 +02001084 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1085 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001086 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001087 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001088 try:
1089 # On some versions, this loses a reference
1090 orig = sys.getrefcount(__name__)
1091 socket.getnameinfo(__name__,0)
1092 except TypeError:
1093 if sys.getrefcount(__name__) != orig:
1094 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001095
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001097 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 try:
1099 # On some versions, this crashes the interpreter.
1100 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001101 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001102 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001103
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001104 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001105 # This just checks that htons etc. are their own inverse,
1106 # when looking at the lower 16 or 32 bits.
1107 sizes = {socket.htonl: 32, socket.ntohl: 32,
1108 socket.htons: 16, socket.ntohs: 16}
1109 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001110 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001111 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1112 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001113
Guido van Rossuma2627af2002-09-14 00:58:46 +00001114 swapped = func(mask)
1115 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001116 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001117
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001118 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001119 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001120 import _testcapi
1121 s_good_values = [0, 1, 2, 0xffff]
1122 l_good_values = s_good_values + [0xffffffff]
1123 l_bad_values = [-1, -2, 1<<32, 1<<1000]
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01001124 s_bad_values = (
1125 l_bad_values +
1126 [_testcapi.INT_MIN-1, _testcapi.INT_MAX+1] +
1127 [1 << 16, _testcapi.INT_MAX]
1128 )
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001129 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001130 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001131 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001132 for k in l_good_values:
1133 socket.ntohl(k)
1134 socket.htonl(k)
1135 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001136 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001137 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001138 for k in l_bad_values:
1139 self.assertRaises(OverflowError, socket.ntohl, k)
1140 self.assertRaises(OverflowError, socket.htonl, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001141
Barry Warsaw11b91a02004-06-28 00:50:43 +00001142 def testGetServBy(self):
1143 eq = self.assertEqual
1144 # Find one service that exists, then check all the related interfaces.
1145 # I've ordered this by protocols that have both a tcp and udp
1146 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001147 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001148 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001149 # avoid the 'echo' service on this platform, as there is an
1150 # assumption breaking non-standard port/protocol entry
1151 services = ('daytime', 'qotd', 'domain')
1152 else:
1153 services = ('echo', 'daytime', 'domain')
1154 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001155 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001156 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001157 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001158 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001159 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001160 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001161 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001162 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001163 # Issue #26936: Android getservbyname() was broken before API 23.
1164 if (not hasattr(sys, 'getandroidapilevel') or
1165 sys.getandroidapilevel() >= 23):
1166 port2 = socket.getservbyname(service)
1167 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001168 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001169 try:
1170 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001171 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001172 udpport = None
1173 else:
1174 eq(udpport, port)
1175 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001176 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001177 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001178 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001179 eq(socket.getservbyport(port, 'tcp'), service)
1180 if udpport is not None:
1181 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001182 # Make sure getservbyport does not accept out of range ports.
1183 self.assertRaises(OverflowError, socket.getservbyport, -1)
1184 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001186 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001187 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001188 # The default timeout should initially be None
1189 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001190 with socket.socket() as s:
1191 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001192
1193 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001194 with socket_setdefaulttimeout(10):
1195 self.assertEqual(socket.getdefaulttimeout(), 10)
1196 with socket.socket() as sock:
1197 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001198
Victor Stinner304315d2018-11-30 13:22:44 +01001199 # Reset the default timeout to None, and see if it propagates
1200 socket.setdefaulttimeout(None)
1201 self.assertEqual(socket.getdefaulttimeout(), None)
1202 with socket.socket() as sock:
1203 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001204
1205 # Check that setting it to an invalid value raises ValueError
1206 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1207
1208 # Check that setting it to an invalid type raises TypeError
1209 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1210
Serhiy Storchaka43767632013-11-03 21:31:38 +02001211 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1212 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001213 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001214 # Test that issue1008086 and issue767150 are fixed.
1215 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001216 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1217 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001218
Serhiy Storchaka43767632013-11-03 21:31:38 +02001219 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1220 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001221 def testIPv4toString(self):
1222 from socket import inet_aton as f, inet_pton, AF_INET
1223 g = lambda a: inet_pton(AF_INET, a)
1224
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001225 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001226 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001227 )
1228
Ezio Melottib3aedd42010-11-20 19:04:17 +00001229 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1230 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1231 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1232 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1233 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001234 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001235 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001236 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001237 assertInvalid(f, '300.0.0.0')
1238 assertInvalid(f, 'a.0.0.0')
1239 assertInvalid(f, '1.2.3.4.5')
1240 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001241
Ezio Melottib3aedd42010-11-20 19:04:17 +00001242 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1243 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1244 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1245 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001246 assertInvalid(g, '0.0.0.')
1247 assertInvalid(g, '300.0.0.0')
1248 assertInvalid(g, 'a.0.0.0')
1249 assertInvalid(g, '1.2.3.4.5')
1250 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001251
Serhiy Storchaka43767632013-11-03 21:31:38 +02001252 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1253 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001254 def testIPv6toString(self):
1255 try:
1256 from socket import inet_pton, AF_INET6, has_ipv6
1257 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001258 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001259 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001260 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001261
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001262 if sys.platform == "win32":
1263 try:
1264 inet_pton(AF_INET6, '::')
1265 except OSError as e:
1266 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001267 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001268
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001269 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001270 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001271 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001272 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001273
Ezio Melottib3aedd42010-11-20 19:04:17 +00001274 self.assertEqual(b'\x00' * 16, f('::'))
1275 self.assertEqual(b'\x00' * 16, f('0::0'))
1276 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1277 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001278 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001279 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1280 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001281 self.assertEqual(
1282 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1283 f('ad42:abc::127:0:254:2')
1284 )
1285 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1286 assertInvalid('0x20::')
1287 assertInvalid(':::')
1288 assertInvalid('::0::')
1289 assertInvalid('1::abc::')
1290 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001291 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001292 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001293 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001294 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001295 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001296 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001297
1298 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1299 f('::254.42.23.64')
1300 )
1301 self.assertEqual(
1302 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1303 f('42::a29b:254.42.23.64')
1304 )
1305 self.assertEqual(
1306 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1307 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1308 )
1309 assertInvalid('255.254.253.252')
1310 assertInvalid('1::260.2.3.0')
1311 assertInvalid('1::0.be.e.0')
1312 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1313 assertInvalid('::1.2.3.4:0')
1314 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001315
Serhiy Storchaka43767632013-11-03 21:31:38 +02001316 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1317 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001318 def testStringToIPv4(self):
1319 from socket import inet_ntoa as f, inet_ntop, AF_INET
1320 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001321 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001322 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001323 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001324
Ezio Melottib3aedd42010-11-20 19:04:17 +00001325 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1326 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1327 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1328 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001329 assertInvalid(f, b'\x00' * 3)
1330 assertInvalid(f, b'\x00' * 5)
1331 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001332 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001333
Ezio Melottib3aedd42010-11-20 19:04:17 +00001334 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1335 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1336 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001337 assertInvalid(g, b'\x00' * 3)
1338 assertInvalid(g, b'\x00' * 5)
1339 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001340 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001341
Serhiy Storchaka43767632013-11-03 21:31:38 +02001342 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1343 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001344 def testStringToIPv6(self):
1345 try:
1346 from socket import inet_ntop, AF_INET6, has_ipv6
1347 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001348 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001349 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001350 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001351
1352 if sys.platform == "win32":
1353 try:
1354 inet_ntop(AF_INET6, b'\x00' * 16)
1355 except OSError as e:
1356 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001357 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001358
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001359 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001360 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001361 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001362 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001363
Ezio Melottib3aedd42010-11-20 19:04:17 +00001364 self.assertEqual('::', f(b'\x00' * 16))
1365 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1366 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001367 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001368 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001369 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001370 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001371
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001372 assertInvalid(b'\x12' * 15)
1373 assertInvalid(b'\x12' * 17)
1374 assertInvalid(b'\x12' * 4)
1375
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001376 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001377
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001378 def testSockName(self):
1379 # Testing getsockname()
Serhiy Storchaka16994912020-04-25 10:06:29 +03001380 port = socket_helper.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001381 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001382 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001383 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001384 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001385 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1386 # it reasonable to get the host's addr in addition to 0.0.0.0.
1387 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001388 try:
1389 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001390 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001391 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001392 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001393 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001394 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001395
1396 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001397 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001398 # We know a socket should start without reuse==0
1399 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001400 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001401 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001402 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001403
1404 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001405 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001406 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001407 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001408 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1409 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001410 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001411
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001412 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001413 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001414 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1415 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001416 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001417
Martin Panter50ab1a32016-04-11 00:38:12 +00001418 def testCloseException(self):
1419 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001420 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001421 socket.socket(fileno=sock.fileno()).close()
1422 try:
1423 sock.close()
1424 except OSError as err:
1425 # Winsock apparently raises ENOTSOCK
1426 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1427 else:
1428 self.fail("close() should raise EBADF/ENOTSOCK")
1429
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001430 def testNewAttributes(self):
1431 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001432
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001433 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1434 self.assertEqual(sock.family, socket.AF_INET)
1435 if hasattr(socket, 'SOCK_CLOEXEC'):
1436 self.assertIn(sock.type,
1437 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1438 socket.SOCK_STREAM))
1439 else:
1440 self.assertEqual(sock.type, socket.SOCK_STREAM)
1441 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001442
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001443 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001444 sock = socket.socket()
1445 self.addCleanup(sock.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001446 port = socket_helper.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001447 big_port = port + 65536
1448 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001449 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1450 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1451 # Since find_unused_port() is inherently subject to race conditions, we
1452 # call it a couple times if necessary.
1453 for i in itertools.count():
Serhiy Storchaka16994912020-04-25 10:06:29 +03001454 port = socket_helper.find_unused_port()
Charles-François Natali65708cf2014-07-25 18:44:30 +01001455 try:
1456 sock.bind((HOST, port))
1457 except OSError as e:
1458 if e.errno != errno.EADDRINUSE or i == 5:
1459 raise
1460 else:
1461 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001462
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001463 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001464 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001465 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1466 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1467 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1468 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001469 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1470 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001471 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001472 self.assertRaises(ValueError, s.ioctl, -1, None)
1473 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001474
Steve Dowerea93ac02016-06-17 12:52:18 -07001475 @unittest.skipUnless(os.name == "nt", "Windows specific")
1476 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1477 'Loopback fast path support required for this test')
1478 def test_sio_loopback_fast_path(self):
1479 s = socket.socket()
1480 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001481 try:
1482 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1483 except OSError as exc:
1484 WSAEOPNOTSUPP = 10045
1485 if exc.winerror == WSAEOPNOTSUPP:
1486 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1487 "doesn't implemented in this Windows version")
1488 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001489 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1490
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001491 def testGetaddrinfo(self):
1492 try:
1493 socket.getaddrinfo('localhost', 80)
1494 except socket.gaierror as err:
1495 if err.errno == socket.EAI_SERVICE:
1496 # see http://bugs.python.org/issue1282647
1497 self.skipTest("buggy libc version")
1498 raise
1499 # len of every sequence is supposed to be == 5
1500 for info in socket.getaddrinfo(HOST, None):
1501 self.assertEqual(len(info), 5)
1502 # host can be a domain name, a string representation of an
1503 # IPv4/v6 address or None
1504 socket.getaddrinfo('localhost', 80)
1505 socket.getaddrinfo('127.0.0.1', 80)
1506 socket.getaddrinfo(None, 80)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001507 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001508 socket.getaddrinfo('::1', 80)
1509 # port can be a string service name such as "http", a numeric
1510 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001511 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1512 if (not hasattr(sys, 'getandroidapilevel') or
1513 sys.getandroidapilevel() >= 23):
1514 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001515 socket.getaddrinfo(HOST, 80)
1516 socket.getaddrinfo(HOST, None)
1517 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001518 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1519 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001520 self.assertEqual(family, socket.AF_INET)
Ethan Furmanb7751062021-03-30 21:17:26 -07001521 self.assertEqual(str(family), 'AF_INET')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001522 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furmanb7751062021-03-30 21:17:26 -07001523 self.assertEqual(str(type), 'SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001524 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1525 for _, socktype, _, _, _ in infos:
1526 self.assertEqual(socktype, socket.SOCK_STREAM)
1527 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001528 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001529 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1530 # a server willing to support both IPv4 and IPv6 will
1531 # usually do this
1532 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1533 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001534 # test keyword arguments
1535 a = socket.getaddrinfo(HOST, None)
1536 b = socket.getaddrinfo(host=HOST, port=None)
1537 self.assertEqual(a, b)
1538 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1539 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1540 self.assertEqual(a, b)
1541 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1542 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1543 self.assertEqual(a, b)
1544 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1545 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1546 self.assertEqual(a, b)
1547 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1548 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1549 self.assertEqual(a, b)
1550 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1551 socket.AI_PASSIVE)
1552 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1553 type=socket.SOCK_STREAM, proto=0,
1554 flags=socket.AI_PASSIVE)
1555 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001556 # Issue #6697.
1557 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001558
Ned Deilyb24f4812014-02-13 22:50:42 -08001559 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001560 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001561 try:
1562 # The arguments here are undefined and the call may succeed
1563 # or fail. All we care here is that it doesn't segfault.
1564 socket.getaddrinfo("localhost", None, 0, 0, 0,
1565 socket.AI_NUMERICSERV)
1566 except socket.gaierror:
1567 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001568
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001569 def test_getnameinfo(self):
1570 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001571 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001572
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001573 @unittest.skipUnless(support.is_resource_enabled('network'),
1574 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001575 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001576 # Check for internet access before running test
1577 # (issue #12804, issue #25138).
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03001578 with socket_helper.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001579 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001580
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001581 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001582 domain = 'испытание.pythontest.net'
1583 socket.gethostbyname(domain)
1584 socket.gethostbyname_ex(domain)
1585 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001586 # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001587 # have a reverse entry yet
1588 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001589
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001590 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001591 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001592 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1593 self.skipTest("signal.alarm and socket.socketpair required for this test")
1594 # Our signal handlers clobber the C errno by calling a math function
1595 # with an invalid domain value.
1596 def ok_handler(*args):
1597 self.assertRaises(ValueError, math.acosh, 0)
1598 def raising_handler(*args):
1599 self.assertRaises(ValueError, math.acosh, 0)
1600 1 // 0
1601 c, s = socket.socketpair()
1602 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1603 try:
1604 if with_timeout:
1605 # Just above the one second minimum for signal.alarm
1606 c.settimeout(1.5)
1607 with self.assertRaises(ZeroDivisionError):
1608 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001609 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001610 if with_timeout:
1611 signal.signal(signal.SIGALRM, ok_handler)
1612 signal.alarm(1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01001613 self.assertRaises(TimeoutError, c.sendall,
Charles-François Natali5fd26422013-08-29 19:01:40 +02001614 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001615 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001616 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001617 signal.signal(signal.SIGALRM, old_alarm)
1618 c.close()
1619 s.close()
1620
1621 def test_sendall_interrupted(self):
1622 self.check_sendall_interrupted(False)
1623
1624 def test_sendall_interrupted_with_timeout(self):
1625 self.check_sendall_interrupted(True)
1626
Antoine Pitroue033e062010-10-29 10:38:18 +00001627 def test_dealloc_warn(self):
1628 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1629 r = repr(sock)
1630 with self.assertWarns(ResourceWarning) as cm:
1631 sock = None
1632 support.gc_collect()
1633 self.assertIn(r, str(cm.warning.args[0]))
1634 # An open socket file object gets dereferenced after the socket
1635 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1636 f = sock.makefile('rb')
1637 r = repr(sock)
1638 sock = None
1639 support.gc_collect()
1640 with self.assertWarns(ResourceWarning):
1641 f = None
1642 support.gc_collect()
1643
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001644 def test_name_closed_socketio(self):
1645 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1646 fp = sock.makefile("rb")
1647 fp.close()
1648 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1649
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001650 def test_unusable_closed_socketio(self):
1651 with socket.socket() as sock:
1652 fp = sock.makefile("rb", buffering=0)
1653 self.assertTrue(fp.readable())
1654 self.assertFalse(fp.writable())
1655 self.assertFalse(fp.seekable())
1656 fp.close()
1657 self.assertRaises(ValueError, fp.readable)
1658 self.assertRaises(ValueError, fp.writable)
1659 self.assertRaises(ValueError, fp.seekable)
1660
Christian Heimesd0e31b92018-01-27 09:54:13 +01001661 def test_socket_close(self):
1662 sock = socket.socket()
1663 try:
1664 sock.bind((HOST, 0))
1665 socket.close(sock.fileno())
1666 with self.assertRaises(OSError):
1667 sock.listen(1)
1668 finally:
1669 with self.assertRaises(OSError):
1670 # sock.close() fails with EBADF
1671 sock.close()
1672 with self.assertRaises(TypeError):
1673 socket.close(None)
1674 with self.assertRaises(OSError):
1675 socket.close(-1)
1676
Berker Peksag3fe64d02016-02-18 17:34:00 +02001677 def test_makefile_mode(self):
1678 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1679 with self.subTest(mode=mode):
1680 with socket.socket() as sock:
Inada Naokicfe523b2021-04-27 13:16:28 +09001681 encoding = None if "b" in mode else "utf-8"
1682 with sock.makefile(mode, encoding=encoding) as fp:
Berker Peksag3fe64d02016-02-18 17:34:00 +02001683 self.assertEqual(fp.mode, mode)
1684
1685 def test_makefile_invalid_mode(self):
1686 for mode in 'rt', 'x', '+', 'a':
1687 with self.subTest(mode=mode):
1688 with socket.socket() as sock:
1689 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1690 sock.makefile(mode)
1691
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001692 def test_pickle(self):
1693 sock = socket.socket()
1694 with sock:
1695 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1696 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001697 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1698 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1699 self.assertEqual(family, socket.AF_INET)
1700 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1701 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001702
Serhiy Storchaka78980432013-01-15 01:12:17 +02001703 def test_listen_backlog(self):
1704 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001705 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1706 srv.bind((HOST, 0))
1707 srv.listen(backlog)
1708
1709 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001710 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001711 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001712
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001713 @support.cpython_only
1714 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001715 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001716 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001717 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1718 srv.bind((HOST, 0))
1719 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001720
Serhiy Storchaka16994912020-04-25 10:06:29 +03001721 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001722 def test_flowinfo(self):
1723 self.assertRaises(OverflowError, socket.getnameinfo,
Serhiy Storchaka16994912020-04-25 10:06:29 +03001724 (socket_helper.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001725 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03001726 self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001727
Serhiy Storchaka16994912020-04-25 10:06:29 +03001728 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001729 def test_getaddrinfo_ipv6_basic(self):
1730 ((*_, sockaddr),) = socket.getaddrinfo(
1731 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1732 1234, socket.AF_INET6,
1733 socket.SOCK_DGRAM,
1734 socket.IPPROTO_UDP
1735 )
1736 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1737
Serhiy Storchaka16994912020-04-25 10:06:29 +03001738 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001739 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001740 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
pxinwr64c8f812020-11-29 05:48:38 +08001741 @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
Коренберг Марк7766b962018-02-13 00:47:42 +05001742 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1743 # Just pick up any network interface (Linux, Mac OS X)
1744 (ifindex, test_interface) = socket.if_nameindex()[0]
1745 ((*_, sockaddr),) = socket.getaddrinfo(
1746 'ff02::1de:c0:face:8D%' + test_interface,
1747 1234, socket.AF_INET6,
1748 socket.SOCK_DGRAM,
1749 socket.IPPROTO_UDP
1750 )
1751 # Note missing interface name part in IPv6 address
1752 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1753
Serhiy Storchaka16994912020-04-25 10:06:29 +03001754 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001755 @unittest.skipUnless(
1756 sys.platform == 'win32',
1757 'Numeric scope id does not work or undocumented')
1758 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1759 # Also works on Linux and Mac OS X, but is not documented (?)
1760 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1761 ifindex = 42
1762 ((*_, sockaddr),) = socket.getaddrinfo(
1763 'ff02::1de:c0:face:8D%' + str(ifindex),
1764 1234, socket.AF_INET6,
1765 socket.SOCK_DGRAM,
1766 socket.IPPROTO_UDP
1767 )
1768 # Note missing interface name part in IPv6 address
1769 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1770
Serhiy Storchaka16994912020-04-25 10:06:29 +03001771 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001772 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001773 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
pxinwr64c8f812020-11-29 05:48:38 +08001774 @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
Коренберг Марк7766b962018-02-13 00:47:42 +05001775 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1776 # Just pick up any network interface.
1777 (ifindex, test_interface) = socket.if_nameindex()[0]
1778 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1779 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1780 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1781
Serhiy Storchaka16994912020-04-25 10:06:29 +03001782 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001783 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001784 'Numeric scope id does not work or undocumented')
1785 def test_getnameinfo_ipv6_scopeid_numeric(self):
1786 # Also works on Linux (undocumented), but does not work on Mac OS X
1787 # Windows and Linux allow nonexistent interface numbers here.
1788 ifindex = 42
1789 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1790 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1791 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1792
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001793 def test_str_for_enums(self):
1794 # Make sure that the AF_* and SOCK_* constants have enum-like string
1795 # reprs.
1796 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
Ethan Furmanb7751062021-03-30 21:17:26 -07001797 self.assertEqual(str(s.family), 'AF_INET')
1798 self.assertEqual(str(s.type), 'SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001799
Yury Selivanov98181422017-12-18 20:02:54 -05001800 def test_socket_consistent_sock_type(self):
1801 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1802 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1803 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1804
1805 with socket.socket(socket.AF_INET, sock_type) as s:
1806 self.assertEqual(s.type, socket.SOCK_STREAM)
1807 s.settimeout(1)
1808 self.assertEqual(s.type, socket.SOCK_STREAM)
1809 s.settimeout(0)
1810 self.assertEqual(s.type, socket.SOCK_STREAM)
1811 s.setblocking(True)
1812 self.assertEqual(s.type, socket.SOCK_STREAM)
1813 s.setblocking(False)
1814 self.assertEqual(s.type, socket.SOCK_STREAM)
1815
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001816 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001817 # Test that when created with a family that's not one of the known
1818 # AF_*/SOCK_* constants, socket.family just returns the number.
1819 #
1820 # To do this we fool socket.socket into believing it already has an
1821 # open fd because on this path it doesn't actually verify the family and
1822 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001823 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1824 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001825 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1826
1827 unknown_type = max(
1828 kind
1829 for name, kind in socket.SocketKind.__members__.items()
1830 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1831 ) + 1
1832
1833 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001834 family=unknown_family, type=unknown_type, proto=23,
1835 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001836 self.assertEqual(s.family, unknown_family)
1837 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001838 # some OS like macOS ignore proto
1839 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001840
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001841 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1842 def test__sendfile_use_sendfile(self):
1843 class File:
1844 def __init__(self, fd):
1845 self.fd = fd
1846
1847 def fileno(self):
1848 return self.fd
1849 with socket.socket() as sock:
1850 fd = os.open(os.curdir, os.O_RDONLY)
1851 os.close(fd)
1852 with self.assertRaises(socket._GiveupOnSendfile):
1853 sock._sendfile_use_sendfile(File(fd))
1854 with self.assertRaises(OverflowError):
1855 sock._sendfile_use_sendfile(File(2**1000))
1856 with self.assertRaises(TypeError):
1857 sock._sendfile_use_sendfile(File(None))
1858
Christian Heimesb6e43af2018-01-29 22:37:58 +01001859 def _test_socket_fileno(self, s, family, stype):
1860 self.assertEqual(s.family, family)
1861 self.assertEqual(s.type, stype)
1862
1863 fd = s.fileno()
1864 s2 = socket.socket(fileno=fd)
1865 self.addCleanup(s2.close)
1866 # detach old fd to avoid double close
1867 s.detach()
1868 self.assertEqual(s2.family, family)
1869 self.assertEqual(s2.type, stype)
1870 self.assertEqual(s2.fileno(), fd)
1871
1872 def test_socket_fileno(self):
1873 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1874 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001875 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001876 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1877
1878 if hasattr(socket, "SOCK_DGRAM"):
1879 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1880 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001881 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001882 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1883
Serhiy Storchaka16994912020-04-25 10:06:29 +03001884 if socket_helper.IPV6_ENABLED:
Christian Heimesb6e43af2018-01-29 22:37:58 +01001885 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1886 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001887 s.bind((socket_helper.HOSTv6, 0, 0, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001888 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1889
1890 if hasattr(socket, "AF_UNIX"):
1891 tmpdir = tempfile.mkdtemp()
1892 self.addCleanup(shutil.rmtree, tmpdir)
1893 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1894 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001895 try:
1896 s.bind(os.path.join(tmpdir, 'socket'))
1897 except PermissionError:
1898 pass
1899 else:
1900 self._test_socket_fileno(s, socket.AF_UNIX,
1901 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001902
Dima Tisneke9912702018-12-17 22:07:55 +09001903 def test_socket_fileno_rejects_float(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001904 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001905 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1906
1907 def test_socket_fileno_rejects_other_types(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001908 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001909 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1910
1911 def test_socket_fileno_rejects_invalid_socket(self):
1912 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1913 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1914
1915 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1916 def test_socket_fileno_rejects_negative(self):
1917 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1918 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1919
1920 def test_socket_fileno_requires_valid_fd(self):
1921 WSAENOTSOCK = 10038
1922 with self.assertRaises(OSError) as cm:
Hai Shideb01622020-07-06 20:29:49 +08001923 socket.socket(fileno=os_helper.make_bad_fd())
Dima Tisneke9912702018-12-17 22:07:55 +09001924 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1925
1926 with self.assertRaises(OSError) as cm:
1927 socket.socket(
1928 socket.AF_INET,
1929 socket.SOCK_STREAM,
Hai Shideb01622020-07-06 20:29:49 +08001930 fileno=os_helper.make_bad_fd())
Dima Tisneke9912702018-12-17 22:07:55 +09001931 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1932
1933 def test_socket_fileno_requires_socket_fd(self):
1934 with tempfile.NamedTemporaryFile() as afile:
1935 with self.assertRaises(OSError):
1936 socket.socket(fileno=afile.fileno())
1937
1938 with self.assertRaises(OSError) as cm:
1939 socket.socket(
1940 socket.AF_INET,
1941 socket.SOCK_STREAM,
1942 fileno=afile.fileno())
1943 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1944
Ethan Furmana02cb472021-04-21 10:20:44 -07001945 def test_addressfamily_enum(self):
1946 import _socket, enum
1947 CheckedAddressFamily = enum._old_convert_(
1948 enum.IntEnum, 'AddressFamily', 'socket',
1949 lambda C: C.isupper() and C.startswith('AF_'),
1950 source=_socket,
1951 )
1952 enum._test_simple_enum(CheckedAddressFamily, socket.AddressFamily)
1953
1954 def test_socketkind_enum(self):
1955 import _socket, enum
1956 CheckedSocketKind = enum._old_convert_(
1957 enum.IntEnum, 'SocketKind', 'socket',
1958 lambda C: C.isupper() and C.startswith('SOCK_'),
1959 source=_socket,
1960 )
1961 enum._test_simple_enum(CheckedSocketKind, socket.SocketKind)
1962
1963 def test_msgflag_enum(self):
1964 import _socket, enum
1965 CheckedMsgFlag = enum._old_convert_(
1966 enum.IntFlag, 'MsgFlag', 'socket',
1967 lambda C: C.isupper() and C.startswith('MSG_'),
1968 source=_socket,
1969 )
1970 enum._test_simple_enum(CheckedMsgFlag, socket.MsgFlag)
1971
1972 def test_addressinfo_enum(self):
1973 import _socket, enum
1974 CheckedAddressInfo = enum._old_convert_(
1975 enum.IntFlag, 'AddressInfo', 'socket',
1976 lambda C: C.isupper() and C.startswith('AI_'),
1977 source=_socket)
1978 enum._test_simple_enum(CheckedAddressInfo, socket.AddressInfo)
1979
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001980
Charles-François Natali47413c12011-10-06 19:47:44 +02001981@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1982class BasicCANTest(unittest.TestCase):
1983
1984 def testCrucialConstants(self):
1985 socket.AF_CAN
1986 socket.PF_CAN
1987 socket.CAN_RAW
1988
Charles-François Natali773e42d2013-02-05 19:42:01 +01001989 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1990 'socket.CAN_BCM required for this test.')
1991 def testBCMConstants(self):
1992 socket.CAN_BCM
1993
1994 # opcodes
1995 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1996 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1997 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1998 socket.CAN_BCM_TX_SEND # send one CAN frame
1999 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
2000 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
2001 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
2002 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
2003 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
2004 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
2005 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
2006 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
2007
karl ding31c4fd22019-07-31 01:47:16 -07002008 # flags
2009 socket.CAN_BCM_SETTIMER
2010 socket.CAN_BCM_STARTTIMER
2011 socket.CAN_BCM_TX_COUNTEVT
2012 socket.CAN_BCM_TX_ANNOUNCE
2013 socket.CAN_BCM_TX_CP_CAN_ID
2014 socket.CAN_BCM_RX_FILTER_ID
2015 socket.CAN_BCM_RX_CHECK_DLC
2016 socket.CAN_BCM_RX_NO_AUTOTIMER
2017 socket.CAN_BCM_RX_ANNOUNCE_RESUME
2018 socket.CAN_BCM_TX_RESET_MULTI_IDX
2019 socket.CAN_BCM_RX_RTR_FRAME
2020
Charles-François Natali47413c12011-10-06 19:47:44 +02002021 def testCreateSocket(self):
2022 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2023 pass
2024
Charles-François Natali773e42d2013-02-05 19:42:01 +01002025 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2026 'socket.CAN_BCM required for this test.')
2027 def testCreateBCMSocket(self):
2028 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
2029 pass
2030
Charles-François Natali47413c12011-10-06 19:47:44 +02002031 def testBindAny(self):
2032 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04002033 address = ('', )
2034 s.bind(address)
2035 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02002036
2037 def testTooLongInterfaceName(self):
2038 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2039 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002040 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02002041 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02002042
2043 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
2044 'socket.CAN_RAW_LOOPBACK required for this test.')
2045 def testLoopback(self):
2046 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2047 for loopback in (0, 1):
2048 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
2049 loopback)
2050 self.assertEqual(loopback,
2051 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
2052
2053 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
2054 'socket.CAN_RAW_FILTER required for this test.')
2055 def testFilter(self):
2056 can_id, can_mask = 0x200, 0x700
2057 can_filter = struct.pack("=II", can_id, can_mask)
2058 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2059 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
2060 self.assertEqual(can_filter,
2061 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002062 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02002063
2064
2065@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02002066class CANTest(ThreadedCANSocketTest):
2067
Charles-François Natali47413c12011-10-06 19:47:44 +02002068 def __init__(self, methodName='runTest'):
2069 ThreadedCANSocketTest.__init__(self, methodName=methodName)
2070
2071 @classmethod
2072 def build_can_frame(cls, can_id, data):
2073 """Build a CAN frame."""
2074 can_dlc = len(data)
2075 data = data.ljust(8, b'\x00')
2076 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2077
2078 @classmethod
2079 def dissect_can_frame(cls, frame):
2080 """Dissect a CAN frame."""
2081 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2082 return (can_id, can_dlc, data[:can_dlc])
2083
2084 def testSendFrame(self):
2085 cf, addr = self.s.recvfrom(self.bufsize)
2086 self.assertEqual(self.cf, cf)
2087 self.assertEqual(addr[0], self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +02002088
2089 def _testSendFrame(self):
2090 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2091 self.cli.send(self.cf)
2092
2093 def testSendMaxFrame(self):
2094 cf, addr = self.s.recvfrom(self.bufsize)
2095 self.assertEqual(self.cf, cf)
2096
2097 def _testSendMaxFrame(self):
2098 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2099 self.cli.send(self.cf)
2100
2101 def testSendMultiFrames(self):
2102 cf, addr = self.s.recvfrom(self.bufsize)
2103 self.assertEqual(self.cf1, cf)
2104
2105 cf, addr = self.s.recvfrom(self.bufsize)
2106 self.assertEqual(self.cf2, cf)
2107
2108 def _testSendMultiFrames(self):
2109 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2110 self.cli.send(self.cf1)
2111
2112 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2113 self.cli.send(self.cf2)
2114
Charles-François Natali773e42d2013-02-05 19:42:01 +01002115 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2116 'socket.CAN_BCM required for this test.')
2117 def _testBCM(self):
2118 cf, addr = self.cli.recvfrom(self.bufsize)
2119 self.assertEqual(self.cf, cf)
2120 can_id, can_dlc, data = self.dissect_can_frame(cf)
2121 self.assertEqual(self.can_id, can_id)
2122 self.assertEqual(self.data, data)
2123
2124 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2125 'socket.CAN_BCM required for this test.')
2126 def testBCM(self):
2127 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2128 self.addCleanup(bcm.close)
2129 bcm.connect((self.interface,))
2130 self.can_id = 0x123
2131 self.data = bytes([0xc0, 0xff, 0xee])
2132 self.cf = self.build_can_frame(self.can_id, self.data)
2133 opcode = socket.CAN_BCM_TX_SEND
2134 flags = 0
2135 count = 0
2136 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2137 bcm_can_id = 0x0222
2138 nframes = 1
2139 assert len(self.cf) == 16
2140 header = struct.pack(self.bcm_cmd_msg_fmt,
2141 opcode,
2142 flags,
2143 count,
2144 ival1_seconds,
2145 ival1_usec,
2146 ival2_seconds,
2147 ival2_usec,
2148 bcm_can_id,
2149 nframes,
2150 )
2151 header_plus_frame = header + self.cf
2152 bytes_sent = bcm.send(header_plus_frame)
2153 self.assertEqual(bytes_sent, len(header_plus_frame))
2154
Charles-François Natali47413c12011-10-06 19:47:44 +02002155
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002156@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2157class ISOTPTest(unittest.TestCase):
2158
2159 def __init__(self, *args, **kwargs):
2160 super().__init__(*args, **kwargs)
2161 self.interface = "vcan0"
2162
2163 def testCrucialConstants(self):
2164 socket.AF_CAN
2165 socket.PF_CAN
2166 socket.CAN_ISOTP
2167 socket.SOCK_DGRAM
2168
2169 def testCreateSocket(self):
2170 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2171 pass
2172
2173 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2174 'socket.CAN_ISOTP required for this test.')
2175 def testCreateISOTPSocket(self):
2176 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2177 pass
2178
2179 def testTooLongInterfaceName(self):
2180 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2181 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2182 with self.assertRaisesRegex(OSError, 'interface name too long'):
2183 s.bind(('x' * 1024, 1, 2))
2184
2185 def testBind(self):
2186 try:
2187 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2188 addr = self.interface, 0x123, 0x456
2189 s.bind(addr)
2190 self.assertEqual(s.getsockname(), addr)
2191 except OSError as e:
2192 if e.errno == errno.ENODEV:
2193 self.skipTest('network interface `%s` does not exist' %
2194 self.interface)
2195 else:
2196 raise
2197
2198
karl ding360371f2020-04-29 15:31:19 -07002199@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2200class J1939Test(unittest.TestCase):
2201
2202 def __init__(self, *args, **kwargs):
2203 super().__init__(*args, **kwargs)
2204 self.interface = "vcan0"
2205
2206 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2207 'socket.CAN_J1939 required for this test.')
2208 def testJ1939Constants(self):
2209 socket.CAN_J1939
2210
2211 socket.J1939_MAX_UNICAST_ADDR
2212 socket.J1939_IDLE_ADDR
2213 socket.J1939_NO_ADDR
2214 socket.J1939_NO_NAME
2215 socket.J1939_PGN_REQUEST
2216 socket.J1939_PGN_ADDRESS_CLAIMED
2217 socket.J1939_PGN_ADDRESS_COMMANDED
2218 socket.J1939_PGN_PDU1_MAX
2219 socket.J1939_PGN_MAX
2220 socket.J1939_NO_PGN
2221
2222 # J1939 socket options
2223 socket.SO_J1939_FILTER
2224 socket.SO_J1939_PROMISC
2225 socket.SO_J1939_SEND_PRIO
2226 socket.SO_J1939_ERRQUEUE
2227
2228 socket.SCM_J1939_DEST_ADDR
2229 socket.SCM_J1939_DEST_NAME
2230 socket.SCM_J1939_PRIO
2231 socket.SCM_J1939_ERRQUEUE
2232
2233 socket.J1939_NLA_PAD
2234 socket.J1939_NLA_BYTES_ACKED
2235
2236 socket.J1939_EE_INFO_NONE
2237 socket.J1939_EE_INFO_TX_ABORT
2238
2239 socket.J1939_FILTER_MAX
2240
2241 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2242 'socket.CAN_J1939 required for this test.')
2243 def testCreateJ1939Socket(self):
2244 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2245 pass
2246
2247 def testBind(self):
2248 try:
2249 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2250 addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2251 s.bind(addr)
2252 self.assertEqual(s.getsockname(), addr)
2253 except OSError as e:
2254 if e.errno == errno.ENODEV:
2255 self.skipTest('network interface `%s` does not exist' %
2256 self.interface)
2257 else:
2258 raise
2259
2260
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002261@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2262class BasicRDSTest(unittest.TestCase):
2263
2264 def testCrucialConstants(self):
2265 socket.AF_RDS
2266 socket.PF_RDS
2267
2268 def testCreateSocket(self):
2269 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2270 pass
2271
2272 def testSocketBufferSize(self):
2273 bufsize = 16384
2274 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2275 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2276 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2277
2278
2279@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002280class RDSTest(ThreadedRDSSocketTest):
2281
2282 def __init__(self, methodName='runTest'):
2283 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2284
Charles-François Natali240c55f2011-11-10 20:33:36 +01002285 def setUp(self):
2286 super().setUp()
2287 self.evt = threading.Event()
2288
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002289 def testSendAndRecv(self):
2290 data, addr = self.serv.recvfrom(self.bufsize)
2291 self.assertEqual(self.data, data)
2292 self.assertEqual(self.cli_addr, addr)
2293
2294 def _testSendAndRecv(self):
2295 self.data = b'spam'
2296 self.cli.sendto(self.data, 0, (HOST, self.port))
2297
2298 def testPeek(self):
2299 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2300 self.assertEqual(self.data, data)
2301 data, addr = self.serv.recvfrom(self.bufsize)
2302 self.assertEqual(self.data, data)
2303
2304 def _testPeek(self):
2305 self.data = b'spam'
2306 self.cli.sendto(self.data, 0, (HOST, self.port))
2307
2308 @requireAttrs(socket.socket, 'recvmsg')
2309 def testSendAndRecvMsg(self):
2310 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2311 self.assertEqual(self.data, data)
2312
2313 @requireAttrs(socket.socket, 'sendmsg')
2314 def _testSendAndRecvMsg(self):
2315 self.data = b'hello ' * 10
2316 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2317
2318 def testSendAndRecvMulti(self):
2319 data, addr = self.serv.recvfrom(self.bufsize)
2320 self.assertEqual(self.data1, data)
2321
2322 data, addr = self.serv.recvfrom(self.bufsize)
2323 self.assertEqual(self.data2, data)
2324
2325 def _testSendAndRecvMulti(self):
2326 self.data1 = b'bacon'
2327 self.cli.sendto(self.data1, 0, (HOST, self.port))
2328
2329 self.data2 = b'egg'
2330 self.cli.sendto(self.data2, 0, (HOST, self.port))
2331
2332 def testSelect(self):
2333 r, w, x = select.select([self.serv], [], [], 3.0)
2334 self.assertIn(self.serv, r)
2335 data, addr = self.serv.recvfrom(self.bufsize)
2336 self.assertEqual(self.data, data)
2337
2338 def _testSelect(self):
2339 self.data = b'select'
2340 self.cli.sendto(self.data, 0, (HOST, self.port))
2341
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002342@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2343 'QIPCRTR sockets required for this test.')
2344class BasicQIPCRTRTest(unittest.TestCase):
2345
2346 def testCrucialConstants(self):
2347 socket.AF_QIPCRTR
2348
2349 def testCreateSocket(self):
2350 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2351 pass
2352
2353 def testUnbound(self):
2354 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2355 self.assertEqual(s.getsockname()[1], 0)
2356
2357 def testBindSock(self):
2358 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002359 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002360 self.assertNotEqual(s.getsockname()[1], 0)
2361
2362 def testInvalidBindSock(self):
2363 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002364 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002365
2366 def testAutoBindSock(self):
2367 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2368 s.connect((123, 123))
2369 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002370
caaveryeffc12f2017-09-06 18:18:10 -04002371@unittest.skipIf(fcntl is None, "need fcntl")
2372@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2373 'VSOCK sockets required for this test.')
2374class BasicVSOCKTest(unittest.TestCase):
2375
2376 def testCrucialConstants(self):
2377 socket.AF_VSOCK
2378
2379 def testVSOCKConstants(self):
2380 socket.SO_VM_SOCKETS_BUFFER_SIZE
2381 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2382 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2383 socket.VMADDR_CID_ANY
2384 socket.VMADDR_PORT_ANY
2385 socket.VMADDR_CID_HOST
2386 socket.VM_SOCKETS_INVALID_VERSION
2387 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2388
2389 def testCreateSocket(self):
2390 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2391 pass
2392
2393 def testSocketBufferSize(self):
2394 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2395 orig_max = s.getsockopt(socket.AF_VSOCK,
2396 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2397 orig = s.getsockopt(socket.AF_VSOCK,
2398 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2399 orig_min = s.getsockopt(socket.AF_VSOCK,
2400 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2401
2402 s.setsockopt(socket.AF_VSOCK,
2403 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2404 s.setsockopt(socket.AF_VSOCK,
2405 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2406 s.setsockopt(socket.AF_VSOCK,
2407 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2408
2409 self.assertEqual(orig_max * 2,
2410 s.getsockopt(socket.AF_VSOCK,
2411 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2412 self.assertEqual(orig * 2,
2413 s.getsockopt(socket.AF_VSOCK,
2414 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2415 self.assertEqual(orig_min * 2,
2416 s.getsockopt(socket.AF_VSOCK,
2417 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2418
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002419
Greg Bowser8fbece12019-08-02 16:29:52 -04002420@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2421 'Bluetooth sockets required for this test.')
2422class BasicBluetoothTest(unittest.TestCase):
2423
2424 def testBluetoothConstants(self):
2425 socket.BDADDR_ANY
2426 socket.BDADDR_LOCAL
2427 socket.AF_BLUETOOTH
2428 socket.BTPROTO_RFCOMM
2429
2430 if sys.platform != "win32":
2431 socket.BTPROTO_HCI
2432 socket.SOL_HCI
2433 socket.BTPROTO_L2CAP
2434
2435 if not sys.platform.startswith("freebsd"):
2436 socket.BTPROTO_SCO
2437
2438 def testCreateRfcommSocket(self):
2439 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2440 pass
2441
2442 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2443 def testCreateL2capSocket(self):
2444 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2445 pass
2446
2447 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2448 def testCreateHciSocket(self):
2449 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2450 pass
2451
2452 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2453 "windows and freebsd do not support SCO sockets")
2454 def testCreateScoSocket(self):
2455 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2456 pass
2457
2458
Guido van Rossum24e4af82002-06-12 19:18:08 +00002459class BasicTCPTest(SocketConnectedTest):
2460
2461 def __init__(self, methodName='runTest'):
2462 SocketConnectedTest.__init__(self, methodName=methodName)
2463
2464 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002465 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002466 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002467 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002468
2469 def _testRecv(self):
2470 self.serv_conn.send(MSG)
2471
2472 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002473 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002474 seg1 = self.cli_conn.recv(len(MSG) - 3)
2475 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002476 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002477 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002478
2479 def _testOverFlowRecv(self):
2480 self.serv_conn.send(MSG)
2481
2482 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002483 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002484 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002485 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002486
2487 def _testRecvFrom(self):
2488 self.serv_conn.send(MSG)
2489
2490 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002491 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002492 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2493 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002494 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002495 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002496
2497 def _testOverFlowRecvFrom(self):
2498 self.serv_conn.send(MSG)
2499
2500 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002501 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002502 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002503 while 1:
2504 read = self.cli_conn.recv(1024)
2505 if not read:
2506 break
Guido van Rossume531e292002-08-08 20:28:34 +00002507 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002508 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002509
2510 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002511 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002512 self.serv_conn.sendall(big_chunk)
2513
2514 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002515 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002516 fd = self.cli_conn.fileno()
2517 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002518 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002519 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002520 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002522
2523 def _testFromFd(self):
2524 self.serv_conn.send(MSG)
2525
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002526 def testDup(self):
2527 # Testing dup()
2528 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002529 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002530 msg = sock.recv(1024)
2531 self.assertEqual(msg, MSG)
2532
2533 def _testDup(self):
2534 self.serv_conn.send(MSG)
2535
Guido van Rossum24e4af82002-06-12 19:18:08 +00002536 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002537 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002538 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002539 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002540 # wait for _testShutdown to finish: on OS X, when the server
2541 # closes the connection the client also becomes disconnected,
2542 # and the client's shutdown call will fail. (Issue #4397.)
2543 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002544
2545 def _testShutdown(self):
2546 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002547 self.serv_conn.shutdown(2)
2548
2549 testShutdown_overflow = support.cpython_only(testShutdown)
2550
2551 @support.cpython_only
2552 def _testShutdown_overflow(self):
2553 import _testcapi
2554 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002555 # Issue 15989
2556 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2557 _testcapi.INT_MAX + 1)
2558 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2559 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002560 self.serv_conn.shutdown(2)
2561
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002562 def testDetach(self):
2563 # Testing detach()
2564 fileno = self.cli_conn.fileno()
2565 f = self.cli_conn.detach()
2566 self.assertEqual(f, fileno)
2567 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002568 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002569 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002570 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002571 # ...but we can create another socket using the (still open)
2572 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002573 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002574 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002575 msg = sock.recv(1024)
2576 self.assertEqual(msg, MSG)
2577
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002578 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002579 self.serv_conn.send(MSG)
2580
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002581
Guido van Rossum24e4af82002-06-12 19:18:08 +00002582class BasicUDPTest(ThreadedUDPSocketTest):
2583
2584 def __init__(self, methodName='runTest'):
2585 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2586
2587 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002588 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002589 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002590 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002591
2592 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002593 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002594
Guido van Rossum1c938012002-06-12 21:17:20 +00002595 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002596 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002597 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002598 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002599
Guido van Rossum1c938012002-06-12 21:17:20 +00002600 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002601 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002602
Guido van Rossumd8faa362007-04-27 19:54:29 +00002603 def testRecvFromNegative(self):
2604 # Negative lengths passed to recvfrom should give ValueError.
2605 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2606
2607 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002608 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002609
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002610
2611@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2612 'UDPLITE sockets required for this test.')
2613class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2614
2615 def __init__(self, methodName='runTest'):
2616 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2617
2618 def testSendtoAndRecv(self):
2619 # Testing sendto() and Recv() over UDPLITE
2620 msg = self.serv.recv(len(MSG))
2621 self.assertEqual(msg, MSG)
2622
2623 def _testSendtoAndRecv(self):
2624 self.cli.sendto(MSG, 0, (HOST, self.port))
2625
2626 def testRecvFrom(self):
2627 # Testing recvfrom() over UDPLITE
2628 msg, addr = self.serv.recvfrom(len(MSG))
2629 self.assertEqual(msg, MSG)
2630
2631 def _testRecvFrom(self):
2632 self.cli.sendto(MSG, 0, (HOST, self.port))
2633
2634 def testRecvFromNegative(self):
2635 # Negative lengths passed to recvfrom should give ValueError.
2636 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2637
2638 def _testRecvFromNegative(self):
2639 self.cli.sendto(MSG, 0, (HOST, self.port))
2640
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002641# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2642# same test code is used with different families and types of socket
2643# (e.g. stream, datagram), and tests using recvmsg() are repeated
2644# using recvmsg_into().
2645#
2646# The generic test classes such as SendmsgTests and
2647# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2648# supplied with sockets cli_sock and serv_sock representing the
2649# client's and the server's end of the connection respectively, and
2650# attributes cli_addr and serv_addr holding their (numeric where
2651# appropriate) addresses.
2652#
2653# The final concrete test classes combine these with subclasses of
2654# SocketTestBase which set up client and server sockets of a specific
2655# type, and with subclasses of SendrecvmsgBase such as
2656# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2657# sockets to cli_sock and serv_sock and override the methods and
2658# attributes of SendrecvmsgBase to fill in destination addresses if
2659# needed when sending, check for specific flags in msg_flags, etc.
2660#
2661# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2662# recvmsg_into().
2663
2664# XXX: like the other datagram (UDP) tests in this module, the code
2665# here assumes that datagram delivery on the local machine will be
2666# reliable.
2667
2668class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2669 # Base class for sendmsg()/recvmsg() tests.
2670
2671 # Time in seconds to wait before considering a test failed, or
2672 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002673 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002674
2675 def setUp(self):
2676 self.misc_event = threading.Event()
2677 super().setUp()
2678
2679 def sendToServer(self, msg):
2680 # Send msg to the server.
2681 return self.cli_sock.send(msg)
2682
2683 # Tuple of alternative default arguments for sendmsg() when called
2684 # via sendmsgToServer() (e.g. to include a destination address).
2685 sendmsg_to_server_defaults = ()
2686
2687 def sendmsgToServer(self, *args):
2688 # Call sendmsg() on self.cli_sock with the given arguments,
2689 # filling in any arguments which are not supplied with the
2690 # corresponding items of self.sendmsg_to_server_defaults, if
2691 # any.
2692 return self.cli_sock.sendmsg(
2693 *(args + self.sendmsg_to_server_defaults[len(args):]))
2694
2695 def doRecvmsg(self, sock, bufsize, *args):
2696 # Call recvmsg() on sock with given arguments and return its
2697 # result. Should be used for tests which can use either
2698 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2699 # this method with one which emulates it using recvmsg_into(),
2700 # thus allowing the same test to be used for both methods.
2701 result = sock.recvmsg(bufsize, *args)
2702 self.registerRecvmsgResult(result)
2703 return result
2704
2705 def registerRecvmsgResult(self, result):
2706 # Called by doRecvmsg() with the return value of recvmsg() or
2707 # recvmsg_into(). Can be overridden to arrange cleanup based
2708 # on the returned ancillary data, for instance.
2709 pass
2710
2711 def checkRecvmsgAddress(self, addr1, addr2):
2712 # Called to compare the received address with the address of
2713 # the peer.
2714 self.assertEqual(addr1, addr2)
2715
2716 # Flags that are normally unset in msg_flags
2717 msg_flags_common_unset = 0
2718 for name in ("MSG_CTRUNC", "MSG_OOB"):
2719 msg_flags_common_unset |= getattr(socket, name, 0)
2720
2721 # Flags that are normally set
2722 msg_flags_common_set = 0
2723
2724 # Flags set when a complete record has been received (e.g. MSG_EOR
2725 # for SCTP)
2726 msg_flags_eor_indicator = 0
2727
2728 # Flags set when a complete record has not been received
2729 # (e.g. MSG_TRUNC for datagram sockets)
2730 msg_flags_non_eor_indicator = 0
2731
2732 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2733 # Method to check the value of msg_flags returned by recvmsg[_into]().
2734 #
2735 # Checks that all bits in msg_flags_common_set attribute are
2736 # set in "flags" and all bits in msg_flags_common_unset are
2737 # unset.
2738 #
2739 # The "eor" argument specifies whether the flags should
2740 # indicate that a full record (or datagram) has been received.
2741 # If "eor" is None, no checks are done; otherwise, checks
2742 # that:
2743 #
2744 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2745 # set and all bits in msg_flags_non_eor_indicator are unset
2746 #
2747 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2748 # are set and all bits in msg_flags_eor_indicator are unset
2749 #
2750 # If "checkset" and/or "checkunset" are supplied, they require
2751 # the given bits to be set or unset respectively, overriding
2752 # what the attributes require for those bits.
2753 #
2754 # If any bits are set in "ignore", they will not be checked,
2755 # regardless of the other inputs.
2756 #
2757 # Will raise Exception if the inputs require a bit to be both
2758 # set and unset, and it is not ignored.
2759
2760 defaultset = self.msg_flags_common_set
2761 defaultunset = self.msg_flags_common_unset
2762
2763 if eor:
2764 defaultset |= self.msg_flags_eor_indicator
2765 defaultunset |= self.msg_flags_non_eor_indicator
2766 elif eor is not None:
2767 defaultset |= self.msg_flags_non_eor_indicator
2768 defaultunset |= self.msg_flags_eor_indicator
2769
2770 # Function arguments override defaults
2771 defaultset &= ~checkunset
2772 defaultunset &= ~checkset
2773
2774 # Merge arguments with remaining defaults, and check for conflicts
2775 checkset |= defaultset
2776 checkunset |= defaultunset
2777 inboth = checkset & checkunset & ~ignore
2778 if inboth:
2779 raise Exception("contradictory set, unset requirements for flags "
2780 "{0:#x}".format(inboth))
2781
2782 # Compare with given msg_flags value
2783 mask = (checkset | checkunset) & ~ignore
2784 self.assertEqual(flags & mask, checkset & mask)
2785
2786
2787class RecvmsgIntoMixin(SendrecvmsgBase):
2788 # Mixin to implement doRecvmsg() using recvmsg_into().
2789
2790 def doRecvmsg(self, sock, bufsize, *args):
2791 buf = bytearray(bufsize)
2792 result = sock.recvmsg_into([buf], *args)
2793 self.registerRecvmsgResult(result)
2794 self.assertGreaterEqual(result[0], 0)
2795 self.assertLessEqual(result[0], bufsize)
2796 return (bytes(buf[:result[0]]),) + result[1:]
2797
2798
2799class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2800 # Defines flags to be checked in msg_flags for datagram sockets.
2801
2802 @property
2803 def msg_flags_non_eor_indicator(self):
2804 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2805
2806
2807class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2808 # Defines flags to be checked in msg_flags for SCTP sockets.
2809
2810 @property
2811 def msg_flags_eor_indicator(self):
2812 return super().msg_flags_eor_indicator | socket.MSG_EOR
2813
2814
2815class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2816 # Base class for tests on connectionless-mode sockets. Users must
2817 # supply sockets on attributes cli and serv to be mapped to
2818 # cli_sock and serv_sock respectively.
2819
2820 @property
2821 def serv_sock(self):
2822 return self.serv
2823
2824 @property
2825 def cli_sock(self):
2826 return self.cli
2827
2828 @property
2829 def sendmsg_to_server_defaults(self):
2830 return ([], [], 0, self.serv_addr)
2831
2832 def sendToServer(self, msg):
2833 return self.cli_sock.sendto(msg, self.serv_addr)
2834
2835
2836class SendrecvmsgConnectedBase(SendrecvmsgBase):
2837 # Base class for tests on connected sockets. Users must supply
2838 # sockets on attributes serv_conn and cli_conn (representing the
2839 # connections *to* the server and the client), to be mapped to
2840 # cli_sock and serv_sock respectively.
2841
2842 @property
2843 def serv_sock(self):
2844 return self.cli_conn
2845
2846 @property
2847 def cli_sock(self):
2848 return self.serv_conn
2849
2850 def checkRecvmsgAddress(self, addr1, addr2):
2851 # Address is currently "unspecified" for a connected socket,
2852 # so we don't examine it
2853 pass
2854
2855
2856class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2857 # Base class to set a timeout on server's socket.
2858
2859 def setUp(self):
2860 super().setUp()
2861 self.serv_sock.settimeout(self.fail_timeout)
2862
2863
2864class SendmsgTests(SendrecvmsgServerTimeoutBase):
2865 # Tests for sendmsg() which can use any socket type and do not
2866 # involve recvmsg() or recvmsg_into().
2867
2868 def testSendmsg(self):
2869 # Send a simple message with sendmsg().
2870 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2871
2872 def _testSendmsg(self):
2873 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2874
2875 def testSendmsgDataGenerator(self):
2876 # Send from buffer obtained from a generator (not a sequence).
2877 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2878
2879 def _testSendmsgDataGenerator(self):
2880 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2881 len(MSG))
2882
2883 def testSendmsgAncillaryGenerator(self):
2884 # Gather (empty) ancillary data from a generator.
2885 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2886
2887 def _testSendmsgAncillaryGenerator(self):
2888 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2889 len(MSG))
2890
2891 def testSendmsgArray(self):
2892 # Send data from an array instead of the usual bytes object.
2893 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2894
2895 def _testSendmsgArray(self):
2896 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2897 len(MSG))
2898
2899 def testSendmsgGather(self):
2900 # Send message data from more than one buffer (gather write).
2901 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2902
2903 def _testSendmsgGather(self):
2904 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2905
2906 def testSendmsgBadArgs(self):
2907 # Check that sendmsg() rejects invalid arguments.
2908 self.assertEqual(self.serv_sock.recv(1000), b"done")
2909
2910 def _testSendmsgBadArgs(self):
2911 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2912 self.assertRaises(TypeError, self.sendmsgToServer,
2913 b"not in an iterable")
2914 self.assertRaises(TypeError, self.sendmsgToServer,
2915 object())
2916 self.assertRaises(TypeError, self.sendmsgToServer,
2917 [object()])
2918 self.assertRaises(TypeError, self.sendmsgToServer,
2919 [MSG, object()])
2920 self.assertRaises(TypeError, self.sendmsgToServer,
2921 [MSG], object())
2922 self.assertRaises(TypeError, self.sendmsgToServer,
2923 [MSG], [], object())
2924 self.assertRaises(TypeError, self.sendmsgToServer,
2925 [MSG], [], 0, object())
2926 self.sendToServer(b"done")
2927
2928 def testSendmsgBadCmsg(self):
2929 # Check that invalid ancillary data items are rejected.
2930 self.assertEqual(self.serv_sock.recv(1000), b"done")
2931
2932 def _testSendmsgBadCmsg(self):
2933 self.assertRaises(TypeError, self.sendmsgToServer,
2934 [MSG], [object()])
2935 self.assertRaises(TypeError, self.sendmsgToServer,
2936 [MSG], [(object(), 0, b"data")])
2937 self.assertRaises(TypeError, self.sendmsgToServer,
2938 [MSG], [(0, object(), b"data")])
2939 self.assertRaises(TypeError, self.sendmsgToServer,
2940 [MSG], [(0, 0, object())])
2941 self.assertRaises(TypeError, self.sendmsgToServer,
2942 [MSG], [(0, 0)])
2943 self.assertRaises(TypeError, self.sendmsgToServer,
2944 [MSG], [(0, 0, b"data", 42)])
2945 self.sendToServer(b"done")
2946
2947 @requireAttrs(socket, "CMSG_SPACE")
2948 def testSendmsgBadMultiCmsg(self):
2949 # Check that invalid ancillary data items are rejected when
2950 # more than one item is present.
2951 self.assertEqual(self.serv_sock.recv(1000), b"done")
2952
2953 @testSendmsgBadMultiCmsg.client_skip
2954 def _testSendmsgBadMultiCmsg(self):
2955 self.assertRaises(TypeError, self.sendmsgToServer,
2956 [MSG], [0, 0, b""])
2957 self.assertRaises(TypeError, self.sendmsgToServer,
2958 [MSG], [(0, 0, b""), object()])
2959 self.sendToServer(b"done")
2960
2961 def testSendmsgExcessCmsgReject(self):
2962 # Check that sendmsg() rejects excess ancillary data items
2963 # when the number that can be sent is limited.
2964 self.assertEqual(self.serv_sock.recv(1000), b"done")
2965
2966 def _testSendmsgExcessCmsgReject(self):
2967 if not hasattr(socket, "CMSG_SPACE"):
2968 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002969 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002970 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2971 self.assertIsNone(cm.exception.errno)
2972 self.sendToServer(b"done")
2973
2974 def testSendmsgAfterClose(self):
2975 # Check that sendmsg() fails on a closed socket.
2976 pass
2977
2978 def _testSendmsgAfterClose(self):
2979 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002980 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002981
2982
2983class SendmsgStreamTests(SendmsgTests):
2984 # Tests for sendmsg() which require a stream socket and do not
2985 # involve recvmsg() or recvmsg_into().
2986
2987 def testSendmsgExplicitNoneAddr(self):
2988 # Check that peer address can be specified as None.
2989 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2990
2991 def _testSendmsgExplicitNoneAddr(self):
2992 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2993
2994 def testSendmsgTimeout(self):
2995 # Check that timeout works with sendmsg().
2996 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2997 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2998
2999 def _testSendmsgTimeout(self):
3000 try:
3001 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07003002 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003003 while True:
3004 self.sendmsgToServer([b"a"*512])
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003005 except TimeoutError:
Victor Stinner46f40be2018-09-25 08:30:15 -07003006 pass
3007 except OSError as exc:
3008 if exc.errno != errno.ENOMEM:
3009 raise
3010 # bpo-33937 the test randomly fails on Travis CI with
3011 # "OSError: [Errno 12] Cannot allocate memory"
3012 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003013 self.fail("TimeoutError not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003014 finally:
3015 self.misc_event.set()
3016
3017 # XXX: would be nice to have more tests for sendmsg flags argument.
3018
3019 # Linux supports MSG_DONTWAIT when sending, but in general, it
3020 # only works when receiving. Could add other platforms if they
3021 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02003022 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003023 "MSG_DONTWAIT not known to work on this platform when "
3024 "sending")
3025 def testSendmsgDontWait(self):
3026 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
3027 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
3028 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3029
3030 @testSendmsgDontWait.client_skip
3031 def _testSendmsgDontWait(self):
3032 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02003033 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003034 while True:
3035 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07003036 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
3037 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003038 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07003039 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003040 finally:
3041 self.misc_event.set()
3042
3043
3044class SendmsgConnectionlessTests(SendmsgTests):
3045 # Tests for sendmsg() which require a connectionless-mode
3046 # (e.g. datagram) socket, and do not involve recvmsg() or
3047 # recvmsg_into().
3048
3049 def testSendmsgNoDestAddr(self):
3050 # Check that sendmsg() fails when no destination address is
3051 # given for unconnected socket.
3052 pass
3053
3054 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003055 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003056 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003057 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003058 [MSG], [], 0, None)
3059
3060
3061class RecvmsgGenericTests(SendrecvmsgBase):
3062 # Tests for recvmsg() which can also be emulated using
3063 # recvmsg_into(), and can use any socket type.
3064
3065 def testRecvmsg(self):
3066 # Receive a simple message with recvmsg[_into]().
3067 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3068 self.assertEqual(msg, MSG)
3069 self.checkRecvmsgAddress(addr, self.cli_addr)
3070 self.assertEqual(ancdata, [])
3071 self.checkFlags(flags, eor=True)
3072
3073 def _testRecvmsg(self):
3074 self.sendToServer(MSG)
3075
3076 def testRecvmsgExplicitDefaults(self):
3077 # Test recvmsg[_into]() with default arguments provided explicitly.
3078 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3079 len(MSG), 0, 0)
3080 self.assertEqual(msg, MSG)
3081 self.checkRecvmsgAddress(addr, self.cli_addr)
3082 self.assertEqual(ancdata, [])
3083 self.checkFlags(flags, eor=True)
3084
3085 def _testRecvmsgExplicitDefaults(self):
3086 self.sendToServer(MSG)
3087
3088 def testRecvmsgShorter(self):
3089 # Receive a message smaller than buffer.
3090 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3091 len(MSG) + 42)
3092 self.assertEqual(msg, MSG)
3093 self.checkRecvmsgAddress(addr, self.cli_addr)
3094 self.assertEqual(ancdata, [])
3095 self.checkFlags(flags, eor=True)
3096
3097 def _testRecvmsgShorter(self):
3098 self.sendToServer(MSG)
3099
3100 def testRecvmsgTrunc(self):
3101 # Receive part of message, check for truncation indicators.
3102 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3103 len(MSG) - 3)
3104 self.assertEqual(msg, MSG[:-3])
3105 self.checkRecvmsgAddress(addr, self.cli_addr)
3106 self.assertEqual(ancdata, [])
3107 self.checkFlags(flags, eor=False)
3108
3109 def _testRecvmsgTrunc(self):
3110 self.sendToServer(MSG)
3111
3112 def testRecvmsgShortAncillaryBuf(self):
3113 # Test ancillary data buffer too small to hold any ancillary data.
3114 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3115 len(MSG), 1)
3116 self.assertEqual(msg, MSG)
3117 self.checkRecvmsgAddress(addr, self.cli_addr)
3118 self.assertEqual(ancdata, [])
3119 self.checkFlags(flags, eor=True)
3120
3121 def _testRecvmsgShortAncillaryBuf(self):
3122 self.sendToServer(MSG)
3123
3124 def testRecvmsgLongAncillaryBuf(self):
3125 # Test large ancillary data buffer.
3126 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3127 len(MSG), 10240)
3128 self.assertEqual(msg, MSG)
3129 self.checkRecvmsgAddress(addr, self.cli_addr)
3130 self.assertEqual(ancdata, [])
3131 self.checkFlags(flags, eor=True)
3132
3133 def _testRecvmsgLongAncillaryBuf(self):
3134 self.sendToServer(MSG)
3135
3136 def testRecvmsgAfterClose(self):
3137 # Check that recvmsg[_into]() fails on a closed socket.
3138 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003139 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003140
3141 def _testRecvmsgAfterClose(self):
3142 pass
3143
3144 def testRecvmsgTimeout(self):
3145 # Check that timeout works.
3146 try:
3147 self.serv_sock.settimeout(0.03)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01003148 self.assertRaises(TimeoutError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003149 self.doRecvmsg, self.serv_sock, len(MSG))
3150 finally:
3151 self.misc_event.set()
3152
3153 def _testRecvmsgTimeout(self):
3154 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3155
3156 @requireAttrs(socket, "MSG_PEEK")
3157 def testRecvmsgPeek(self):
3158 # Check that MSG_PEEK in flags enables examination of pending
3159 # data without consuming it.
3160
3161 # Receive part of data with MSG_PEEK.
3162 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3163 len(MSG) - 3, 0,
3164 socket.MSG_PEEK)
3165 self.assertEqual(msg, MSG[:-3])
3166 self.checkRecvmsgAddress(addr, self.cli_addr)
3167 self.assertEqual(ancdata, [])
3168 # Ignoring MSG_TRUNC here (so this test is the same for stream
3169 # and datagram sockets). Some wording in POSIX seems to
3170 # suggest that it needn't be set when peeking, but that may
3171 # just be a slip.
3172 self.checkFlags(flags, eor=False,
3173 ignore=getattr(socket, "MSG_TRUNC", 0))
3174
3175 # Receive all data with MSG_PEEK.
3176 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3177 len(MSG), 0,
3178 socket.MSG_PEEK)
3179 self.assertEqual(msg, MSG)
3180 self.checkRecvmsgAddress(addr, self.cli_addr)
3181 self.assertEqual(ancdata, [])
3182 self.checkFlags(flags, eor=True)
3183
3184 # Check that the same data can still be received normally.
3185 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3186 self.assertEqual(msg, MSG)
3187 self.checkRecvmsgAddress(addr, self.cli_addr)
3188 self.assertEqual(ancdata, [])
3189 self.checkFlags(flags, eor=True)
3190
3191 @testRecvmsgPeek.client_skip
3192 def _testRecvmsgPeek(self):
3193 self.sendToServer(MSG)
3194
3195 @requireAttrs(socket.socket, "sendmsg")
3196 def testRecvmsgFromSendmsg(self):
3197 # Test receiving with recvmsg[_into]() when message is sent
3198 # using sendmsg().
3199 self.serv_sock.settimeout(self.fail_timeout)
3200 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3201 self.assertEqual(msg, MSG)
3202 self.checkRecvmsgAddress(addr, self.cli_addr)
3203 self.assertEqual(ancdata, [])
3204 self.checkFlags(flags, eor=True)
3205
3206 @testRecvmsgFromSendmsg.client_skip
3207 def _testRecvmsgFromSendmsg(self):
3208 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3209
3210
3211class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3212 # Tests which require a stream socket and can use either recvmsg()
3213 # or recvmsg_into().
3214
3215 def testRecvmsgEOF(self):
3216 # Receive end-of-stream indicator (b"", peer socket closed).
3217 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3218 self.assertEqual(msg, b"")
3219 self.checkRecvmsgAddress(addr, self.cli_addr)
3220 self.assertEqual(ancdata, [])
3221 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3222
3223 def _testRecvmsgEOF(self):
3224 self.cli_sock.close()
3225
3226 def testRecvmsgOverflow(self):
3227 # Receive a message in more than one chunk.
3228 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3229 len(MSG) - 3)
3230 self.checkRecvmsgAddress(addr, self.cli_addr)
3231 self.assertEqual(ancdata, [])
3232 self.checkFlags(flags, eor=False)
3233
3234 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3235 self.checkRecvmsgAddress(addr, self.cli_addr)
3236 self.assertEqual(ancdata, [])
3237 self.checkFlags(flags, eor=True)
3238
3239 msg = seg1 + seg2
3240 self.assertEqual(msg, MSG)
3241
3242 def _testRecvmsgOverflow(self):
3243 self.sendToServer(MSG)
3244
3245
3246class RecvmsgTests(RecvmsgGenericTests):
3247 # Tests for recvmsg() which can use any socket type.
3248
3249 def testRecvmsgBadArgs(self):
3250 # Check that recvmsg() rejects invalid arguments.
3251 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3252 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3253 -1, 0, 0)
3254 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3255 len(MSG), -1, 0)
3256 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3257 [bytearray(10)], 0, 0)
3258 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3259 object(), 0, 0)
3260 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3261 len(MSG), object(), 0)
3262 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3263 len(MSG), 0, object())
3264
3265 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3266 self.assertEqual(msg, MSG)
3267 self.checkRecvmsgAddress(addr, self.cli_addr)
3268 self.assertEqual(ancdata, [])
3269 self.checkFlags(flags, eor=True)
3270
3271 def _testRecvmsgBadArgs(self):
3272 self.sendToServer(MSG)
3273
3274
3275class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3276 # Tests for recvmsg_into() which can use any socket type.
3277
3278 def testRecvmsgIntoBadArgs(self):
3279 # Check that recvmsg_into() rejects invalid arguments.
3280 buf = bytearray(len(MSG))
3281 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3282 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3283 len(MSG), 0, 0)
3284 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3285 buf, 0, 0)
3286 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3287 [object()], 0, 0)
3288 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3289 [b"I'm not writable"], 0, 0)
3290 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3291 [buf, object()], 0, 0)
3292 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3293 [buf], -1, 0)
3294 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3295 [buf], object(), 0)
3296 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3297 [buf], 0, object())
3298
3299 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3300 self.assertEqual(nbytes, len(MSG))
3301 self.assertEqual(buf, bytearray(MSG))
3302 self.checkRecvmsgAddress(addr, self.cli_addr)
3303 self.assertEqual(ancdata, [])
3304 self.checkFlags(flags, eor=True)
3305
3306 def _testRecvmsgIntoBadArgs(self):
3307 self.sendToServer(MSG)
3308
3309 def testRecvmsgIntoGenerator(self):
3310 # Receive into buffer obtained from a generator (not a sequence).
3311 buf = bytearray(len(MSG))
3312 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3313 (o for o in [buf]))
3314 self.assertEqual(nbytes, len(MSG))
3315 self.assertEqual(buf, bytearray(MSG))
3316 self.checkRecvmsgAddress(addr, self.cli_addr)
3317 self.assertEqual(ancdata, [])
3318 self.checkFlags(flags, eor=True)
3319
3320 def _testRecvmsgIntoGenerator(self):
3321 self.sendToServer(MSG)
3322
3323 def testRecvmsgIntoArray(self):
3324 # Receive into an array rather than the usual bytearray.
3325 buf = array.array("B", [0] * len(MSG))
3326 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3327 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003328 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003329 self.checkRecvmsgAddress(addr, self.cli_addr)
3330 self.assertEqual(ancdata, [])
3331 self.checkFlags(flags, eor=True)
3332
3333 def _testRecvmsgIntoArray(self):
3334 self.sendToServer(MSG)
3335
3336 def testRecvmsgIntoScatter(self):
3337 # Receive into multiple buffers (scatter write).
3338 b1 = bytearray(b"----")
3339 b2 = bytearray(b"0123456789")
3340 b3 = bytearray(b"--------------")
3341 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3342 [b1, memoryview(b2)[2:9], b3])
3343 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3344 self.assertEqual(b1, bytearray(b"Mary"))
3345 self.assertEqual(b2, bytearray(b"01 had a 9"))
3346 self.assertEqual(b3, bytearray(b"little lamb---"))
3347 self.checkRecvmsgAddress(addr, self.cli_addr)
3348 self.assertEqual(ancdata, [])
3349 self.checkFlags(flags, eor=True)
3350
3351 def _testRecvmsgIntoScatter(self):
3352 self.sendToServer(b"Mary had a little lamb")
3353
3354
3355class CmsgMacroTests(unittest.TestCase):
3356 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3357 # assumptions used by sendmsg() and recvmsg[_into](), which share
3358 # code with these functions.
3359
3360 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003361 try:
3362 import _testcapi
3363 except ImportError:
3364 socklen_t_limit = 0x7fffffff
3365 else:
3366 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003367
3368 @requireAttrs(socket, "CMSG_LEN")
3369 def testCMSG_LEN(self):
3370 # Test CMSG_LEN() with various valid and invalid values,
3371 # checking the assumptions used by recvmsg() and sendmsg().
3372 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3373 values = list(range(257)) + list(range(toobig - 257, toobig))
3374
3375 # struct cmsghdr has at least three members, two of which are ints
3376 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3377 for n in values:
3378 ret = socket.CMSG_LEN(n)
3379 # This is how recvmsg() calculates the data size
3380 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3381 self.assertLessEqual(ret, self.socklen_t_limit)
3382
3383 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3384 # sendmsg() shares code with these functions, and requires
3385 # that it reject values over the limit.
3386 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3387 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3388
3389 @requireAttrs(socket, "CMSG_SPACE")
3390 def testCMSG_SPACE(self):
3391 # Test CMSG_SPACE() with various valid and invalid values,
3392 # checking the assumptions used by sendmsg().
3393 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3394 values = list(range(257)) + list(range(toobig - 257, toobig))
3395
3396 last = socket.CMSG_SPACE(0)
3397 # struct cmsghdr has at least three members, two of which are ints
3398 self.assertGreater(last, array.array("i").itemsize * 2)
3399 for n in values:
3400 ret = socket.CMSG_SPACE(n)
3401 self.assertGreaterEqual(ret, last)
3402 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3403 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3404 self.assertLessEqual(ret, self.socklen_t_limit)
3405 last = ret
3406
3407 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3408 # sendmsg() shares code with these functions, and requires
3409 # that it reject values over the limit.
3410 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3411 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3412
3413
3414class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3415 # Tests for file descriptor passing on Unix-domain sockets.
3416
3417 # Invalid file descriptor value that's unlikely to evaluate to a
3418 # real FD even if one of its bytes is replaced with a different
3419 # value (which shouldn't actually happen).
3420 badfd = -0x5555
3421
3422 def newFDs(self, n):
3423 # Return a list of n file descriptors for newly-created files
3424 # containing their list indices as ASCII numbers.
3425 fds = []
3426 for i in range(n):
3427 fd, path = tempfile.mkstemp()
3428 self.addCleanup(os.unlink, path)
3429 self.addCleanup(os.close, fd)
3430 os.write(fd, str(i).encode())
3431 fds.append(fd)
3432 return fds
3433
3434 def checkFDs(self, fds):
3435 # Check that the file descriptors in the given list contain
3436 # their correct list indices as ASCII numbers.
3437 for n, fd in enumerate(fds):
3438 os.lseek(fd, 0, os.SEEK_SET)
3439 self.assertEqual(os.read(fd, 1024), str(n).encode())
3440
3441 def registerRecvmsgResult(self, result):
3442 self.addCleanup(self.closeRecvmsgFDs, result)
3443
3444 def closeRecvmsgFDs(self, recvmsg_result):
3445 # Close all file descriptors specified in the ancillary data
3446 # of the given return value from recvmsg() or recvmsg_into().
3447 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3448 if (cmsg_level == socket.SOL_SOCKET and
3449 cmsg_type == socket.SCM_RIGHTS):
3450 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003451 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3453 for fd in fds:
3454 os.close(fd)
3455
3456 def createAndSendFDs(self, n):
3457 # Send n new file descriptors created by newFDs() to the
3458 # server, with the constant MSG as the non-ancillary data.
3459 self.assertEqual(
3460 self.sendmsgToServer([MSG],
3461 [(socket.SOL_SOCKET,
3462 socket.SCM_RIGHTS,
3463 array.array("i", self.newFDs(n)))]),
3464 len(MSG))
3465
3466 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3467 # Check that constant MSG was received with numfds file
3468 # descriptors in a maximum of maxcmsgs control messages (which
3469 # must contain only complete integers). By default, check
3470 # that MSG_CTRUNC is unset, but ignore any flags in
3471 # ignoreflags.
3472 msg, ancdata, flags, addr = result
3473 self.assertEqual(msg, MSG)
3474 self.checkRecvmsgAddress(addr, self.cli_addr)
3475 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3476 ignore=ignoreflags)
3477
3478 self.assertIsInstance(ancdata, list)
3479 self.assertLessEqual(len(ancdata), maxcmsgs)
3480 fds = array.array("i")
3481 for item in ancdata:
3482 self.assertIsInstance(item, tuple)
3483 cmsg_level, cmsg_type, cmsg_data = item
3484 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3485 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3486 self.assertIsInstance(cmsg_data, bytes)
3487 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003488 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003489
3490 self.assertEqual(len(fds), numfds)
3491 self.checkFDs(fds)
3492
3493 def testFDPassSimple(self):
3494 # Pass a single FD (array read from bytes object).
3495 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3496 len(MSG), 10240))
3497
3498 def _testFDPassSimple(self):
3499 self.assertEqual(
3500 self.sendmsgToServer(
3501 [MSG],
3502 [(socket.SOL_SOCKET,
3503 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003504 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505 len(MSG))
3506
3507 def testMultipleFDPass(self):
3508 # Pass multiple FDs in a single array.
3509 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3510 len(MSG), 10240))
3511
3512 def _testMultipleFDPass(self):
3513 self.createAndSendFDs(4)
3514
3515 @requireAttrs(socket, "CMSG_SPACE")
3516 def testFDPassCMSG_SPACE(self):
3517 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3518 self.checkRecvmsgFDs(
3519 4, self.doRecvmsg(self.serv_sock, len(MSG),
3520 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3521
3522 @testFDPassCMSG_SPACE.client_skip
3523 def _testFDPassCMSG_SPACE(self):
3524 self.createAndSendFDs(4)
3525
3526 def testFDPassCMSG_LEN(self):
3527 # Test using CMSG_LEN() to calculate ancillary buffer size.
3528 self.checkRecvmsgFDs(1,
3529 self.doRecvmsg(self.serv_sock, len(MSG),
3530 socket.CMSG_LEN(4 * SIZEOF_INT)),
3531 # RFC 3542 says implementations may set
3532 # MSG_CTRUNC if there isn't enough space
3533 # for trailing padding.
3534 ignoreflags=socket.MSG_CTRUNC)
3535
3536 def _testFDPassCMSG_LEN(self):
3537 self.createAndSendFDs(1)
3538
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003539 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003540 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003541 @requireAttrs(socket, "CMSG_SPACE")
3542 def testFDPassSeparate(self):
3543 # Pass two FDs in two separate arrays. Arrays may be combined
3544 # into a single control message by the OS.
3545 self.checkRecvmsgFDs(2,
3546 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3547 maxcmsgs=2)
3548
3549 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003550 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003551 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003552 def _testFDPassSeparate(self):
3553 fd0, fd1 = self.newFDs(2)
3554 self.assertEqual(
3555 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3556 socket.SCM_RIGHTS,
3557 array.array("i", [fd0])),
3558 (socket.SOL_SOCKET,
3559 socket.SCM_RIGHTS,
3560 array.array("i", [fd1]))]),
3561 len(MSG))
3562
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003563 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003564 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003565 @requireAttrs(socket, "CMSG_SPACE")
3566 def testFDPassSeparateMinSpace(self):
3567 # Pass two FDs in two separate arrays, receiving them into the
3568 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003569 num_fds = 2
3570 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003571 self.doRecvmsg(self.serv_sock, len(MSG),
3572 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003573 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003574 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3575
3576 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003577 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003578 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003579 def _testFDPassSeparateMinSpace(self):
3580 fd0, fd1 = self.newFDs(2)
3581 self.assertEqual(
3582 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3583 socket.SCM_RIGHTS,
3584 array.array("i", [fd0])),
3585 (socket.SOL_SOCKET,
3586 socket.SCM_RIGHTS,
3587 array.array("i", [fd1]))]),
3588 len(MSG))
3589
3590 def sendAncillaryIfPossible(self, msg, ancdata):
3591 # Try to send msg and ancdata to server, but if the system
3592 # call fails, just send msg with no ancillary data.
3593 try:
3594 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003595 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003596 # Check that it was the system call that failed
3597 self.assertIsInstance(e.errno, int)
3598 nbytes = self.sendmsgToServer([msg])
3599 self.assertEqual(nbytes, len(msg))
3600
Brett Cannon3bbad122015-12-28 17:21:44 -08003601 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003602 def testFDPassEmpty(self):
3603 # Try to pass an empty FD array. Can receive either no array
3604 # or an empty array.
3605 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3606 len(MSG), 10240),
3607 ignoreflags=socket.MSG_CTRUNC)
3608
3609 def _testFDPassEmpty(self):
3610 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3611 socket.SCM_RIGHTS,
3612 b"")])
3613
3614 def testFDPassPartialInt(self):
3615 # Try to pass a truncated FD array.
3616 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3617 len(MSG), 10240)
3618 self.assertEqual(msg, MSG)
3619 self.checkRecvmsgAddress(addr, self.cli_addr)
3620 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3621 self.assertLessEqual(len(ancdata), 1)
3622 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3623 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3624 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3625 self.assertLess(len(cmsg_data), SIZEOF_INT)
3626
3627 def _testFDPassPartialInt(self):
3628 self.sendAncillaryIfPossible(
3629 MSG,
3630 [(socket.SOL_SOCKET,
3631 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003632 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003633
3634 @requireAttrs(socket, "CMSG_SPACE")
3635 def testFDPassPartialIntInMiddle(self):
3636 # Try to pass two FD arrays, the first of which is truncated.
3637 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3638 len(MSG), 10240)
3639 self.assertEqual(msg, MSG)
3640 self.checkRecvmsgAddress(addr, self.cli_addr)
3641 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3642 self.assertLessEqual(len(ancdata), 2)
3643 fds = array.array("i")
3644 # Arrays may have been combined in a single control message
3645 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3646 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3647 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003648 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003649 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3650 self.assertLessEqual(len(fds), 2)
3651 self.checkFDs(fds)
3652
3653 @testFDPassPartialIntInMiddle.client_skip
3654 def _testFDPassPartialIntInMiddle(self):
3655 fd0, fd1 = self.newFDs(2)
3656 self.sendAncillaryIfPossible(
3657 MSG,
3658 [(socket.SOL_SOCKET,
3659 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003660 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003661 (socket.SOL_SOCKET,
3662 socket.SCM_RIGHTS,
3663 array.array("i", [fd1]))])
3664
3665 def checkTruncatedHeader(self, result, ignoreflags=0):
3666 # Check that no ancillary data items are returned when data is
3667 # truncated inside the cmsghdr structure.
3668 msg, ancdata, flags, addr = result
3669 self.assertEqual(msg, MSG)
3670 self.checkRecvmsgAddress(addr, self.cli_addr)
3671 self.assertEqual(ancdata, [])
3672 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3673 ignore=ignoreflags)
3674
3675 def testCmsgTruncNoBufSize(self):
3676 # Check that no ancillary data is received when no buffer size
3677 # is specified.
3678 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3679 # BSD seems to set MSG_CTRUNC only
3680 # if an item has been partially
3681 # received.
3682 ignoreflags=socket.MSG_CTRUNC)
3683
3684 def _testCmsgTruncNoBufSize(self):
3685 self.createAndSendFDs(1)
3686
3687 def testCmsgTrunc0(self):
3688 # Check that no ancillary data is received when buffer size is 0.
3689 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3690 ignoreflags=socket.MSG_CTRUNC)
3691
3692 def _testCmsgTrunc0(self):
3693 self.createAndSendFDs(1)
3694
3695 # Check that no ancillary data is returned for various non-zero
3696 # (but still too small) buffer sizes.
3697
3698 def testCmsgTrunc1(self):
3699 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3700
3701 def _testCmsgTrunc1(self):
3702 self.createAndSendFDs(1)
3703
3704 def testCmsgTrunc2Int(self):
3705 # The cmsghdr structure has at least three members, two of
3706 # which are ints, so we still shouldn't see any ancillary
3707 # data.
3708 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3709 SIZEOF_INT * 2))
3710
3711 def _testCmsgTrunc2Int(self):
3712 self.createAndSendFDs(1)
3713
3714 def testCmsgTruncLen0Minus1(self):
3715 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3716 socket.CMSG_LEN(0) - 1))
3717
3718 def _testCmsgTruncLen0Minus1(self):
3719 self.createAndSendFDs(1)
3720
3721 # The following tests try to truncate the control message in the
3722 # middle of the FD array.
3723
3724 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3725 # Check that file descriptor data is truncated to between
3726 # mindata and maxdata bytes when received with buffer size
3727 # ancbuf, and that any complete file descriptor numbers are
3728 # valid.
3729 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3730 len(MSG), ancbuf)
3731 self.assertEqual(msg, MSG)
3732 self.checkRecvmsgAddress(addr, self.cli_addr)
3733 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3734
3735 if mindata == 0 and ancdata == []:
3736 return
3737 self.assertEqual(len(ancdata), 1)
3738 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3739 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3740 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3741 self.assertGreaterEqual(len(cmsg_data), mindata)
3742 self.assertLessEqual(len(cmsg_data), maxdata)
3743 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003744 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003745 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3746 self.checkFDs(fds)
3747
3748 def testCmsgTruncLen0(self):
3749 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3750
3751 def _testCmsgTruncLen0(self):
3752 self.createAndSendFDs(1)
3753
3754 def testCmsgTruncLen0Plus1(self):
3755 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3756
3757 def _testCmsgTruncLen0Plus1(self):
3758 self.createAndSendFDs(2)
3759
3760 def testCmsgTruncLen1(self):
3761 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3762 maxdata=SIZEOF_INT)
3763
3764 def _testCmsgTruncLen1(self):
3765 self.createAndSendFDs(2)
3766
3767 def testCmsgTruncLen2Minus1(self):
3768 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3769 maxdata=(2 * SIZEOF_INT) - 1)
3770
3771 def _testCmsgTruncLen2Minus1(self):
3772 self.createAndSendFDs(2)
3773
3774
3775class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3776 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3777 # features of the RFC 3542 Advanced Sockets API for IPv6.
3778 # Currently we can only handle certain data items (e.g. traffic
3779 # class, hop limit, MTU discovery and fragmentation settings)
3780 # without resorting to unportable means such as the struct module,
3781 # but the tests here are aimed at testing the ancillary data
3782 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3783 # itself.
3784
3785 # Test value to use when setting hop limit of packet
3786 hop_limit = 2
3787
3788 # Test value to use when setting traffic class of packet.
3789 # -1 means "use kernel default".
3790 traffic_class = -1
3791
3792 def ancillaryMapping(self, ancdata):
3793 # Given ancillary data list ancdata, return a mapping from
3794 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3795 # Check that no (level, type) pair appears more than once.
3796 d = {}
3797 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3798 self.assertNotIn((cmsg_level, cmsg_type), d)
3799 d[(cmsg_level, cmsg_type)] = cmsg_data
3800 return d
3801
3802 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3803 # Receive hop limit into ancbufsize bytes of ancillary data
3804 # space. Check that data is MSG, ancillary data is not
3805 # truncated (but ignore any flags in ignoreflags), and hop
3806 # limit is between 0 and maxhop inclusive.
3807 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3808 socket.IPV6_RECVHOPLIMIT, 1)
3809 self.misc_event.set()
3810 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3811 len(MSG), ancbufsize)
3812
3813 self.assertEqual(msg, MSG)
3814 self.checkRecvmsgAddress(addr, self.cli_addr)
3815 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3816 ignore=ignoreflags)
3817
3818 self.assertEqual(len(ancdata), 1)
3819 self.assertIsInstance(ancdata[0], tuple)
3820 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3821 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3822 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3823 self.assertIsInstance(cmsg_data, bytes)
3824 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3825 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003826 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003827 self.assertGreaterEqual(a[0], 0)
3828 self.assertLessEqual(a[0], maxhop)
3829
3830 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3831 def testRecvHopLimit(self):
3832 # Test receiving the packet hop limit as ancillary data.
3833 self.checkHopLimit(ancbufsize=10240)
3834
3835 @testRecvHopLimit.client_skip
3836 def _testRecvHopLimit(self):
3837 # Need to wait until server has asked to receive ancillary
3838 # data, as implementations are not required to buffer it
3839 # otherwise.
3840 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3841 self.sendToServer(MSG)
3842
3843 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3844 def testRecvHopLimitCMSG_SPACE(self):
3845 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3846 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3847
3848 @testRecvHopLimitCMSG_SPACE.client_skip
3849 def _testRecvHopLimitCMSG_SPACE(self):
3850 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3851 self.sendToServer(MSG)
3852
3853 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3854 # 3542 says portable applications must provide space for trailing
3855 # padding. Implementations may set MSG_CTRUNC if there isn't
3856 # enough space for the padding.
3857
3858 @requireAttrs(socket.socket, "sendmsg")
3859 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3860 def testSetHopLimit(self):
3861 # Test setting hop limit on outgoing packet and receiving it
3862 # at the other end.
3863 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3864
3865 @testSetHopLimit.client_skip
3866 def _testSetHopLimit(self):
3867 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3868 self.assertEqual(
3869 self.sendmsgToServer([MSG],
3870 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3871 array.array("i", [self.hop_limit]))]),
3872 len(MSG))
3873
3874 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3875 ignoreflags=0):
3876 # Receive traffic class and hop limit into ancbufsize bytes of
3877 # ancillary data space. Check that data is MSG, ancillary
3878 # data is not truncated (but ignore any flags in ignoreflags),
3879 # and traffic class and hop limit are in range (hop limit no
3880 # more than maxhop).
3881 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3882 socket.IPV6_RECVHOPLIMIT, 1)
3883 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3884 socket.IPV6_RECVTCLASS, 1)
3885 self.misc_event.set()
3886 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3887 len(MSG), ancbufsize)
3888
3889 self.assertEqual(msg, MSG)
3890 self.checkRecvmsgAddress(addr, self.cli_addr)
3891 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3892 ignore=ignoreflags)
3893 self.assertEqual(len(ancdata), 2)
3894 ancmap = self.ancillaryMapping(ancdata)
3895
3896 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3897 self.assertEqual(len(tcdata), SIZEOF_INT)
3898 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003899 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003900 self.assertGreaterEqual(a[0], 0)
3901 self.assertLessEqual(a[0], 255)
3902
3903 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3904 self.assertEqual(len(hldata), SIZEOF_INT)
3905 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003906 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003907 self.assertGreaterEqual(a[0], 0)
3908 self.assertLessEqual(a[0], maxhop)
3909
3910 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3911 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3912 def testRecvTrafficClassAndHopLimit(self):
3913 # Test receiving traffic class and hop limit as ancillary data.
3914 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3915
3916 @testRecvTrafficClassAndHopLimit.client_skip
3917 def _testRecvTrafficClassAndHopLimit(self):
3918 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3919 self.sendToServer(MSG)
3920
3921 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3922 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3923 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3924 # Test receiving traffic class and hop limit, using
3925 # CMSG_SPACE() to calculate buffer size.
3926 self.checkTrafficClassAndHopLimit(
3927 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3928
3929 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3930 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3931 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3932 self.sendToServer(MSG)
3933
3934 @requireAttrs(socket.socket, "sendmsg")
3935 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3936 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3937 def testSetTrafficClassAndHopLimit(self):
3938 # Test setting traffic class and hop limit on outgoing packet,
3939 # and receiving them at the other end.
3940 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3941 maxhop=self.hop_limit)
3942
3943 @testSetTrafficClassAndHopLimit.client_skip
3944 def _testSetTrafficClassAndHopLimit(self):
3945 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3946 self.assertEqual(
3947 self.sendmsgToServer([MSG],
3948 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3949 array.array("i", [self.traffic_class])),
3950 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3951 array.array("i", [self.hop_limit]))]),
3952 len(MSG))
3953
3954 @requireAttrs(socket.socket, "sendmsg")
3955 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3956 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3957 def testOddCmsgSize(self):
3958 # Try to send ancillary data with first item one byte too
3959 # long. Fall back to sending with correct size if this fails,
3960 # and check that second item was handled correctly.
3961 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3962 maxhop=self.hop_limit)
3963
3964 @testOddCmsgSize.client_skip
3965 def _testOddCmsgSize(self):
3966 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3967 try:
3968 nbytes = self.sendmsgToServer(
3969 [MSG],
3970 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003971 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3973 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003974 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003975 self.assertIsInstance(e.errno, int)
3976 nbytes = self.sendmsgToServer(
3977 [MSG],
3978 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3979 array.array("i", [self.traffic_class])),
3980 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3981 array.array("i", [self.hop_limit]))])
3982 self.assertEqual(nbytes, len(MSG))
3983
3984 # Tests for proper handling of truncated ancillary data
3985
3986 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3987 # Receive hop limit into ancbufsize bytes of ancillary data
3988 # space, which should be too small to contain the ancillary
3989 # data header (if ancbufsize is None, pass no second argument
3990 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3991 # (unless included in ignoreflags), and no ancillary data is
3992 # returned.
3993 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3994 socket.IPV6_RECVHOPLIMIT, 1)
3995 self.misc_event.set()
3996 args = () if ancbufsize is None else (ancbufsize,)
3997 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3998 len(MSG), *args)
3999
4000 self.assertEqual(msg, MSG)
4001 self.checkRecvmsgAddress(addr, self.cli_addr)
4002 self.assertEqual(ancdata, [])
4003 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4004 ignore=ignoreflags)
4005
4006 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4007 def testCmsgTruncNoBufSize(self):
4008 # Check that no ancillary data is received when no ancillary
4009 # buffer size is provided.
4010 self.checkHopLimitTruncatedHeader(ancbufsize=None,
4011 # BSD seems to set
4012 # MSG_CTRUNC only if an item
4013 # has been partially
4014 # received.
4015 ignoreflags=socket.MSG_CTRUNC)
4016
4017 @testCmsgTruncNoBufSize.client_skip
4018 def _testCmsgTruncNoBufSize(self):
4019 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4020 self.sendToServer(MSG)
4021
4022 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4023 def testSingleCmsgTrunc0(self):
4024 # Check that no ancillary data is received when ancillary
4025 # buffer size is zero.
4026 self.checkHopLimitTruncatedHeader(ancbufsize=0,
4027 ignoreflags=socket.MSG_CTRUNC)
4028
4029 @testSingleCmsgTrunc0.client_skip
4030 def _testSingleCmsgTrunc0(self):
4031 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4032 self.sendToServer(MSG)
4033
4034 # Check that no ancillary data is returned for various non-zero
4035 # (but still too small) buffer sizes.
4036
4037 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4038 def testSingleCmsgTrunc1(self):
4039 self.checkHopLimitTruncatedHeader(ancbufsize=1)
4040
4041 @testSingleCmsgTrunc1.client_skip
4042 def _testSingleCmsgTrunc1(self):
4043 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4044 self.sendToServer(MSG)
4045
4046 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4047 def testSingleCmsgTrunc2Int(self):
4048 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
4049
4050 @testSingleCmsgTrunc2Int.client_skip
4051 def _testSingleCmsgTrunc2Int(self):
4052 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4053 self.sendToServer(MSG)
4054
4055 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4056 def testSingleCmsgTruncLen0Minus1(self):
4057 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
4058
4059 @testSingleCmsgTruncLen0Minus1.client_skip
4060 def _testSingleCmsgTruncLen0Minus1(self):
4061 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4062 self.sendToServer(MSG)
4063
4064 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4065 def testSingleCmsgTruncInData(self):
4066 # Test truncation of a control message inside its associated
4067 # data. The message may be returned with its data truncated,
4068 # or not returned at all.
4069 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4070 socket.IPV6_RECVHOPLIMIT, 1)
4071 self.misc_event.set()
4072 msg, ancdata, flags, addr = self.doRecvmsg(
4073 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4074
4075 self.assertEqual(msg, MSG)
4076 self.checkRecvmsgAddress(addr, self.cli_addr)
4077 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4078
4079 self.assertLessEqual(len(ancdata), 1)
4080 if ancdata:
4081 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4082 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4083 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4084 self.assertLess(len(cmsg_data), SIZEOF_INT)
4085
4086 @testSingleCmsgTruncInData.client_skip
4087 def _testSingleCmsgTruncInData(self):
4088 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4089 self.sendToServer(MSG)
4090
4091 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4092 # Receive traffic class and hop limit into ancbufsize bytes of
4093 # ancillary data space, which should be large enough to
4094 # contain the first item, but too small to contain the header
4095 # of the second. Check that data is MSG, MSG_CTRUNC is set
4096 # (unless included in ignoreflags), and only one ancillary
4097 # data item is returned.
4098 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4099 socket.IPV6_RECVHOPLIMIT, 1)
4100 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4101 socket.IPV6_RECVTCLASS, 1)
4102 self.misc_event.set()
4103 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4104 len(MSG), ancbufsize)
4105
4106 self.assertEqual(msg, MSG)
4107 self.checkRecvmsgAddress(addr, self.cli_addr)
4108 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4109 ignore=ignoreflags)
4110
4111 self.assertEqual(len(ancdata), 1)
4112 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4113 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4114 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4115 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4116 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004117 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004118 self.assertGreaterEqual(a[0], 0)
4119 self.assertLessEqual(a[0], 255)
4120
4121 # Try the above test with various buffer sizes.
4122
4123 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4124 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4125 def testSecondCmsgTrunc0(self):
4126 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4127 ignoreflags=socket.MSG_CTRUNC)
4128
4129 @testSecondCmsgTrunc0.client_skip
4130 def _testSecondCmsgTrunc0(self):
4131 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4132 self.sendToServer(MSG)
4133
4134 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4135 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4136 def testSecondCmsgTrunc1(self):
4137 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4138
4139 @testSecondCmsgTrunc1.client_skip
4140 def _testSecondCmsgTrunc1(self):
4141 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4142 self.sendToServer(MSG)
4143
4144 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4145 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4146 def testSecondCmsgTrunc2Int(self):
4147 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4148 2 * SIZEOF_INT)
4149
4150 @testSecondCmsgTrunc2Int.client_skip
4151 def _testSecondCmsgTrunc2Int(self):
4152 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4153 self.sendToServer(MSG)
4154
4155 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4156 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4157 def testSecondCmsgTruncLen0Minus1(self):
4158 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4159 socket.CMSG_LEN(0) - 1)
4160
4161 @testSecondCmsgTruncLen0Minus1.client_skip
4162 def _testSecondCmsgTruncLen0Minus1(self):
4163 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4164 self.sendToServer(MSG)
4165
4166 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4167 "IPV6_RECVTCLASS", "IPV6_TCLASS")
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304168 def testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004169 # Test truncation of the second of two control messages inside
4170 # its associated data.
4171 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4172 socket.IPV6_RECVHOPLIMIT, 1)
4173 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4174 socket.IPV6_RECVTCLASS, 1)
4175 self.misc_event.set()
4176 msg, ancdata, flags, addr = self.doRecvmsg(
4177 self.serv_sock, len(MSG),
4178 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4179
4180 self.assertEqual(msg, MSG)
4181 self.checkRecvmsgAddress(addr, self.cli_addr)
4182 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4183
4184 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4185
4186 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4187 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4188 cmsg_types.remove(cmsg_type)
4189 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4190 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004191 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004192 self.assertGreaterEqual(a[0], 0)
4193 self.assertLessEqual(a[0], 255)
4194
4195 if ancdata:
4196 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4197 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4198 cmsg_types.remove(cmsg_type)
4199 self.assertLess(len(cmsg_data), SIZEOF_INT)
4200
4201 self.assertEqual(ancdata, [])
4202
Akashkumar D Khuntd6238ba2020-10-30 11:33:51 +05304203 @testSecondCmsgTruncInData.client_skip
4204 def _testSecondCmsgTruncInData(self):
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004205 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4206 self.sendToServer(MSG)
4207
4208
4209# Derive concrete test classes for different socket types.
4210
4211class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4212 SendrecvmsgConnectionlessBase,
4213 ThreadedSocketTestMixin, UDPTestBase):
4214 pass
4215
4216@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004217class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4218 pass
4219
4220@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4222 pass
4223
4224@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004225class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4226 pass
4227
4228
4229class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4230 SendrecvmsgConnectionlessBase,
4231 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004232
4233 def checkRecvmsgAddress(self, addr1, addr2):
4234 # Called to compare the received address with the address of
4235 # the peer, ignoring scope ID
4236 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004237
4238@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004239@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004240@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004241class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4242 pass
4243
4244@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004245@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004246@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004247class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4248 pass
4249
4250@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004251@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004252@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004253class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4254 pass
4255
4256@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004257@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004258@requireAttrs(socket, "IPPROTO_IPV6")
4259@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004260class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4261 SendrecvmsgUDP6TestBase):
4262 pass
4263
4264@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004265@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004266@requireAttrs(socket, "IPPROTO_IPV6")
4267@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004268class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4269 RFC3542AncillaryTest,
4270 SendrecvmsgUDP6TestBase):
4271 pass
4272
4273
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004274@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4275 'UDPLITE sockets required for this test.')
4276class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4277 SendrecvmsgConnectionlessBase,
4278 ThreadedSocketTestMixin, UDPLITETestBase):
4279 pass
4280
4281@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4282 'UDPLITE sockets required for this test.')
4283@requireAttrs(socket.socket, "sendmsg")
4284class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4285 pass
4286
4287@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4288 'UDPLITE sockets required for this test.')
4289@requireAttrs(socket.socket, "recvmsg")
4290class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4291 pass
4292
4293@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4294 'UDPLITE sockets required for this test.')
4295@requireAttrs(socket.socket, "recvmsg_into")
4296class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4297 pass
4298
4299
4300@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4301 'UDPLITE sockets required for this test.')
4302class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4303 SendrecvmsgConnectionlessBase,
4304 ThreadedSocketTestMixin, UDPLITE6TestBase):
4305
4306 def checkRecvmsgAddress(self, addr1, addr2):
4307 # Called to compare the received address with the address of
4308 # the peer, ignoring scope ID
4309 self.assertEqual(addr1[:-1], addr2[:-1])
4310
4311@requireAttrs(socket.socket, "sendmsg")
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@requireSocket("AF_INET6", "SOCK_DGRAM")
4316class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4317 pass
4318
4319@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004320@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004321@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4322 'UDPLITE sockets required for this test.')
4323@requireSocket("AF_INET6", "SOCK_DGRAM")
4324class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4325 pass
4326
4327@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004328@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004329@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4330 'UDPLITE sockets required for this test.')
4331@requireSocket("AF_INET6", "SOCK_DGRAM")
4332class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4333 pass
4334
4335@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004336@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004337@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4338 'UDPLITE sockets required for this test.')
4339@requireAttrs(socket, "IPPROTO_IPV6")
4340@requireSocket("AF_INET6", "SOCK_DGRAM")
4341class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4342 SendrecvmsgUDPLITE6TestBase):
4343 pass
4344
4345@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004346@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004347@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4348 'UDPLITE sockets required for this test.')
4349@requireAttrs(socket, "IPPROTO_IPV6")
4350@requireSocket("AF_INET6", "SOCK_DGRAM")
4351class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4352 RFC3542AncillaryTest,
4353 SendrecvmsgUDPLITE6TestBase):
4354 pass
4355
4356
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004357class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4358 ConnectedStreamTestMixin, TCPTestBase):
4359 pass
4360
4361@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004362class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4363 pass
4364
4365@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004366class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4367 SendrecvmsgTCPTestBase):
4368 pass
4369
4370@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004371class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4372 SendrecvmsgTCPTestBase):
4373 pass
4374
4375
4376class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4377 SendrecvmsgConnectedBase,
4378 ConnectedStreamTestMixin, SCTPStreamBase):
4379 pass
4380
4381@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004382@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004383@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004384class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4385 pass
4386
4387@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004388@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004389@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004390class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4391 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004392
4393 def testRecvmsgEOF(self):
4394 try:
4395 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4396 except OSError as e:
4397 if e.errno != errno.ENOTCONN:
4398 raise
4399 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004400
4401@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004402@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004403@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004404class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4405 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004406
4407 def testRecvmsgEOF(self):
4408 try:
4409 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4410 except OSError as e:
4411 if e.errno != errno.ENOTCONN:
4412 raise
4413 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004414
4415
4416class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4417 ConnectedStreamTestMixin, UnixStreamBase):
4418 pass
4419
4420@requireAttrs(socket.socket, "sendmsg")
4421@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004422class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4423 pass
4424
4425@requireAttrs(socket.socket, "recvmsg")
4426@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4428 SendrecvmsgUnixStreamTestBase):
4429 pass
4430
4431@requireAttrs(socket.socket, "recvmsg_into")
4432@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004433class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4434 SendrecvmsgUnixStreamTestBase):
4435 pass
4436
4437@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4438@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004439class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4440 pass
4441
4442@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4443@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004444class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4445 SendrecvmsgUnixStreamTestBase):
4446 pass
4447
4448
4449# Test interrupting the interruptible send/receive methods with a
4450# signal when a timeout is set. These tests avoid having multiple
4451# threads alive during the test so that the OS cannot deliver the
4452# signal to the wrong one.
4453
4454class InterruptedTimeoutBase(unittest.TestCase):
4455 # Base class for interrupted send/receive tests. Installs an
4456 # empty handler for SIGALRM and removes it on teardown, along with
4457 # any scheduled alarms.
4458
4459 def setUp(self):
4460 super().setUp()
4461 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004462 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004463 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004464
4465 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004466 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004467
4468 # Provide setAlarm() method to schedule delivery of SIGALRM after
4469 # given number of seconds, or cancel it if zero, and an
4470 # appropriate time value to use. Use setitimer() if available.
4471 if hasattr(signal, "setitimer"):
4472 alarm_time = 0.05
4473
4474 def setAlarm(self, seconds):
4475 signal.setitimer(signal.ITIMER_REAL, seconds)
4476 else:
4477 # Old systems may deliver the alarm up to one second early
4478 alarm_time = 2
4479
4480 def setAlarm(self, seconds):
4481 signal.alarm(seconds)
4482
4483
4484# Require siginterrupt() in order to ensure that system calls are
4485# interrupted by default.
4486@requireAttrs(signal, "siginterrupt")
4487@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4488 "Don't have signal.alarm or signal.setitimer")
4489class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4490 # Test interrupting the recv*() methods with signals when a
4491 # timeout is set.
4492
4493 def setUp(self):
4494 super().setUp()
4495 self.serv.settimeout(self.timeout)
4496
4497 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004498 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004499 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004500 try:
4501 self.setAlarm(self.alarm_time)
4502 with self.assertRaises(ZeroDivisionError) as cm:
4503 func(*args, **kwargs)
4504 finally:
4505 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004506
4507 def testInterruptedRecvTimeout(self):
4508 self.checkInterruptedRecv(self.serv.recv, 1024)
4509
4510 def testInterruptedRecvIntoTimeout(self):
4511 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4512
4513 def testInterruptedRecvfromTimeout(self):
4514 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4515
4516 def testInterruptedRecvfromIntoTimeout(self):
4517 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4518
4519 @requireAttrs(socket.socket, "recvmsg")
4520 def testInterruptedRecvmsgTimeout(self):
4521 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4522
4523 @requireAttrs(socket.socket, "recvmsg_into")
4524 def testInterruptedRecvmsgIntoTimeout(self):
4525 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4526
4527
4528# Require siginterrupt() in order to ensure that system calls are
4529# interrupted by default.
4530@requireAttrs(signal, "siginterrupt")
4531@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4532 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004533class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4534 ThreadSafeCleanupTestCase,
4535 SocketListeningTestMixin, TCPTestBase):
4536 # Test interrupting the interruptible send*() methods with signals
4537 # when a timeout is set.
4538
4539 def setUp(self):
4540 super().setUp()
4541 self.serv_conn = self.newSocket()
4542 self.addCleanup(self.serv_conn.close)
4543 # Use a thread to complete the connection, but wait for it to
4544 # terminate before running the test, so that there is only one
4545 # thread to accept the signal.
4546 cli_thread = threading.Thread(target=self.doConnect)
4547 cli_thread.start()
4548 self.cli_conn, addr = self.serv.accept()
4549 self.addCleanup(self.cli_conn.close)
4550 cli_thread.join()
4551 self.serv_conn.settimeout(self.timeout)
4552
4553 def doConnect(self):
4554 self.serv_conn.connect(self.serv_addr)
4555
4556 def checkInterruptedSend(self, func, *args, **kwargs):
4557 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004558 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004559 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004560 try:
4561 with self.assertRaises(ZeroDivisionError) as cm:
4562 while True:
4563 self.setAlarm(self.alarm_time)
4564 func(*args, **kwargs)
4565 finally:
4566 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004567
Ned Deilyc5640382014-02-03 13:58:31 -08004568 # Issue #12958: The following tests have problems on OS X prior to 10.7
4569 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004570 def testInterruptedSendTimeout(self):
4571 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4572
Ned Deilyc5640382014-02-03 13:58:31 -08004573 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004574 def testInterruptedSendtoTimeout(self):
4575 # Passing an actual address here as Python's wrapper for
4576 # sendto() doesn't allow passing a zero-length one; POSIX
4577 # requires that the address is ignored since the socket is
4578 # connection-mode, however.
4579 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4580 self.serv_addr)
4581
Ned Deilyc5640382014-02-03 13:58:31 -08004582 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004583 @requireAttrs(socket.socket, "sendmsg")
4584 def testInterruptedSendmsgTimeout(self):
4585 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4586
4587
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004588class TCPCloserTest(ThreadedTCPSocketTest):
4589
4590 def testClose(self):
4591 conn, addr = self.serv.accept()
4592 conn.close()
4593
4594 sd = self.cli
4595 read, write, err = select.select([sd], [], [], 1.0)
4596 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004597 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004598
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004599 # Calling close() many times should be safe.
4600 conn.close()
4601 conn.close()
4602
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004603 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004604 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004605 time.sleep(1.0)
4606
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004607
Dave Cole331708b2004-08-09 04:51:41 +00004608class BasicSocketPairTest(SocketPairTest):
4609
4610 def __init__(self, methodName='runTest'):
4611 SocketPairTest.__init__(self, methodName=methodName)
4612
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004613 def _check_defaults(self, sock):
4614 self.assertIsInstance(sock, socket.socket)
4615 if hasattr(socket, 'AF_UNIX'):
4616 self.assertEqual(sock.family, socket.AF_UNIX)
4617 else:
4618 self.assertEqual(sock.family, socket.AF_INET)
4619 self.assertEqual(sock.type, socket.SOCK_STREAM)
4620 self.assertEqual(sock.proto, 0)
4621
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004622 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004623 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004624
4625 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004626 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004627
Dave Cole331708b2004-08-09 04:51:41 +00004628 def testRecv(self):
4629 msg = self.serv.recv(1024)
4630 self.assertEqual(msg, MSG)
4631
4632 def _testRecv(self):
4633 self.cli.send(MSG)
4634
4635 def testSend(self):
4636 self.serv.send(MSG)
4637
4638 def _testSend(self):
4639 msg = self.cli.recv(1024)
4640 self.assertEqual(msg, MSG)
4641
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004642
Guido van Rossum24e4af82002-06-12 19:18:08 +00004643class NonBlockingTCPTests(ThreadedTCPSocketTest):
4644
4645 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004646 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004647 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4648
Victor Stinner304315d2018-11-30 13:22:44 +01004649 def assert_sock_timeout(self, sock, timeout):
4650 self.assertEqual(self.serv.gettimeout(), timeout)
4651
4652 blocking = (timeout != 0.0)
4653 self.assertEqual(sock.getblocking(), blocking)
4654
4655 if fcntl is not None:
4656 # When a Python socket has a non-zero timeout, it's switched
4657 # internally to a non-blocking mode. Later, sock.sendall(),
4658 # sock.recv(), and other socket operations use a select() call and
4659 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4660 # timeouts are enforced.
4661 fd_blocking = (timeout is None)
4662
4663 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4664 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4665
Guido van Rossum24e4af82002-06-12 19:18:08 +00004666 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004667 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004668 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004669 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004670
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004671 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004672 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004673
4674 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004675 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004676
4677 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004678 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004679
4680 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004681 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004682
4683 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004684 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004685
4686 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004687 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004688
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004689 @support.cpython_only
4690 def testSetBlocking_overflow(self):
4691 # Issue 15989
4692 import _testcapi
4693 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4694 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004695
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004696 self.serv.setblocking(False)
4697 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004698
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004699 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4700 self.assertIsNone(self.serv.gettimeout())
4701
4702 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4703
Serhiy Storchaka43767632013-11-03 21:31:38 +02004704 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4705 'test needs socket.SOCK_NONBLOCK')
4706 @support.requires_linux_version(2, 6, 28)
4707 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004708 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004709 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004710 self.serv = socket.socket(socket.AF_INET,
4711 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4712 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004713
4714 def _testInitNonBlocking(self):
4715 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004716
Victor Stinner304315d2018-11-30 13:22:44 +01004717 def testInheritFlagsBlocking(self):
4718 # bpo-7995: accept() on a listening socket with a timeout and the
4719 # default timeout is None, the resulting socket must be blocking.
4720 with socket_setdefaulttimeout(None):
4721 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004722 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004723 self.addCleanup(conn.close)
4724 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004725
Victor Stinner304315d2018-11-30 13:22:44 +01004726 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004727 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004728
4729 def testInheritFlagsTimeout(self):
4730 # bpo-7995: accept() on a listening socket with a timeout and the
4731 # default timeout is None, the resulting socket must inherit
4732 # the default timeout.
4733 default_timeout = 20.0
4734 with socket_setdefaulttimeout(default_timeout):
4735 self.serv.settimeout(10)
4736 conn, addr = self.serv.accept()
4737 self.addCleanup(conn.close)
4738 self.assertEqual(conn.gettimeout(), default_timeout)
4739
4740 def _testInheritFlagsTimeout(self):
4741 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004742
Guido van Rossum24e4af82002-06-12 19:18:08 +00004743 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004744 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004745 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004746
4747 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004748 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004749 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004750 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004751 dt = time.monotonic() - start_time
4752 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004753
4754 self.event.set()
4755
Victor Stinner24c62582019-10-30 12:41:43 +01004756 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004757 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004758 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004759
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004760 # connect() completed: non-blocking accept() doesn't block
4761 conn, addr = self.serv.accept()
4762 self.addCleanup(conn.close)
4763 self.assertIsNone(conn.gettimeout())
4764
Guido van Rossum24e4af82002-06-12 19:18:08 +00004765 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004766 # don't connect before event is set to check
4767 # that non-blocking accept() raises BlockingIOError
4768 self.event.wait()
4769
Christian Heimes5e696852008-04-09 08:37:03 +00004770 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004771
Guido van Rossum24e4af82002-06-12 19:18:08 +00004772 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004773 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004774 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004775 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004776 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004777
4778 # the server didn't send data yet: non-blocking recv() fails
4779 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004780 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004781
4782 self.event.set()
4783
Victor Stinner24c62582019-10-30 12:41:43 +01004784 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004785 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004786 self.fail("Error during select call to non-blocking socket.")
4787
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004788 # the server sent data yet: non-blocking recv() doesn't block
4789 msg = conn.recv(len(MSG))
4790 self.assertEqual(msg, MSG)
4791
Guido van Rossum24e4af82002-06-12 19:18:08 +00004792 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004793 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004794
4795 # don't send anything before event is set to check
4796 # that non-blocking recv() raises BlockingIOError
4797 self.event.wait()
4798
4799 # send data: recv() will no longer block
4800 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004801
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004802
Guido van Rossum24e4af82002-06-12 19:18:08 +00004803class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004804 """Unit tests for the object returned by socket.makefile()
4805
Antoine Pitrou834bd812010-10-13 16:17:14 +00004806 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004807 the client connection. You can read from this file to
4808 get output from the server.
4809
Antoine Pitrou834bd812010-10-13 16:17:14 +00004810 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004811 server connection. You can write to this file to send output
4812 to the client.
4813 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004814
Guido van Rossume9f66142002-08-07 15:46:19 +00004815 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004816 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004817 errors = 'strict'
4818 newline = None
4819
4820 read_mode = 'rb'
4821 read_msg = MSG
4822 write_mode = 'wb'
4823 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004824
Guido van Rossum24e4af82002-06-12 19:18:08 +00004825 def __init__(self, methodName='runTest'):
4826 SocketConnectedTest.__init__(self, methodName=methodName)
4827
4828 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004829 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4830 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004831 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004832 self.read_file = self.cli_conn.makefile(
4833 self.read_mode, self.bufsize,
4834 encoding = self.encoding,
4835 errors = self.errors,
4836 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004837
4838 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004839 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004840 self.read_file.close()
4841 self.assertTrue(self.read_file.closed)
4842 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004843 SocketConnectedTest.tearDown(self)
4844
4845 def clientSetUp(self):
4846 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004847 self.write_file = self.serv_conn.makefile(
4848 self.write_mode, self.bufsize,
4849 encoding = self.encoding,
4850 errors = self.errors,
4851 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004852
4853 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004854 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004855 self.write_file.close()
4856 self.assertTrue(self.write_file.closed)
4857 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004858 SocketConnectedTest.clientTearDown(self)
4859
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004860 def testReadAfterTimeout(self):
4861 # Issue #7322: A file object must disallow further reads
4862 # after a timeout has occurred.
4863 self.cli_conn.settimeout(1)
4864 self.read_file.read(3)
4865 # First read raises a timeout
Christian Heimes03c8ddd2020-11-20 09:26:07 +01004866 self.assertRaises(TimeoutError, self.read_file.read, 1)
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004867 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004868 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004869 self.read_file.read(1)
4870 self.assertIn("cannot read from timed out object", str(ctx.exception))
4871
4872 def _testReadAfterTimeout(self):
4873 self.write_file.write(self.write_msg[0:3])
4874 self.write_file.flush()
4875 self.serv_finished.wait()
4876
Guido van Rossum24e4af82002-06-12 19:18:08 +00004877 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004878 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004879 first_seg = self.read_file.read(len(self.read_msg)-3)
4880 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004881 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004882 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004883
4884 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004885 self.write_file.write(self.write_msg)
4886 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004887
Guido van Rossum8c943832002-08-08 01:00:28 +00004888 def testFullRead(self):
4889 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004890 msg = self.read_file.read()
4891 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004892
4893 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004894 self.write_file.write(self.write_msg)
4895 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004896
Guido van Rossum24e4af82002-06-12 19:18:08 +00004897 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004898 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004899 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004900 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004901 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004902 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004903 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004904 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004905 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004906
4907 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004908 self.write_file.write(self.write_msg)
4909 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004910
4911 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004912 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004913 line = self.read_file.readline()
4914 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004915
4916 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004917 self.write_file.write(self.write_msg)
4918 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004919
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004920 def testCloseAfterMakefile(self):
4921 # The file returned by makefile should keep the socket open.
4922 self.cli_conn.close()
4923 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004924 msg = self.read_file.read()
4925 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004926
4927 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004928 self.write_file.write(self.write_msg)
4929 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004930
4931 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004932 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004933 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004934 if isinstance(self.read_msg, str):
4935 msg = msg.decode()
4936 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004937
4938 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004939 self.write_file.write(self.write_msg)
4940 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004941
Tim Peters116d83c2004-03-28 02:20:45 +00004942 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004943 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004944
4945 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004946 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004947
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004948 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004949 self.assertEqual(self.read_file.mode, self.read_mode)
4950 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004951
4952 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004953 self.assertEqual(self.write_file.mode, self.write_mode)
4954 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004955
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004956 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004957 self.read_file.close()
4958 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004959 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004960 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004961
4962 def _testRealClose(self):
4963 pass
4964
4965
Guido van Rossume9f66142002-08-07 15:46:19 +00004966class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4967
4968 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004969
Guido van Rossume9f66142002-08-07 15:46:19 +00004970 In this case (and in this case only), it should be possible to
4971 create a file object, read a line from it, create another file
4972 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004973 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004974 when reading multiple requests from the same socket."""
4975
4976 bufsize = 0 # Use unbuffered mode
4977
4978 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004979 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004980 line = self.read_file.readline() # first line
4981 self.assertEqual(line, b"A. " + self.write_msg) # first line
4982 self.read_file = self.cli_conn.makefile('rb', 0)
4983 line = self.read_file.readline() # second line
4984 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004985
4986 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004987 self.write_file.write(b"A. " + self.write_msg)
4988 self.write_file.write(b"B. " + self.write_msg)
4989 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004990
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004991 def testMakefileClose(self):
4992 # The file returned by makefile should keep the socket open...
4993 self.cli_conn.close()
4994 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004995 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004996 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004997 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004998 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004999
5000 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005001 self.write_file.write(self.write_msg)
5002 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005003
5004 def testMakefileCloseSocketDestroy(self):
5005 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005006 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005007 refcount_after = sys.getrefcount(self.cli_conn)
5008 self.assertEqual(refcount_before - 1, refcount_after)
5009
5010 def _testMakefileCloseSocketDestroy(self):
5011 pass
5012
Antoine Pitrou98b46702010-09-18 22:59:00 +00005013 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00005014 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00005015 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
5016
5017 def testSmallReadNonBlocking(self):
5018 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005019 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
5020 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005021 self.evt1.set()
5022 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005023 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02005024 if first_seg is None:
5025 # Data not arrived (can happen under Windows), wait a bit
5026 time.sleep(0.5)
5027 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005028 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005029 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005030 self.assertEqual(n, 3)
5031 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00005032 self.assertEqual(msg, self.read_msg)
5033 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
5034 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005035
5036 def _testSmallReadNonBlocking(self):
5037 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005038 self.write_file.write(self.write_msg)
5039 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00005040 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03005041 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00005042 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
5043 self.serv_finished.wait(5.0)
5044
5045 def testWriteNonBlocking(self):
5046 self.cli_finished.wait(5.0)
5047 # The client thread can't skip directly - the SkipTest exception
5048 # would appear as a failure.
5049 if self.serv_skipped:
5050 self.skipTest(self.serv_skipped)
5051
5052 def _testWriteNonBlocking(self):
5053 self.serv_skipped = None
5054 self.serv_conn.setblocking(False)
5055 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02005056 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00005057 LIMIT = 10
5058 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00005059 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005060 self.assertGreater(n, 0)
5061 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005062 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005063 if n is None:
5064 # Succeeded
5065 break
5066 self.assertGreater(n, 0)
5067 else:
5068 # Let us know that this test didn't manage to establish
5069 # the expected conditions. This is not a failure in itself but,
5070 # if it happens repeatedly, the test should be fixed.
5071 self.serv_skipped = "failed to saturate the socket buffer"
5072
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005073
Guido van Rossum8c943832002-08-08 01:00:28 +00005074class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5075
5076 bufsize = 1 # Default-buffered for reading; line-buffered for writing
5077
5078
5079class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5080
5081 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00005082
Thomas Woutersb2137042007-02-01 18:02:27 +00005083
Antoine Pitrou834bd812010-10-13 16:17:14 +00005084class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5085 """Tests for socket.makefile() in text mode (rather than binary)"""
5086
5087 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005088 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005089 write_mode = 'wb'
5090 write_msg = MSG
5091 newline = ''
5092
5093
5094class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5095 """Tests for socket.makefile() in text mode (rather than binary)"""
5096
5097 read_mode = 'rb'
5098 read_msg = MSG
5099 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005100 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005101 newline = ''
5102
5103
5104class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5105 """Tests for socket.makefile() in text mode (rather than binary)"""
5106
5107 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005108 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005109 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005110 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005111 newline = ''
5112
5113
Guido van Rossumd8faa362007-04-27 19:54:29 +00005114class NetworkConnectionTest(object):
5115 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005116
Guido van Rossumd8faa362007-04-27 19:54:29 +00005117 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005118 # We're inherited below by BasicTCPTest2, which also inherits
5119 # BasicTCPTest, which defines self.port referenced below.
5120 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005121 self.serv_conn = self.cli
5122
5123class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5124 """Tests that NetworkConnection does not break existing TCP functionality.
5125 """
5126
5127class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005128
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005129 class MockSocket(socket.socket):
5130 def connect(self, *args):
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005131 raise TimeoutError('timed out')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005132
5133 @contextlib.contextmanager
5134 def mocked_socket_module(self):
5135 """Return a socket which times out on connect"""
5136 old_socket = socket.socket
5137 socket.socket = self.MockSocket
5138 try:
5139 yield
5140 finally:
5141 socket.socket = old_socket
5142
5143 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005144 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005145 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005146 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005147 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005148 cli.connect((HOST, port))
5149 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5150
5151 def test_create_connection(self):
5152 # Issue #9792: errors raised by create_connection() should have
5153 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005154 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005155 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005156 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005157
5158 # Issue #16257: create_connection() calls getaddrinfo() against
5159 # 'localhost'. This may result in an IPV6 addr being returned
5160 # as well as an IPV4 one:
5161 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5162 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5163 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5164 #
5165 # create_connection() enumerates through all the addresses returned
5166 # and if it doesn't successfully bind to any of them, it propagates
5167 # the last exception it encountered.
5168 #
5169 # On Solaris, ENETUNREACH is returned in this circumstance instead
5170 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5171 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005172 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005173 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005174
5175 def test_create_connection_timeout(self):
5176 # Issue #9792: create_connection() should not recast timeout errors
5177 # as generic socket errors.
5178 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005179 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005180 socket.create_connection((HOST, 1234))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005181 except TimeoutError:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005182 pass
5183 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005184 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005185 raise
5186 else:
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005187 self.fail('TimeoutError not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005188
Guido van Rossumd8faa362007-04-27 19:54:29 +00005189
5190class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5191
5192 def __init__(self, methodName='runTest'):
5193 SocketTCPTest.__init__(self, methodName=methodName)
5194 ThreadableTest.__init__(self)
5195
5196 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005197 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005198
5199 def clientTearDown(self):
5200 self.cli.close()
5201 self.cli = None
5202 ThreadableTest.clientTearDown(self)
5203
5204 def _justAccept(self):
5205 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005206 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005207
5208 testFamily = _justAccept
5209 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005210 self.cli = socket.create_connection((HOST, self.port),
5211 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005212 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005213 self.assertEqual(self.cli.family, 2)
5214
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005215 testSourceAddress = _justAccept
5216 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005217 self.cli = socket.create_connection((HOST, self.port),
5218 timeout=support.LOOPBACK_TIMEOUT,
5219 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005220 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005221 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005222 # The port number being used is sufficient to show that the bind()
5223 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005224
Guido van Rossumd8faa362007-04-27 19:54:29 +00005225 testTimeoutDefault = _justAccept
5226 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005227 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005228 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005229 socket.setdefaulttimeout(42)
5230 try:
5231 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005232 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005233 finally:
5234 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005235 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005236
5237 testTimeoutNone = _justAccept
5238 def _testTimeoutNone(self):
5239 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005240 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005241 socket.setdefaulttimeout(30)
5242 try:
5243 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005244 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005245 finally:
5246 socket.setdefaulttimeout(None)
5247 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005248
5249 testTimeoutValueNamed = _justAccept
5250 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005251 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005252 self.assertEqual(self.cli.gettimeout(), 30)
5253
5254 testTimeoutValueNonamed = _justAccept
5255 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005256 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005257 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005258 self.assertEqual(self.cli.gettimeout(), 30)
5259
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005260
Guido van Rossumd8faa362007-04-27 19:54:29 +00005261class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5262
5263 def __init__(self, methodName='runTest'):
5264 SocketTCPTest.__init__(self, methodName=methodName)
5265 ThreadableTest.__init__(self)
5266
5267 def clientSetUp(self):
5268 pass
5269
5270 def clientTearDown(self):
5271 self.cli.close()
5272 self.cli = None
5273 ThreadableTest.clientTearDown(self)
5274
5275 def testInsideTimeout(self):
5276 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005277 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005278 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005279 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005280 testOutsideTimeout = testInsideTimeout
5281
5282 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005283 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005284 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005285 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005286
5287 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005288 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005289 self.assertRaises(TimeoutError, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005290
5291
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005292class TCPTimeoutTest(SocketTCPTest):
5293
5294 def testTCPTimeout(self):
5295 def raise_timeout(*args, **kwargs):
5296 self.serv.settimeout(1.0)
5297 self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005298 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005299 "Error generating a timeout exception (TCP)")
5300
5301 def testTimeoutZero(self):
5302 ok = False
5303 try:
5304 self.serv.settimeout(0.0)
5305 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005306 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005307 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005308 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005309 ok = True
5310 except:
5311 self.fail("caught unexpected exception (TCP)")
5312 if not ok:
5313 self.fail("accept() returned success when we did not expect it")
5314
Serhiy Storchaka43767632013-11-03 21:31:38 +02005315 @unittest.skipUnless(hasattr(signal, 'alarm'),
5316 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005317 def testInterruptedTimeout(self):
5318 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005319 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005320 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005321 self.serv.settimeout(5.0) # must be longer than alarm
5322 class Alarm(Exception):
5323 pass
5324 def alarm_handler(signal, frame):
5325 raise Alarm
5326 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5327 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005328 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005329 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005330 foo = self.serv.accept()
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005331 except TimeoutError:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005332 self.fail("caught timeout instead of Alarm")
5333 except Alarm:
5334 pass
5335 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005336 self.fail("caught other exception instead of Alarm:"
5337 " %s(%s):\n%s" %
5338 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005339 else:
5340 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005341 finally:
5342 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005343 except Alarm:
5344 self.fail("got Alarm in wrong place")
5345 finally:
5346 # no alarm can be pending. Safe to restore old handler.
5347 signal.signal(signal.SIGALRM, old_alarm)
5348
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005349class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005350
5351 def testUDPTimeout(self):
5352 def raise_timeout(*args, **kwargs):
5353 self.serv.settimeout(1.0)
5354 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005355 self.assertRaises(TimeoutError, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005356 "Error generating a timeout exception (UDP)")
5357
5358 def testTimeoutZero(self):
5359 ok = False
5360 try:
5361 self.serv.settimeout(0.0)
5362 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005363 except TimeoutError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005364 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005365 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005366 ok = True
5367 except:
5368 self.fail("caught unexpected exception (UDP)")
5369 if not ok:
5370 self.fail("recv() returned success when we did not expect it")
5371
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005372@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5373 'UDPLITE sockets required for this test.')
5374class UDPLITETimeoutTest(SocketUDPLITETest):
5375
5376 def testUDPLITETimeout(self):
5377 def raise_timeout(*args, **kwargs):
5378 self.serv.settimeout(1.0)
5379 self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005380 self.assertRaises(TimeoutError, raise_timeout,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005381 "Error generating a timeout exception (UDPLITE)")
5382
5383 def testTimeoutZero(self):
5384 ok = False
5385 try:
5386 self.serv.settimeout(0.0)
5387 foo = self.serv.recv(1024)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005388 except TimeoutError:
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005389 self.fail("caught timeout instead of error (UDPLITE)")
5390 except OSError:
5391 ok = True
5392 except:
5393 self.fail("caught unexpected exception (UDPLITE)")
5394 if not ok:
5395 self.fail("recv() returned success when we did not expect it")
5396
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005397class TestExceptions(unittest.TestCase):
5398
5399 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005400 self.assertTrue(issubclass(OSError, Exception))
5401 self.assertTrue(issubclass(socket.herror, OSError))
5402 self.assertTrue(issubclass(socket.gaierror, OSError))
5403 self.assertTrue(issubclass(socket.timeout, OSError))
Christian Heimes03c8ddd2020-11-20 09:26:07 +01005404 self.assertIs(socket.error, OSError)
5405 self.assertIs(socket.timeout, TimeoutError)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005406
Yury Selivanovfa22b292016-10-18 16:03:52 -04005407 def test_setblocking_invalidfd(self):
5408 # Regression test for issue #28471
5409
5410 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5411 sock = socket.socket(
5412 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5413 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005414 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005415
5416 with self.assertRaises(OSError):
5417 sock.setblocking(False)
5418
5419
Serhiy Storchaka43767632013-11-03 21:31:38 +02005420@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005421class TestLinuxAbstractNamespace(unittest.TestCase):
5422
5423 UNIX_PATH_MAX = 108
5424
5425 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005426 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005427 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5428 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005429 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005430 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5431 s2.connect(s1.getsockname())
5432 with s1.accept()[0] as s3:
5433 self.assertEqual(s1.getsockname(), address)
5434 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005435
5436 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005437 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005438 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5439 s.bind(address)
5440 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005441
5442 def testNameOverflow(self):
5443 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005444 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005445 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005446
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005447 def testStrName(self):
5448 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005449 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5450 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005451 s.bind("\x00python\x00test\x00")
5452 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005453 finally:
5454 s.close()
5455
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005456 def testBytearrayName(self):
5457 # Check that an abstract name can be passed as a bytearray.
5458 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5459 s.bind(bytearray(b"\x00python\x00test\x00"))
5460 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5461
Serhiy Storchaka43767632013-11-03 21:31:38 +02005462@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005463class TestUnixDomain(unittest.TestCase):
5464
5465 def setUp(self):
5466 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5467
5468 def tearDown(self):
5469 self.sock.close()
5470
5471 def encoded(self, path):
5472 # Return the given path encoded in the file system encoding,
5473 # or skip the test if this is not possible.
5474 try:
5475 return os.fsencode(path)
5476 except UnicodeEncodeError:
5477 self.skipTest(
5478 "Pathname {0!a} cannot be represented in file "
5479 "system encoding {1!r}".format(
5480 path, sys.getfilesystemencoding()))
5481
Antoine Pitrou16374872011-12-16 15:04:12 +01005482 def bind(self, sock, path):
5483 # Bind the socket
5484 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005485 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005486 except OSError as e:
5487 if str(e) == "AF_UNIX path too long":
5488 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005489 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005490 .format(path))
5491 else:
5492 raise
5493
Antoine Pitrou495b5022017-05-02 17:20:00 +02005494 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005495 # Issue #30205 (note getsockname() can return None on OS X)
5496 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005497
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005498 def testStrAddr(self):
5499 # Test binding to and retrieving a normal string pathname.
Hai Shideb01622020-07-06 20:29:49 +08005500 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005501 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005502 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005503 self.assertEqual(self.sock.getsockname(), path)
5504
5505 def testBytesAddr(self):
5506 # Test binding to a bytes pathname.
Hai Shideb01622020-07-06 20:29:49 +08005507 path = os.path.abspath(os_helper.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005508 self.bind(self.sock, self.encoded(path))
Hai Shideb01622020-07-06 20:29:49 +08005509 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005510 self.assertEqual(self.sock.getsockname(), path)
5511
5512 def testSurrogateescapeBind(self):
5513 # Test binding to a valid non-ASCII pathname, with the
5514 # non-ASCII bytes supplied using surrogateescape encoding.
Hai Shideb01622020-07-06 20:29:49 +08005515 path = os.path.abspath(os_helper.TESTFN_UNICODE)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005516 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005517 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Hai Shideb01622020-07-06 20:29:49 +08005518 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005519 self.assertEqual(self.sock.getsockname(), path)
5520
5521 def testUnencodableAddr(self):
5522 # Test binding to a pathname that cannot be encoded in the
5523 # file system encoding.
Hai Shideb01622020-07-06 20:29:49 +08005524 if os_helper.TESTFN_UNENCODABLE is None:
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005525 self.skipTest("No unencodable filename available")
Hai Shideb01622020-07-06 20:29:49 +08005526 path = os.path.abspath(os_helper.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005527 self.bind(self.sock, path)
Hai Shideb01622020-07-06 20:29:49 +08005528 self.addCleanup(os_helper.unlink, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005529 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005530
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005531
Thomas Wouters477c8d52006-05-27 19:21:47 +00005532class BufferIOTest(SocketConnectedTest):
5533 """
5534 Test the buffer versions of socket.recv() and socket.send().
5535 """
5536 def __init__(self, methodName='runTest'):
5537 SocketConnectedTest.__init__(self, methodName=methodName)
5538
Antoine Pitrou25480782010-03-17 22:50:28 +00005539 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005540 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005541 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005542 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005543 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005544 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005545 self.assertEqual(msg, MSG)
5546
Antoine Pitrou25480782010-03-17 22:50:28 +00005547 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005548 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005549 self.serv_conn.send(buf)
5550
Antoine Pitrou25480782010-03-17 22:50:28 +00005551 def testRecvIntoBytearray(self):
5552 buf = bytearray(1024)
5553 nbytes = self.cli_conn.recv_into(buf)
5554 self.assertEqual(nbytes, len(MSG))
5555 msg = buf[:len(MSG)]
5556 self.assertEqual(msg, MSG)
5557
5558 _testRecvIntoBytearray = _testRecvIntoArray
5559
5560 def testRecvIntoMemoryview(self):
5561 buf = bytearray(1024)
5562 nbytes = self.cli_conn.recv_into(memoryview(buf))
5563 self.assertEqual(nbytes, len(MSG))
5564 msg = buf[:len(MSG)]
5565 self.assertEqual(msg, MSG)
5566
5567 _testRecvIntoMemoryview = _testRecvIntoArray
5568
5569 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005570 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005571 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005572 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005573 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005574 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005575 self.assertEqual(msg, MSG)
5576
Antoine Pitrou25480782010-03-17 22:50:28 +00005577 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005578 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005579 self.serv_conn.send(buf)
5580
Antoine Pitrou25480782010-03-17 22:50:28 +00005581 def testRecvFromIntoBytearray(self):
5582 buf = bytearray(1024)
5583 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5584 self.assertEqual(nbytes, len(MSG))
5585 msg = buf[:len(MSG)]
5586 self.assertEqual(msg, MSG)
5587
5588 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5589
5590 def testRecvFromIntoMemoryview(self):
5591 buf = bytearray(1024)
5592 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5593 self.assertEqual(nbytes, len(MSG))
5594 msg = buf[:len(MSG)]
5595 self.assertEqual(msg, MSG)
5596
5597 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5598
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005599 def testRecvFromIntoSmallBuffer(self):
5600 # See issue #20246.
5601 buf = bytearray(8)
5602 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5603
5604 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005605 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005606
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005607 def testRecvFromIntoEmptyBuffer(self):
5608 buf = bytearray()
5609 self.cli_conn.recvfrom_into(buf)
5610 self.cli_conn.recvfrom_into(buf, 0)
5611
5612 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5613
Christian Heimes043d6f62008-01-07 17:19:16 +00005614
5615TIPC_STYPE = 2000
5616TIPC_LOWER = 200
5617TIPC_UPPER = 210
5618
5619def isTipcAvailable():
5620 """Check if the TIPC module is loaded
5621
5622 The TIPC module is not loaded automatically on Ubuntu and probably
5623 other Linux distros.
5624 """
5625 if not hasattr(socket, "AF_TIPC"):
5626 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005627 try:
Inada Naokicfe523b2021-04-27 13:16:28 +09005628 f = open("/proc/modules", encoding="utf-8")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005629 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005630 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005631 # have not the permission to read it.
5632 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005633 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005634 for line in f:
5635 if line.startswith("tipc "):
5636 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005637 return False
5638
Serhiy Storchaka43767632013-11-03 21:31:38 +02005639@unittest.skipUnless(isTipcAvailable(),
5640 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005641class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005642 def testRDM(self):
5643 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5644 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005645 self.addCleanup(srv.close)
5646 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005647
5648 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5649 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5650 TIPC_LOWER, TIPC_UPPER)
5651 srv.bind(srvaddr)
5652
5653 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5654 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5655 cli.sendto(MSG, sendaddr)
5656
5657 msg, recvaddr = srv.recvfrom(1024)
5658
5659 self.assertEqual(cli.getsockname(), recvaddr)
5660 self.assertEqual(msg, MSG)
5661
5662
Serhiy Storchaka43767632013-11-03 21:31:38 +02005663@unittest.skipUnless(isTipcAvailable(),
5664 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005665class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005666 def __init__(self, methodName = 'runTest'):
5667 unittest.TestCase.__init__(self, methodName = methodName)
5668 ThreadableTest.__init__(self)
5669
5670 def setUp(self):
5671 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005672 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005673 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5674 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5675 TIPC_LOWER, TIPC_UPPER)
5676 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005677 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005678 self.serverExplicitReady()
5679 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005680 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005681
5682 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005683 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005684 # accept() call; sleep a little while to avoid it, otherwise
5685 # we could get an exception
5686 time.sleep(0.1)
5687 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005688 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005689 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5690 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5691 self.cli.connect(addr)
5692 self.cliaddr = self.cli.getsockname()
5693
5694 def testStream(self):
5695 msg = self.conn.recv(1024)
5696 self.assertEqual(msg, MSG)
5697 self.assertEqual(self.cliaddr, self.connaddr)
5698
5699 def _testStream(self):
5700 self.cli.send(MSG)
5701 self.cli.close()
5702
5703
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005704class ContextManagersTest(ThreadedTCPSocketTest):
5705
5706 def _testSocketClass(self):
5707 # base test
5708 with socket.socket() as sock:
5709 self.assertFalse(sock._closed)
5710 self.assertTrue(sock._closed)
5711 # close inside with block
5712 with socket.socket() as sock:
5713 sock.close()
5714 self.assertTrue(sock._closed)
5715 # exception inside with block
5716 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005717 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005718 self.assertTrue(sock._closed)
5719
5720 def testCreateConnectionBase(self):
5721 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005722 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005723 data = conn.recv(1024)
5724 conn.sendall(data)
5725
5726 def _testCreateConnectionBase(self):
5727 address = self.serv.getsockname()
5728 with socket.create_connection(address) as sock:
5729 self.assertFalse(sock._closed)
5730 sock.sendall(b'foo')
5731 self.assertEqual(sock.recv(1024), b'foo')
5732 self.assertTrue(sock._closed)
5733
5734 def testCreateConnectionClose(self):
5735 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005736 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005737 data = conn.recv(1024)
5738 conn.sendall(data)
5739
5740 def _testCreateConnectionClose(self):
5741 address = self.serv.getsockname()
5742 with socket.create_connection(address) as sock:
5743 sock.close()
5744 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005745 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005746
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005747
Victor Stinnerdaf45552013-08-28 00:53:59 +02005748class InheritanceTest(unittest.TestCase):
5749 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5750 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005751 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005752 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005753 with socket.socket(socket.AF_INET,
5754 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005755 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005756 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005757
5758 def test_default_inheritable(self):
5759 sock = socket.socket()
5760 with sock:
5761 self.assertEqual(sock.get_inheritable(), False)
5762
5763 def test_dup(self):
5764 sock = socket.socket()
5765 with sock:
5766 newsock = sock.dup()
5767 sock.close()
5768 with newsock:
5769 self.assertEqual(newsock.get_inheritable(), False)
5770
5771 def test_set_inheritable(self):
5772 sock = socket.socket()
5773 with sock:
5774 sock.set_inheritable(True)
5775 self.assertEqual(sock.get_inheritable(), True)
5776
5777 sock.set_inheritable(False)
5778 self.assertEqual(sock.get_inheritable(), False)
5779
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005780 @unittest.skipIf(fcntl is None, "need fcntl")
5781 def test_get_inheritable_cloexec(self):
5782 sock = socket.socket()
5783 with sock:
5784 fd = sock.fileno()
5785 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005786
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005787 # clear FD_CLOEXEC flag
5788 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5789 flags &= ~fcntl.FD_CLOEXEC
5790 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005791
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005792 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005793
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005794 @unittest.skipIf(fcntl is None, "need fcntl")
5795 def test_set_inheritable_cloexec(self):
5796 sock = socket.socket()
5797 with sock:
5798 fd = sock.fileno()
5799 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5800 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005801
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005802 sock.set_inheritable(True)
5803 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5804 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005805
5806
Victor Stinnerdaf45552013-08-28 00:53:59 +02005807 def test_socketpair(self):
5808 s1, s2 = socket.socketpair()
5809 self.addCleanup(s1.close)
5810 self.addCleanup(s2.close)
5811 self.assertEqual(s1.get_inheritable(), False)
5812 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005813
5814
5815@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5816 "SOCK_NONBLOCK not defined")
5817class NonblockConstantTest(unittest.TestCase):
5818 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5819 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005820 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005821 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005822 self.assertTrue(
5823 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005824 if timeout == 0:
5825 # timeout == 0: means that getblocking() must be False.
5826 self.assertFalse(s.getblocking())
5827 else:
5828 # If timeout > 0, the socket will be in a "blocking" mode
5829 # from the standpoint of the Python API. For Python socket
5830 # object, "blocking" means that operations like 'sock.recv()'
5831 # will block. Internally, file descriptors for
5832 # "blocking" Python sockets *with timeouts* are in a
5833 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5834 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5835 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005836 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005837 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005838 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005839 self.assertFalse(
5840 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005841 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005842
Charles-François Natali239bb962011-06-03 12:55:15 +02005843 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005844 def test_SOCK_NONBLOCK(self):
5845 # a lot of it seems silly and redundant, but I wanted to test that
5846 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005847 with socket.socket(socket.AF_INET,
5848 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5849 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005850 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005851 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005852 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005853 self.checkNonblock(s)
5854 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005855 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005856 s.settimeout(2.0)
5857 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005858 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005859 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005860 # defaulttimeout
5861 t = socket.getdefaulttimeout()
5862 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005863 with socket.socket() as s:
5864 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005865 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005866 with socket.socket() as s:
5867 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005868 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005869 with socket.socket() as s:
5870 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005871 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005872 with socket.socket() as s:
5873 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005874 socket.setdefaulttimeout(t)
5875
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005876
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005877@unittest.skipUnless(os.name == "nt", "Windows specific")
5878@unittest.skipUnless(multiprocessing, "need multiprocessing")
5879class TestSocketSharing(SocketTCPTest):
5880 # This must be classmethod and not staticmethod or multiprocessing
5881 # won't be able to bootstrap it.
5882 @classmethod
5883 def remoteProcessServer(cls, q):
5884 # Recreate socket from shared data
5885 sdata = q.get()
5886 message = q.get()
5887
5888 s = socket.fromshare(sdata)
5889 s2, c = s.accept()
5890
5891 # Send the message
5892 s2.sendall(message)
5893 s2.close()
5894 s.close()
5895
5896 def testShare(self):
5897 # Transfer the listening server socket to another process
5898 # and service it from there.
5899
5900 # Create process:
5901 q = multiprocessing.Queue()
5902 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5903 p.start()
5904
5905 # Get the shared socket data
5906 data = self.serv.share(p.pid)
5907
5908 # Pass the shared socket to the other process
5909 addr = self.serv.getsockname()
5910 self.serv.close()
5911 q.put(data)
5912
5913 # The data that the server will send us
5914 message = b"slapmahfro"
5915 q.put(message)
5916
5917 # Connect
5918 s = socket.create_connection(addr)
5919 # listen for the data
5920 m = []
5921 while True:
5922 data = s.recv(100)
5923 if not data:
5924 break
5925 m.append(data)
5926 s.close()
5927 received = b"".join(m)
5928 self.assertEqual(received, message)
5929 p.join()
5930
5931 def testShareLength(self):
5932 data = self.serv.share(os.getpid())
5933 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5934 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5935
5936 def compareSockets(self, org, other):
5937 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005938 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005939 self.assertEqual(org.gettimeout(), None)
5940 self.assertEqual(org.gettimeout(), other.gettimeout())
5941
5942 self.assertEqual(org.family, other.family)
5943 self.assertEqual(org.type, other.type)
5944 # If the user specified "0" for proto, then
5945 # internally windows will have picked the correct value.
5946 # Python introspection on the socket however will still return
5947 # 0. For the shared socket, the python value is recreated
5948 # from the actual value, so it may not compare correctly.
5949 if org.proto != 0:
5950 self.assertEqual(org.proto, other.proto)
5951
5952 def testShareLocal(self):
5953 data = self.serv.share(os.getpid())
5954 s = socket.fromshare(data)
5955 try:
5956 self.compareSockets(self.serv, s)
5957 finally:
5958 s.close()
5959
5960 def testTypes(self):
5961 families = [socket.AF_INET, socket.AF_INET6]
5962 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5963 for f in families:
5964 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005965 try:
5966 source = socket.socket(f, t)
5967 except OSError:
5968 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005969 try:
5970 data = source.share(os.getpid())
5971 shared = socket.fromshare(data)
5972 try:
5973 self.compareSockets(source, shared)
5974 finally:
5975 shared.close()
5976 finally:
5977 source.close()
5978
5979
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005980class SendfileUsingSendTest(ThreadedTCPSocketTest):
5981 """
5982 Test the send() implementation of socket.sendfile().
5983 """
5984
Victor Stinner8c663fd2017-11-08 14:44:44 -08005985 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005986 BUFSIZE = 8192
5987 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005988 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005989
5990 @classmethod
5991 def setUpClass(cls):
5992 def chunks(total, step):
5993 assert total >= step
5994 while total > step:
5995 yield step
5996 total -= step
5997 if total:
5998 yield total
5999
6000 chunk = b"".join([random.choice(string.ascii_letters).encode()
6001 for i in range(cls.BUFSIZE)])
Hai Shideb01622020-07-06 20:29:49 +08006002 with open(os_helper.TESTFN, 'wb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006003 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
6004 f.write(chunk)
Hai Shideb01622020-07-06 20:29:49 +08006005 with open(os_helper.TESTFN, 'rb') as f:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006006 cls.FILEDATA = f.read()
6007 assert len(cls.FILEDATA) == cls.FILESIZE
6008
6009 @classmethod
6010 def tearDownClass(cls):
Hai Shideb01622020-07-06 20:29:49 +08006011 os_helper.unlink(os_helper.TESTFN)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006012
6013 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01006014 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006015 conn, addr = self.serv.accept()
6016 conn.settimeout(self.TIMEOUT)
6017 self.addCleanup(conn.close)
6018 return conn
6019
6020 def recv_data(self, conn):
6021 received = []
6022 while True:
6023 chunk = conn.recv(self.BUFSIZE)
6024 if not chunk:
6025 break
6026 received.append(chunk)
6027 return b''.join(received)
6028
6029 def meth_from_sock(self, sock):
6030 # Depending on the mixin class being run return either send()
6031 # or sendfile() method implementation.
6032 return getattr(sock, "_sendfile_use_send")
6033
6034 # regular file
6035
6036 def _testRegularFile(self):
6037 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006038 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006039 with socket.create_connection(address) as sock, file as file:
6040 meth = self.meth_from_sock(sock)
6041 sent = meth(file)
6042 self.assertEqual(sent, self.FILESIZE)
6043 self.assertEqual(file.tell(), self.FILESIZE)
6044
6045 def testRegularFile(self):
6046 conn = self.accept_conn()
6047 data = self.recv_data(conn)
6048 self.assertEqual(len(data), self.FILESIZE)
6049 self.assertEqual(data, self.FILEDATA)
6050
6051 # non regular file
6052
6053 def _testNonRegularFile(self):
6054 address = self.serv.getsockname()
6055 file = io.BytesIO(self.FILEDATA)
6056 with socket.create_connection(address) as sock, file as file:
6057 sent = sock.sendfile(file)
6058 self.assertEqual(sent, self.FILESIZE)
6059 self.assertEqual(file.tell(), self.FILESIZE)
6060 self.assertRaises(socket._GiveupOnSendfile,
6061 sock._sendfile_use_sendfile, file)
6062
6063 def testNonRegularFile(self):
6064 conn = self.accept_conn()
6065 data = self.recv_data(conn)
6066 self.assertEqual(len(data), self.FILESIZE)
6067 self.assertEqual(data, self.FILEDATA)
6068
6069 # empty file
6070
6071 def _testEmptyFileSend(self):
6072 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006073 filename = os_helper.TESTFN + "2"
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006074 with open(filename, 'wb'):
Hai Shideb01622020-07-06 20:29:49 +08006075 self.addCleanup(os_helper.unlink, filename)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006076 file = open(filename, 'rb')
6077 with socket.create_connection(address) as sock, file as file:
6078 meth = self.meth_from_sock(sock)
6079 sent = meth(file)
6080 self.assertEqual(sent, 0)
6081 self.assertEqual(file.tell(), 0)
6082
6083 def testEmptyFileSend(self):
6084 conn = self.accept_conn()
6085 data = self.recv_data(conn)
6086 self.assertEqual(data, b"")
6087
6088 # offset
6089
6090 def _testOffset(self):
6091 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006092 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006093 with socket.create_connection(address) as sock, file as file:
6094 meth = self.meth_from_sock(sock)
6095 sent = meth(file, offset=5000)
6096 self.assertEqual(sent, self.FILESIZE - 5000)
6097 self.assertEqual(file.tell(), self.FILESIZE)
6098
6099 def testOffset(self):
6100 conn = self.accept_conn()
6101 data = self.recv_data(conn)
6102 self.assertEqual(len(data), self.FILESIZE - 5000)
6103 self.assertEqual(data, self.FILEDATA[5000:])
6104
6105 # count
6106
6107 def _testCount(self):
6108 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006109 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006110 sock = socket.create_connection(address,
6111 timeout=support.LOOPBACK_TIMEOUT)
6112 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006113 count = 5000007
6114 meth = self.meth_from_sock(sock)
6115 sent = meth(file, count=count)
6116 self.assertEqual(sent, count)
6117 self.assertEqual(file.tell(), count)
6118
6119 def testCount(self):
6120 count = 5000007
6121 conn = self.accept_conn()
6122 data = self.recv_data(conn)
6123 self.assertEqual(len(data), count)
6124 self.assertEqual(data, self.FILEDATA[:count])
6125
6126 # count small
6127
6128 def _testCountSmall(self):
6129 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006130 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006131 sock = socket.create_connection(address,
6132 timeout=support.LOOPBACK_TIMEOUT)
6133 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006134 count = 1
6135 meth = self.meth_from_sock(sock)
6136 sent = meth(file, count=count)
6137 self.assertEqual(sent, count)
6138 self.assertEqual(file.tell(), count)
6139
6140 def testCountSmall(self):
6141 count = 1
6142 conn = self.accept_conn()
6143 data = self.recv_data(conn)
6144 self.assertEqual(len(data), count)
6145 self.assertEqual(data, self.FILEDATA[:count])
6146
6147 # count + offset
6148
6149 def _testCountWithOffset(self):
6150 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006151 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006152 with socket.create_connection(address, timeout=2) as sock, file as file:
6153 count = 100007
6154 meth = self.meth_from_sock(sock)
6155 sent = meth(file, offset=2007, count=count)
6156 self.assertEqual(sent, count)
6157 self.assertEqual(file.tell(), count + 2007)
6158
6159 def testCountWithOffset(self):
6160 count = 100007
6161 conn = self.accept_conn()
6162 data = self.recv_data(conn)
6163 self.assertEqual(len(data), count)
6164 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6165
6166 # non blocking sockets are not supposed to work
6167
6168 def _testNonBlocking(self):
6169 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006170 file = open(os_helper.TESTFN, 'rb')
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006171 with socket.create_connection(address) as sock, file as file:
6172 sock.setblocking(False)
6173 meth = self.meth_from_sock(sock)
6174 self.assertRaises(ValueError, meth, file)
6175 self.assertRaises(ValueError, sock.sendfile, file)
6176
6177 def testNonBlocking(self):
6178 conn = self.accept_conn()
6179 if conn.recv(8192):
6180 self.fail('was not supposed to receive any data')
6181
6182 # timeout (non-triggered)
6183
6184 def _testWithTimeout(self):
6185 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006186 file = open(os_helper.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006187 sock = socket.create_connection(address,
6188 timeout=support.LOOPBACK_TIMEOUT)
6189 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006190 meth = self.meth_from_sock(sock)
6191 sent = meth(file)
6192 self.assertEqual(sent, self.FILESIZE)
6193
6194 def testWithTimeout(self):
6195 conn = self.accept_conn()
6196 data = self.recv_data(conn)
6197 self.assertEqual(len(data), self.FILESIZE)
6198 self.assertEqual(data, self.FILEDATA)
6199
6200 # timeout (triggered)
6201
6202 def _testWithTimeoutTriggeredSend(self):
6203 address = self.serv.getsockname()
Hai Shideb01622020-07-06 20:29:49 +08006204 with open(os_helper.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006205 with socket.create_connection(address) as sock:
6206 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006207 meth = self.meth_from_sock(sock)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01006208 self.assertRaises(TimeoutError, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006209
6210 def testWithTimeoutTriggeredSend(self):
6211 conn = self.accept_conn()
6212 conn.recv(88192)
6213
6214 # errors
6215
6216 def _test_errors(self):
6217 pass
6218
6219 def test_errors(self):
Hai Shideb01622020-07-06 20:29:49 +08006220 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006221 with socket.socket(type=socket.SOCK_DGRAM) as s:
6222 meth = self.meth_from_sock(s)
6223 self.assertRaisesRegex(
6224 ValueError, "SOCK_STREAM", meth, file)
Inada Naokicfe523b2021-04-27 13:16:28 +09006225 with open(os_helper.TESTFN, encoding="utf-8") as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006226 with socket.socket() as s:
6227 meth = self.meth_from_sock(s)
6228 self.assertRaisesRegex(
6229 ValueError, "binary mode", meth, file)
Hai Shideb01622020-07-06 20:29:49 +08006230 with open(os_helper.TESTFN, 'rb') as file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006231 with socket.socket() as s:
6232 meth = self.meth_from_sock(s)
6233 self.assertRaisesRegex(TypeError, "positive integer",
6234 meth, file, count='2')
6235 self.assertRaisesRegex(TypeError, "positive integer",
6236 meth, file, count=0.1)
6237 self.assertRaisesRegex(ValueError, "positive integer",
6238 meth, file, count=0)
6239 self.assertRaisesRegex(ValueError, "positive integer",
6240 meth, file, count=-1)
6241
6242
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006243@unittest.skipUnless(hasattr(os, "sendfile"),
6244 'os.sendfile() required for this test.')
6245class SendfileUsingSendfileTest(SendfileUsingSendTest):
6246 """
6247 Test the sendfile() implementation of socket.sendfile().
6248 """
6249 def meth_from_sock(self, sock):
6250 return getattr(sock, "_sendfile_use_sendfile")
6251
Christian Heimes48371412016-09-06 00:37:46 +02006252
6253@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006254class LinuxKernelCryptoAPI(unittest.TestCase):
6255 # tests for AF_ALG
6256 def create_alg(self, typ, name):
6257 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006258 try:
6259 sock.bind((typ, name))
6260 except FileNotFoundError as e:
6261 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006262 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006263 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006264 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006265 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006266
Victor Stinner86afc1f2017-11-30 13:58:43 +01006267 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6268 # at least on ppc64le architecture
6269 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006270 def test_sha256(self):
6271 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6272 "177a9cb410ff61f20015ad")
6273 with self.create_alg('hash', 'sha256') as algo:
6274 op, _ = algo.accept()
6275 with op:
6276 op.sendall(b"abc")
6277 self.assertEqual(op.recv(512), expected)
6278
6279 op, _ = algo.accept()
6280 with op:
6281 op.send(b'a', socket.MSG_MORE)
6282 op.send(b'b', socket.MSG_MORE)
6283 op.send(b'c', socket.MSG_MORE)
6284 op.send(b'')
6285 self.assertEqual(op.recv(512), expected)
6286
6287 def test_hmac_sha1(self):
6288 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6289 with self.create_alg('hash', 'hmac(sha1)') as algo:
6290 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6291 op, _ = algo.accept()
6292 with op:
6293 op.sendall(b"what do ya want for nothing?")
6294 self.assertEqual(op.recv(512), expected)
6295
Christian Heimese084f842016-09-11 20:11:30 +02006296 # Although it should work with 3.19 and newer the test blocks on
6297 # Ubuntu 15.10 with Kernel 4.2.0-19.
6298 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006299 def test_aes_cbc(self):
6300 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6301 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6302 msg = b"Single block msg"
6303 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6304 msglen = len(msg)
6305 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6306 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6307 op, _ = algo.accept()
6308 with op:
6309 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6310 flags=socket.MSG_MORE)
6311 op.sendall(msg)
6312 self.assertEqual(op.recv(msglen), ciphertext)
6313
6314 op, _ = algo.accept()
6315 with op:
6316 op.sendmsg_afalg([ciphertext],
6317 op=socket.ALG_OP_DECRYPT, iv=iv)
6318 self.assertEqual(op.recv(msglen), msg)
6319
6320 # long message
6321 multiplier = 1024
6322 longmsg = [msg] * multiplier
6323 op, _ = algo.accept()
6324 with op:
6325 op.sendmsg_afalg(longmsg,
6326 op=socket.ALG_OP_ENCRYPT, iv=iv)
6327 enc = op.recv(msglen * multiplier)
6328 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006329 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006330
6331 op, _ = algo.accept()
6332 with op:
6333 op.sendmsg_afalg([enc],
6334 op=socket.ALG_OP_DECRYPT, iv=iv)
6335 dec = op.recv(msglen * multiplier)
6336 self.assertEqual(len(dec), msglen * multiplier)
6337 self.assertEqual(dec, msg * multiplier)
6338
matejcik9764c152017-02-16 14:41:31 +01006339 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006340 def test_aead_aes_gcm(self):
6341 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6342 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6343 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6344 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6345 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6346 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6347
6348 taglen = len(expected_tag)
6349 assoclen = len(assoc)
6350
6351 with self.create_alg('aead', 'gcm(aes)') as algo:
6352 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6353 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6354 None, taglen)
6355
6356 # send assoc, plain and tag buffer in separate steps
6357 op, _ = algo.accept()
6358 with op:
6359 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6360 assoclen=assoclen, flags=socket.MSG_MORE)
6361 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006362 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006363 res = op.recv(assoclen + len(plain) + taglen)
6364 self.assertEqual(expected_ct, res[assoclen:-taglen])
6365 self.assertEqual(expected_tag, res[-taglen:])
6366
6367 # now with msg
6368 op, _ = algo.accept()
6369 with op:
matejcik9764c152017-02-16 14:41:31 +01006370 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006371 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6372 assoclen=assoclen)
6373 res = op.recv(assoclen + len(plain) + taglen)
6374 self.assertEqual(expected_ct, res[assoclen:-taglen])
6375 self.assertEqual(expected_tag, res[-taglen:])
6376
6377 # create anc data manually
6378 pack_uint32 = struct.Struct('I').pack
6379 op, _ = algo.accept()
6380 with op:
matejcik9764c152017-02-16 14:41:31 +01006381 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006382 op.sendmsg(
6383 [msg],
6384 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6385 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6386 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6387 )
6388 )
matejcik9764c152017-02-16 14:41:31 +01006389 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006390 self.assertEqual(expected_ct, res[assoclen:-taglen])
6391 self.assertEqual(expected_tag, res[-taglen:])
6392
6393 # decrypt and verify
6394 op, _ = algo.accept()
6395 with op:
6396 msg = assoc + expected_ct + expected_tag
6397 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6398 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006399 res = op.recv(len(msg) - taglen)
6400 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006401
Christian Heimese084f842016-09-11 20:11:30 +02006402 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006403 def test_drbg_pr_sha256(self):
6404 # deterministic random bit generator, prediction resistance, sha256
6405 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6406 extra_seed = os.urandom(32)
6407 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6408 op, _ = algo.accept()
6409 with op:
6410 rn = op.recv(32)
6411 self.assertEqual(len(rn), 32)
6412
6413 def test_sendmsg_afalg_args(self):
6414 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006415 with sock:
6416 with self.assertRaises(TypeError):
6417 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006418
Christian Heimes02b30352016-09-11 19:49:56 +02006419 with self.assertRaises(TypeError):
6420 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006421
Christian Heimes02b30352016-09-11 19:49:56 +02006422 with self.assertRaises(TypeError):
6423 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006424
Christian Heimes02b30352016-09-11 19:49:56 +02006425 with self.assertRaises(TypeError):
6426 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006427
Christian Heimes02b30352016-09-11 19:49:56 +02006428 with self.assertRaises(TypeError):
6429 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6430
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006431 def test_length_restriction(self):
6432 # bpo-35050, off-by-one error in length check
6433 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6434 self.addCleanup(sock.close)
6435
6436 # salg_type[14]
6437 with self.assertRaises(FileNotFoundError):
6438 sock.bind(("t" * 13, "name"))
6439 with self.assertRaisesRegex(ValueError, "type too long"):
6440 sock.bind(("t" * 14, "name"))
6441
6442 # salg_name[64]
6443 with self.assertRaises(FileNotFoundError):
6444 sock.bind(("type", "n" * 63))
6445 with self.assertRaisesRegex(ValueError, "name too long"):
6446 sock.bind(("type", "n" * 64))
6447
6448
animalize19e7d482018-02-27 02:10:36 +08006449@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6450class TestMSWindowsTCPFlags(unittest.TestCase):
6451 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006452 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006453 'TCP_MAXSEG',
6454 'TCP_NODELAY',
6455 # available starting with Windows 10 1607
6456 'TCP_FASTOPEN',
6457 # available starting with Windows 10 1703
6458 'TCP_KEEPCNT',
6459 # available starting with Windows 10 1709
6460 'TCP_KEEPIDLE',
6461 'TCP_KEEPINTVL'
6462 }
6463
6464 def test_new_tcp_flags(self):
6465 provided = [s for s in dir(socket) if s.startswith('TCP')]
6466 unknown = [s for s in provided if s not in self.knownTCPFlags]
6467
6468 self.assertEqual([], unknown,
6469 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006470
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006471
6472class CreateServerTest(unittest.TestCase):
6473
6474 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006475 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006476 with socket.create_server(("127.0.0.1", port)) as sock:
6477 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6478 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006479 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006480 with socket.create_server(("::1", port),
6481 family=socket.AF_INET6) as sock:
6482 self.assertEqual(sock.getsockname()[0], "::1")
6483 self.assertEqual(sock.getsockname()[1], port)
6484
6485 def test_family_and_type(self):
6486 with socket.create_server(("127.0.0.1", 0)) as sock:
6487 self.assertEqual(sock.family, socket.AF_INET)
6488 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006489 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006490 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6491 self.assertEqual(s.family, socket.AF_INET6)
6492 self.assertEqual(sock.type, socket.SOCK_STREAM)
6493
6494 def test_reuse_port(self):
6495 if not hasattr(socket, "SO_REUSEPORT"):
6496 with self.assertRaises(ValueError):
6497 socket.create_server(("localhost", 0), reuse_port=True)
6498 else:
6499 with socket.create_server(("localhost", 0)) as sock:
6500 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6501 self.assertEqual(opt, 0)
6502 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6503 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6504 self.assertNotEqual(opt, 0)
6505
6506 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6507 not hasattr(_socket, 'IPV6_V6ONLY'),
6508 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006509 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006510 def test_ipv6_only_default(self):
6511 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6512 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6513
6514 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6515 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006516 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006517 def test_dualstack_ipv6_family(self):
6518 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6519 dualstack_ipv6=True) as sock:
6520 self.assertEqual(sock.family, socket.AF_INET6)
6521
6522
6523class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006524 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006525
6526 def setUp(self):
6527 self.thread = None
6528
6529 def tearDown(self):
6530 if self.thread is not None:
6531 self.thread.join(self.timeout)
6532
6533 def echo_server(self, sock):
6534 def run(sock):
6535 with sock:
6536 conn, _ = sock.accept()
6537 with conn:
6538 event.wait(self.timeout)
6539 msg = conn.recv(1024)
6540 if not msg:
6541 return
6542 conn.sendall(msg)
6543
6544 event = threading.Event()
6545 sock.settimeout(self.timeout)
6546 self.thread = threading.Thread(target=run, args=(sock, ))
6547 self.thread.start()
6548 event.set()
6549
6550 def echo_client(self, addr, family):
6551 with socket.socket(family=family) as sock:
6552 sock.settimeout(self.timeout)
6553 sock.connect(addr)
6554 sock.sendall(b'foo')
6555 self.assertEqual(sock.recv(1024), b'foo')
6556
6557 def test_tcp4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006558 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006559 with socket.create_server(("", port)) as sock:
6560 self.echo_server(sock)
6561 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6562
Serhiy Storchaka16994912020-04-25 10:06:29 +03006563 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006564 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006565 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006566 with socket.create_server(("", port),
6567 family=socket.AF_INET6) as sock:
6568 self.echo_server(sock)
6569 self.echo_client(("::1", port), socket.AF_INET6)
6570
6571 # --- dual stack tests
6572
6573 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6574 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006575 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006576 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006577 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006578 with socket.create_server(("", port), family=socket.AF_INET6,
6579 dualstack_ipv6=True) as sock:
6580 self.echo_server(sock)
6581 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6582
6583 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6584 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006585 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006586 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006587 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006588 with socket.create_server(("", port), family=socket.AF_INET6,
6589 dualstack_ipv6=True) as sock:
6590 self.echo_server(sock)
6591 self.echo_client(("::1", port), socket.AF_INET6)
6592
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006593@requireAttrs(socket, "send_fds")
6594@requireAttrs(socket, "recv_fds")
6595@requireAttrs(socket, "AF_UNIX")
6596class SendRecvFdsTests(unittest.TestCase):
6597 def testSendAndRecvFds(self):
6598 def close_pipes(pipes):
6599 for fd1, fd2 in pipes:
6600 os.close(fd1)
6601 os.close(fd2)
6602
6603 def close_fds(fds):
6604 for fd in fds:
6605 os.close(fd)
6606
6607 # send 10 file descriptors
6608 pipes = [os.pipe() for _ in range(10)]
6609 self.addCleanup(close_pipes, pipes)
6610 fds = [rfd for rfd, wfd in pipes]
6611
6612 # use a UNIX socket pair to exchange file descriptors locally
6613 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6614 with sock1, sock2:
6615 socket.send_fds(sock1, [MSG], fds)
6616 # request more data and file descriptors than expected
6617 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6618 self.addCleanup(close_fds, fds2)
6619
6620 self.assertEqual(msg, MSG)
6621 self.assertEqual(len(fds2), len(fds))
6622 self.assertEqual(flags, 0)
6623 # don't test addr
6624
6625 # test that file descriptors are connected
6626 for index, fds in enumerate(pipes):
6627 rfd, wfd = fds
6628 os.write(wfd, str(index).encode())
6629
6630 for index, rfd in enumerate(fds2):
6631 data = os.read(rfd, 100)
6632 self.assertEqual(data, str(index).encode())
6633
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006634
Guido van Rossumb995eb72002-07-31 16:08:40 +00006635def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006636 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006637 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006638 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6639 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006640
6641 tests.extend([
6642 NonBlockingTCPTests,
6643 FileObjectClassTestCase,
6644 UnbufferedFileObjectClassTestCase,
6645 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006646 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006647 UnicodeReadFileObjectClassTestCase,
6648 UnicodeWriteFileObjectClassTestCase,
6649 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006650 NetworkConnectionNoServer,
6651 NetworkConnectionAttributesTest,
6652 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006653 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006654 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006655 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006656 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006657 tests.append(BasicSocketPairTest)
6658 tests.append(TestUnixDomain)
6659 tests.append(TestLinuxAbstractNamespace)
6660 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006661 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006662 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006663 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006664 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006665 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006666 BasicVSOCKTest,
6667 ThreadedVSOCKSocketStreamTest,
6668 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006669 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006670 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006671 CmsgMacroTests,
6672 SendmsgUDPTest,
6673 RecvmsgUDPTest,
6674 RecvmsgIntoUDPTest,
6675 SendmsgUDP6Test,
6676 RecvmsgUDP6Test,
6677 RecvmsgRFC3542AncillaryUDP6Test,
6678 RecvmsgIntoRFC3542AncillaryUDP6Test,
6679 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006680 SendmsgUDPLITETest,
6681 RecvmsgUDPLITETest,
6682 RecvmsgIntoUDPLITETest,
6683 SendmsgUDPLITE6Test,
6684 RecvmsgUDPLITE6Test,
6685 RecvmsgRFC3542AncillaryUDPLITE6Test,
6686 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6687 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006688 SendmsgTCPTest,
6689 RecvmsgTCPTest,
6690 RecvmsgIntoTCPTest,
6691 SendmsgSCTPStreamTest,
6692 RecvmsgSCTPStreamTest,
6693 RecvmsgIntoSCTPStreamTest,
6694 SendmsgUnixStreamTest,
6695 RecvmsgUnixStreamTest,
6696 RecvmsgIntoUnixStreamTest,
6697 RecvmsgSCMRightsStreamTest,
6698 RecvmsgIntoSCMRightsStreamTest,
6699 # These are slow when setitimer() is not available
6700 InterruptedRecvTimeoutTest,
6701 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006702 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006703 SendfileUsingSendTest,
6704 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006705 ])
animalize19e7d482018-02-27 02:10:36 +08006706 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006707
Hai Shie80697d2020-05-28 06:10:27 +08006708 thread_info = threading_helper.threading_setup()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006709 support.run_unittest(*tests)
Hai Shie80697d2020-05-28 06:10:27 +08006710 threading_helper.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006711
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006712
Guido van Rossum24e4af82002-06-12 19:18:08 +00006713if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006714 test_main()