blob: cff07b46c7a2a4c73a43f31f8b3827b49dcbb4e0 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Serhiy Storchaka16994912020-04-25 10:06:29 +03003from test.support import socket_helper
Hai Shie80697d2020-05-28 06:10:27 +08004from test.support import threading_helper
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01008import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00009import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +000010import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100011import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
Michael Felt56614592018-12-26 04:34:37 +010017import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000018import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020025import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010026import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020027import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020028import _thread as thread
29import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000030try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000031 import multiprocessing
32except ImportError:
33 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020034try:
35 import fcntl
36except ImportError:
37 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000038
Serhiy Storchaka16994912020-04-25 10:06:29 +030039HOST = socket_helper.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010040# test unicode string and carriage return
41MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Barry Warsawcf3d4b51997-01-03 20:03:32 +000042
caaveryeffc12f2017-09-06 18:18:10 -040043VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010044AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040045
Victor Stinner45df8202010-04-28 22:31:17 +000046try:
Victor Stinnere254e532014-07-26 14:36:55 +020047 import _socket
48except ImportError:
49 _socket = None
50
caaveryeffc12f2017-09-06 18:18:10 -040051def get_cid():
52 if fcntl is None:
53 return None
Pablo Galindo6eb96192020-04-01 01:48:37 +010054 if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
55 return None
caaveryeffc12f2017-09-06 18:18:10 -040056 try:
57 with open("/dev/vsock", "rb") as f:
58 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
59 except OSError:
60 return None
61 else:
62 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000063
Charles-François Natali47413c12011-10-06 19:47:44 +020064def _have_socket_can():
65 """Check whether CAN sockets are supported on this host."""
66 try:
67 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020068 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020069 return False
70 else:
71 s.close()
72 return True
73
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040074def _have_socket_can_isotp():
75 """Check whether CAN ISOTP sockets are supported on this host."""
76 try:
77 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
78 except (AttributeError, OSError):
79 return False
80 else:
81 s.close()
82 return True
83
karl ding360371f2020-04-29 15:31:19 -070084def _have_socket_can_j1939():
85 """Check whether CAN J1939 sockets are supported on this host."""
86 try:
87 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
88 except (AttributeError, OSError):
89 return False
90 else:
91 s.close()
92 return True
93
Charles-François Natali10b8cf42011-11-10 19:21:37 +010094def _have_socket_rds():
95 """Check whether RDS sockets are supported on this host."""
96 try:
97 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
98 except (AttributeError, OSError):
99 return False
100 else:
101 s.close()
102 return True
103
Christian Heimes48371412016-09-06 00:37:46 +0200104def _have_socket_alg():
105 """Check whether AF_ALG sockets are supported on this host."""
106 try:
107 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
108 except (AttributeError, OSError):
109 return False
110 else:
111 s.close()
112 return True
113
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700114def _have_socket_qipcrtr():
115 """Check whether AF_QIPCRTR sockets are supported on this host."""
116 try:
117 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
118 except (AttributeError, OSError):
119 return False
120 else:
121 s.close()
122 return True
123
caaveryeffc12f2017-09-06 18:18:10 -0400124def _have_socket_vsock():
125 """Check whether AF_VSOCK sockets are supported on this host."""
126 ret = get_cid() is not None
127 return ret
128
Yury Selivanovf11b4602018-01-28 17:27:38 -0500129
Greg Bowser8fbece12019-08-02 16:29:52 -0400130def _have_socket_bluetooth():
131 """Check whether AF_BLUETOOTH sockets are supported on this host."""
132 try:
133 # RFCOMM is supported by all platforms with bluetooth support. Windows
134 # does not support omitting the protocol.
135 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
136 except (AttributeError, OSError):
137 return False
138 else:
139 s.close()
140 return True
141
142
Victor Stinner304315d2018-11-30 13:22:44 +0100143@contextlib.contextmanager
144def socket_setdefaulttimeout(timeout):
145 old_timeout = socket.getdefaulttimeout()
146 try:
147 socket.setdefaulttimeout(timeout)
148 yield
149 finally:
150 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500151
152
Charles-François Natali47413c12011-10-06 19:47:44 +0200153HAVE_SOCKET_CAN = _have_socket_can()
154
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400155HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
156
karl ding360371f2020-04-29 15:31:19 -0700157HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939()
158
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100159HAVE_SOCKET_RDS = _have_socket_rds()
160
Christian Heimes48371412016-09-06 00:37:46 +0200161HAVE_SOCKET_ALG = _have_socket_alg()
162
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700163HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
164
caaveryeffc12f2017-09-06 18:18:10 -0400165HAVE_SOCKET_VSOCK = _have_socket_vsock()
166
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700167HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
168
Greg Bowser8fbece12019-08-02 16:29:52 -0400169HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
170
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000171# Size in bytes of the int type
172SIZEOF_INT = array.array("i").itemsize
173
Guido van Rossum24e4af82002-06-12 19:18:08 +0000174class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000175
Guido van Rossum24e4af82002-06-12 19:18:08 +0000176 def setUp(self):
177 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300178 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100179 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000180
Guido van Rossum24e4af82002-06-12 19:18:08 +0000181 def tearDown(self):
182 self.serv.close()
183 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000184
Guido van Rossum24e4af82002-06-12 19:18:08 +0000185class SocketUDPTest(unittest.TestCase):
186
187 def setUp(self):
188 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300189 self.port = socket_helper.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000190
191 def tearDown(self):
192 self.serv.close()
193 self.serv = None
194
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700195class SocketUDPLITETest(SocketUDPTest):
196
197 def setUp(self):
198 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300199 self.port = socket_helper.bind_port(self.serv)
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700200
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000201class ThreadSafeCleanupTestCase(unittest.TestCase):
202 """Subclass of unittest.TestCase with thread-safe cleanup methods.
203
204 This subclass protects the addCleanup() and doCleanups() methods
205 with a recursive lock.
206 """
207
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200208 def __init__(self, *args, **kwargs):
209 super().__init__(*args, **kwargs)
210 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000211
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200212 def addCleanup(self, *args, **kwargs):
213 with self._cleanup_lock:
214 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000215
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200216 def doCleanups(self, *args, **kwargs):
217 with self._cleanup_lock:
218 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000219
Charles-François Natali47413c12011-10-06 19:47:44 +0200220class SocketCANTest(unittest.TestCase):
221
222 """To be able to run this test, a `vcan0` CAN interface can be created with
223 the following commands:
224 # modprobe vcan
225 # ip link add dev vcan0 type vcan
226 # ifconfig vcan0 up
227 """
228 interface = 'vcan0'
229 bufsize = 128
230
Charles-François Natali773e42d2013-02-05 19:42:01 +0100231 """The CAN frame structure is defined in <linux/can.h>:
232
233 struct can_frame {
234 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
235 __u8 can_dlc; /* data length code: 0 .. 8 */
236 __u8 data[8] __attribute__((aligned(8)));
237 };
238 """
239 can_frame_fmt = "=IB3x8s"
240 can_frame_size = struct.calcsize(can_frame_fmt)
241
242 """The Broadcast Management Command frame structure is defined
243 in <linux/can/bcm.h>:
244
245 struct bcm_msg_head {
246 __u32 opcode;
247 __u32 flags;
248 __u32 count;
249 struct timeval ival1, ival2;
250 canid_t can_id;
251 __u32 nframes;
252 struct can_frame frames[0];
253 }
254
255 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
256 `struct can_frame` definition). Must use native not standard types for packing.
257 """
258 bcm_cmd_msg_fmt = "@3I4l2I"
259 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
260
Charles-François Natali47413c12011-10-06 19:47:44 +0200261 def setUp(self):
262 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200263 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200264 try:
265 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200266 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200267 self.skipTest('network interface `%s` does not exist' %
268 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200269
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100270
271class SocketRDSTest(unittest.TestCase):
272
273 """To be able to run this test, the `rds` kernel module must be loaded:
274 # modprobe rds
275 """
276 bufsize = 8192
277
278 def setUp(self):
279 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
280 self.addCleanup(self.serv.close)
281 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +0300282 self.port = socket_helper.bind_port(self.serv)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100283 except OSError:
284 self.skipTest('unable to bind RDS socket')
285
286
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000288 """Threadable Test class
289
290 The ThreadableTest class makes it easy to create a threaded
291 client/server pair from an existing unit test. To create a
292 new threaded class from an existing unit test, use multiple
293 inheritance:
294
295 class NewClass (OldClass, ThreadableTest):
296 pass
297
298 This class defines two new fixture functions with obvious
299 purposes for overriding:
300
301 clientSetUp ()
302 clientTearDown ()
303
304 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000305 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000306 '_' to indicate the client portion of the test. Ex:
307
308 def testFoo(self):
309 # Server portion
310
311 def _testFoo(self):
312 # Client portion
313
314 Any exceptions raised by the clients during their tests
315 are caught and transferred to the main thread to alert
316 the testing framework.
317
318 Note, the server setup function cannot call any blocking
319 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000320 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000321 the blocking call (such as in setting up a client/server
322 connection and performing the accept() in setUp().
323 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000324
325 def __init__(self):
326 # Swap the true setup function
327 self.__setUp = self.setUp
328 self.__tearDown = self.tearDown
329 self.setUp = self._setUp
330 self.tearDown = self._tearDown
331
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000332 def serverExplicitReady(self):
333 """This method allows the server to explicitly indicate that
334 it wants the client thread to proceed. This is useful if the
335 server is about to execute a blocking routine that is
336 dependent upon the client thread during its setup routine."""
337 self.server_ready.set()
338
Guido van Rossum24e4af82002-06-12 19:18:08 +0000339 def _setUp(self):
Hai Shie80697d2020-05-28 06:10:27 +0800340 self.wait_threads = threading_helper.wait_threads_exit()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700341 self.wait_threads.__enter__()
342
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000343 self.server_ready = threading.Event()
344 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000345 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000346 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200347 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000348
349 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000350 methodname = self.id()
351 i = methodname.rfind('.')
352 methodname = methodname[i+1:]
353 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000354 self.client_thread = thread.start_new_thread(
355 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200357 try:
358 self.__setUp()
359 except:
360 self.server_crashed = True
361 raise
362 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000363 self.server_ready.set()
364 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000365
366 def _tearDown(self):
367 self.__tearDown()
368 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700369 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000370
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000371 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000372 exc = self.queue.get()
373 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000374
375 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000376 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100377 try:
378 self.clientSetUp()
379 except BaseException as e:
380 self.queue.put(e)
381 self.clientTearDown()
382 return
383 finally:
384 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200385 if self.server_crashed:
386 self.clientTearDown()
387 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000388 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000389 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000390 try:
391 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000392 except BaseException as e:
393 self.queue.put(e)
394 finally:
395 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396
397 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000398 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000399
400 def clientTearDown(self):
401 self.done.set()
402 thread.exit()
403
404class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
405
406 def __init__(self, methodName='runTest'):
407 SocketTCPTest.__init__(self, methodName=methodName)
408 ThreadableTest.__init__(self)
409
410 def clientSetUp(self):
411 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
412
413 def clientTearDown(self):
414 self.cli.close()
415 self.cli = None
416 ThreadableTest.clientTearDown(self)
417
418class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
419
420 def __init__(self, methodName='runTest'):
421 SocketUDPTest.__init__(self, methodName=methodName)
422 ThreadableTest.__init__(self)
423
424 def clientSetUp(self):
425 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
426
Brian Curtin3beb38f2010-11-04 03:41:43 +0000427 def clientTearDown(self):
428 self.cli.close()
429 self.cli = None
430 ThreadableTest.clientTearDown(self)
431
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700432@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
433 'UDPLITE sockets required for this test.')
434class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
435
436 def __init__(self, methodName='runTest'):
437 SocketUDPLITETest.__init__(self, methodName=methodName)
438 ThreadableTest.__init__(self)
439
440 def clientSetUp(self):
441 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
442
443 def clientTearDown(self):
444 self.cli.close()
445 self.cli = None
446 ThreadableTest.clientTearDown(self)
447
Charles-François Natali47413c12011-10-06 19:47:44 +0200448class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
449
450 def __init__(self, methodName='runTest'):
451 SocketCANTest.__init__(self, methodName=methodName)
452 ThreadableTest.__init__(self)
453
454 def clientSetUp(self):
455 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
456 try:
457 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200458 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200459 # skipTest should not be called here, and will be called in the
460 # server instead
461 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200462
463 def clientTearDown(self):
464 self.cli.close()
465 self.cli = None
466 ThreadableTest.clientTearDown(self)
467
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100468class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
469
470 def __init__(self, methodName='runTest'):
471 SocketRDSTest.__init__(self, methodName=methodName)
472 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100473
474 def clientSetUp(self):
475 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
476 try:
477 # RDS sockets must be bound explicitly to send or receive data
478 self.cli.bind((HOST, 0))
479 self.cli_addr = self.cli.getsockname()
480 except OSError:
481 # skipTest should not be called here, and will be called in the
482 # server instead
483 pass
484
485 def clientTearDown(self):
486 self.cli.close()
487 self.cli = None
488 ThreadableTest.clientTearDown(self)
489
caaveryeffc12f2017-09-06 18:18:10 -0400490@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400491@unittest.skipUnless(HAVE_SOCKET_VSOCK,
492 'VSOCK sockets required for this test.')
493@unittest.skipUnless(get_cid() != 2,
494 "This test can only be run on a virtual guest.")
495class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
496
497 def __init__(self, methodName='runTest'):
498 unittest.TestCase.__init__(self, methodName=methodName)
499 ThreadableTest.__init__(self)
500
501 def setUp(self):
502 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
503 self.addCleanup(self.serv.close)
504 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
505 self.serv.listen()
506 self.serverExplicitReady()
507 self.conn, self.connaddr = self.serv.accept()
508 self.addCleanup(self.conn.close)
509
510 def clientSetUp(self):
511 time.sleep(0.1)
512 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
513 self.addCleanup(self.cli.close)
514 cid = get_cid()
515 self.cli.connect((cid, VSOCKPORT))
516
517 def testStream(self):
518 msg = self.conn.recv(1024)
519 self.assertEqual(msg, MSG)
520
521 def _testStream(self):
522 self.cli.send(MSG)
523 self.cli.close()
524
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000526 """Socket tests for client-server connection.
527
528 self.cli_conn is a client socket connected to the server. The
529 setUp() method guarantees that it is connected to the server.
530 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531
532 def __init__(self, methodName='runTest'):
533 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
534
535 def setUp(self):
536 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000537 # Indicate explicitly we're ready for the client thread to
538 # proceed and then perform the blocking call to accept
539 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540 conn, addr = self.serv.accept()
541 self.cli_conn = conn
542
543 def tearDown(self):
544 self.cli_conn.close()
545 self.cli_conn = None
546 ThreadedTCPSocketTest.tearDown(self)
547
548 def clientSetUp(self):
549 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000550 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551 self.serv_conn = self.cli
552
553 def clientTearDown(self):
554 self.serv_conn.close()
555 self.serv_conn = None
556 ThreadedTCPSocketTest.clientTearDown(self)
557
Dave Cole331708b2004-08-09 04:51:41 +0000558class SocketPairTest(unittest.TestCase, ThreadableTest):
559
560 def __init__(self, methodName='runTest'):
561 unittest.TestCase.__init__(self, methodName=methodName)
562 ThreadableTest.__init__(self)
563
564 def setUp(self):
565 self.serv, self.cli = socket.socketpair()
566
567 def tearDown(self):
568 self.serv.close()
569 self.serv = None
570
571 def clientSetUp(self):
572 pass
573
574 def clientTearDown(self):
575 self.cli.close()
576 self.cli = None
577 ThreadableTest.clientTearDown(self)
578
Tim Peters494aaee2004-08-09 18:54:11 +0000579
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000580# The following classes are used by the sendmsg()/recvmsg() tests.
581# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
582# gives a drop-in replacement for SocketConnectedTest, but different
583# address families can be used, and the attributes serv_addr and
584# cli_addr will be set to the addresses of the endpoints.
585
586class SocketTestBase(unittest.TestCase):
587 """A base class for socket tests.
588
589 Subclasses must provide methods newSocket() to return a new socket
590 and bindSock(sock) to bind it to an unused address.
591
592 Creates a socket self.serv and sets self.serv_addr to its address.
593 """
594
595 def setUp(self):
596 self.serv = self.newSocket()
597 self.bindServer()
598
599 def bindServer(self):
600 """Bind server socket and set self.serv_addr to its address."""
601 self.bindSock(self.serv)
602 self.serv_addr = self.serv.getsockname()
603
604 def tearDown(self):
605 self.serv.close()
606 self.serv = None
607
608
609class SocketListeningTestMixin(SocketTestBase):
610 """Mixin to listen on the server socket."""
611
612 def setUp(self):
613 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100614 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000615
616
617class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
618 ThreadableTest):
619 """Mixin to add client socket and allow client/server tests.
620
621 Client socket is self.cli and its address is self.cli_addr. See
622 ThreadableTest for usage information.
623 """
624
625 def __init__(self, *args, **kwargs):
626 super().__init__(*args, **kwargs)
627 ThreadableTest.__init__(self)
628
629 def clientSetUp(self):
630 self.cli = self.newClientSocket()
631 self.bindClient()
632
633 def newClientSocket(self):
634 """Return a new socket for use as client."""
635 return self.newSocket()
636
637 def bindClient(self):
638 """Bind client socket and set self.cli_addr to its address."""
639 self.bindSock(self.cli)
640 self.cli_addr = self.cli.getsockname()
641
642 def clientTearDown(self):
643 self.cli.close()
644 self.cli = None
645 ThreadableTest.clientTearDown(self)
646
647
648class ConnectedStreamTestMixin(SocketListeningTestMixin,
649 ThreadedSocketTestMixin):
650 """Mixin to allow client/server stream tests with connected client.
651
652 Server's socket representing connection to client is self.cli_conn
653 and client's connection to server is self.serv_conn. (Based on
654 SocketConnectedTest.)
655 """
656
657 def setUp(self):
658 super().setUp()
659 # Indicate explicitly we're ready for the client thread to
660 # proceed and then perform the blocking call to accept
661 self.serverExplicitReady()
662 conn, addr = self.serv.accept()
663 self.cli_conn = conn
664
665 def tearDown(self):
666 self.cli_conn.close()
667 self.cli_conn = None
668 super().tearDown()
669
670 def clientSetUp(self):
671 super().clientSetUp()
672 self.cli.connect(self.serv_addr)
673 self.serv_conn = self.cli
674
675 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100676 try:
677 self.serv_conn.close()
678 self.serv_conn = None
679 except AttributeError:
680 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000681 super().clientTearDown()
682
683
684class UnixSocketTestBase(SocketTestBase):
685 """Base class for Unix-domain socket tests."""
686
687 # This class is used for file descriptor passing tests, so we
688 # create the sockets in a private directory so that other users
689 # can't send anything that might be problematic for a privileged
690 # user running the tests.
691
692 def setUp(self):
693 self.dir_path = tempfile.mkdtemp()
694 self.addCleanup(os.rmdir, self.dir_path)
695 super().setUp()
696
697 def bindSock(self, sock):
698 path = tempfile.mktemp(dir=self.dir_path)
Serhiy Storchaka16994912020-04-25 10:06:29 +0300699 socket_helper.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000700 self.addCleanup(support.unlink, path)
701
702class UnixStreamBase(UnixSocketTestBase):
703 """Base class for Unix-domain SOCK_STREAM tests."""
704
705 def newSocket(self):
706 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
707
708
709class InetTestBase(SocketTestBase):
710 """Base class for IPv4 socket tests."""
711
712 host = HOST
713
714 def setUp(self):
715 super().setUp()
716 self.port = self.serv_addr[1]
717
718 def bindSock(self, sock):
Serhiy Storchaka16994912020-04-25 10:06:29 +0300719 socket_helper.bind_port(sock, host=self.host)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000720
721class TCPTestBase(InetTestBase):
722 """Base class for TCP-over-IPv4 tests."""
723
724 def newSocket(self):
725 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
726
727class UDPTestBase(InetTestBase):
728 """Base class for UDP-over-IPv4 tests."""
729
730 def newSocket(self):
731 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
732
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700733class UDPLITETestBase(InetTestBase):
734 """Base class for UDPLITE-over-IPv4 tests."""
735
736 def newSocket(self):
737 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
738
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000739class SCTPStreamBase(InetTestBase):
740 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
741
742 def newSocket(self):
743 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
744 socket.IPPROTO_SCTP)
745
746
747class Inet6TestBase(InetTestBase):
748 """Base class for IPv6 socket tests."""
749
Serhiy Storchaka16994912020-04-25 10:06:29 +0300750 host = socket_helper.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000751
752class UDP6TestBase(Inet6TestBase):
753 """Base class for UDP-over-IPv6 tests."""
754
755 def newSocket(self):
756 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
757
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700758class UDPLITE6TestBase(Inet6TestBase):
759 """Base class for UDPLITE-over-IPv6 tests."""
760
761 def newSocket(self):
762 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
763
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000764
765# Test-skipping decorators for use with ThreadableTest.
766
767def skipWithClientIf(condition, reason):
768 """Skip decorated test if condition is true, add client_skip decorator.
769
770 If the decorated object is not a class, sets its attribute
771 "client_skip" to a decorator which will return an empty function
772 if the test is to be skipped, or the original function if it is
773 not. This can be used to avoid running the client part of a
774 skipped test when using ThreadableTest.
775 """
776 def client_pass(*args, **kwargs):
777 pass
778 def skipdec(obj):
779 retval = unittest.skip(reason)(obj)
780 if not isinstance(obj, type):
781 retval.client_skip = lambda f: client_pass
782 return retval
783 def noskipdec(obj):
784 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
785 obj.client_skip = lambda f: f
786 return obj
787 return skipdec if condition else noskipdec
788
789
790def requireAttrs(obj, *attributes):
791 """Skip decorated test if obj is missing any of the given attributes.
792
793 Sets client_skip attribute as skipWithClientIf() does.
794 """
795 missing = [name for name in attributes if not hasattr(obj, name)]
796 return skipWithClientIf(
797 missing, "don't have " + ", ".join(name for name in missing))
798
799
800def requireSocket(*args):
801 """Skip decorated test if a socket cannot be created with given arguments.
802
803 When an argument is given as a string, will use the value of that
804 attribute of the socket module, or skip the test if it doesn't
805 exist. Sets client_skip attribute as skipWithClientIf() does.
806 """
807 err = None
808 missing = [obj for obj in args if
809 isinstance(obj, str) and not hasattr(socket, obj)]
810 if missing:
811 err = "don't have " + ", ".join(name for name in missing)
812 else:
813 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
814 for obj in args]
815 try:
816 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200817 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000818 # XXX: check errno?
819 err = str(e)
820 else:
821 s.close()
822 return skipWithClientIf(
823 err is not None,
824 "can't create socket({0}): {1}".format(
825 ", ".join(str(o) for o in args), err))
826
827
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828#######################################################################
829## Begin Tests
830
831class GeneralModuleTests(unittest.TestCase):
832
Ethan Furman7184bac2014-10-14 18:56:53 -0700833 def test_SocketType_is_socketobject(self):
834 import _socket
835 self.assertTrue(socket.SocketType is _socket.socket)
836 s = socket.socket()
837 self.assertIsInstance(s, socket.SocketType)
838 s.close()
839
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000840 def test_repr(self):
841 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200842 with s:
843 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000844 self.assertIn('family=%s' % socket.AF_INET, repr(s))
845 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200846 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200847 self.assertNotIn('raddr', repr(s))
848 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200849 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200850 self.assertIn(str(s.getsockname()), repr(s))
851 self.assertIn('[closed]', repr(s))
852 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000853
Victor Stinnere254e532014-07-26 14:36:55 +0200854 @unittest.skipUnless(_socket is not None, 'need _socket module')
855 def test_csocket_repr(self):
856 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
857 try:
858 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
859 % (s.fileno(), s.family, s.type, s.proto))
860 self.assertEqual(repr(s), expected)
861 finally:
862 s.close()
863 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
864 % (s.family, s.type, s.proto))
865 self.assertEqual(repr(s), expected)
866
Raymond Hettinger027bb632004-05-31 03:09:25 +0000867 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200868 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
869 p = proxy(s)
870 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000871 s = None
872 try:
873 p.fileno()
874 except ReferenceError:
875 pass
876 else:
877 self.fail('Socket proxy still exists')
878
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000880 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300881 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200882 with self.assertRaises(OSError, msg=msg % 'OSError'):
883 raise OSError
884 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200886 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888
Ezio Melotti63e42302011-05-07 19:47:48 +0300889 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000890 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300891 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
892 self.addCleanup(s.close)
893 s.bind(('', 0))
894 sockname = s.getsockname()
895 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300896 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300897 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300898 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400899 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300900 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300901 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300902 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400903 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300904 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300905 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300906 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300907 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300908 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300909 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300910 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400911 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300912 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300913 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300914 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400915 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300916 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300917 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300918 self.assertIn('not NoneType', str(cm.exception))
919 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300920 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300921 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300922 s.sendto(b'foo', None, None)
923 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300924 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300925 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300926 self.assertIn('(1 given)', str(cm.exception))
927 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300928 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300929 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300930
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000932 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100934 if socket.has_ipv6:
935 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936 socket.SOCK_STREAM
937 socket.SOCK_DGRAM
938 socket.SOCK_RAW
939 socket.SOCK_RDM
940 socket.SOCK_SEQPACKET
941 socket.SOL_SOCKET
942 socket.SO_REUSEADDR
943
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100944 def testCrucialIpProtoConstants(self):
945 socket.IPPROTO_TCP
946 socket.IPPROTO_UDP
947 if socket.has_ipv6:
948 socket.IPPROTO_IPV6
949
950 @unittest.skipUnless(os.name == "nt", "Windows specific")
951 def testWindowsSpecificConstants(self):
952 socket.IPPROTO_ICLFXBM
953 socket.IPPROTO_ST
954 socket.IPPROTO_CBT
955 socket.IPPROTO_IGP
956 socket.IPPROTO_RDP
957 socket.IPPROTO_PGM
958 socket.IPPROTO_L2TP
959 socket.IPPROTO_SCTP
960
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +0200961 @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
962 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
963 def test3542SocketOptions(self):
964 # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542
965 opts = {
966 'IPV6_CHECKSUM',
967 'IPV6_DONTFRAG',
968 'IPV6_DSTOPTS',
969 'IPV6_HOPLIMIT',
970 'IPV6_HOPOPTS',
971 'IPV6_NEXTHOP',
972 'IPV6_PATHMTU',
973 'IPV6_PKTINFO',
974 'IPV6_RECVDSTOPTS',
975 'IPV6_RECVHOPLIMIT',
976 'IPV6_RECVHOPOPTS',
977 'IPV6_RECVPATHMTU',
978 'IPV6_RECVPKTINFO',
979 'IPV6_RECVRTHDR',
980 'IPV6_RECVTCLASS',
981 'IPV6_RTHDR',
982 'IPV6_RTHDRDSTOPTS',
983 'IPV6_RTHDR_TYPE_0',
984 'IPV6_TCLASS',
985 'IPV6_USE_MIN_MTU',
986 }
987 for opt in opts:
988 self.assertTrue(
989 hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'"
990 )
991
Guido van Rossum654c11e2002-06-13 20:24:17 +0000992 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000993 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000994 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000995 try:
996 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200997 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000998 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600999 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001000 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +00001001 try:
1002 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001003 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +00001004 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001005 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +00001006 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001007 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +00001008 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001009 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001010
Charles-François Natali0cc86852013-09-13 19:53:08 +02001011 def test_host_resolution(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03001012 for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001013 self.assertEqual(socket.gethostbyname(addr), addr)
1014
Serhiy Storchaka16994912020-04-25 10:06:29 +03001015 # 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 +02001016 # a matching name entry (e.g. 'ip6-localhost')
Serhiy Storchaka16994912020-04-25 10:06:29 +03001017 for host in [socket_helper.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +02001018 self.assertIn(host, socket.gethostbyaddr(host)[2])
1019
Xiang Zhangd36a7162017-03-07 11:06:09 +08001020 def test_host_resolution_bad_address(self):
1021 # These are all malformed IP addresses and expected not to resolve to
1022 # any result. But some ISPs, e.g. AWS, may successfully resolve these
1023 # IPs.
1024 explanation = (
1025 "resolving an invalid IP address did not raise OSError; "
1026 "can be caused by a broken DNS server"
1027 )
1028 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
1029 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -04001030 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +08001031 socket.gethostbyname(addr)
1032 with self.assertRaises(OSError, msg=explanation):
1033 socket.gethostbyaddr(addr)
1034
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001035 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
1036 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
1037 def test_sethostname(self):
1038 oldhn = socket.gethostname()
1039 try:
1040 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001041 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +00001042 if e.errno == errno.EPERM:
1043 self.skipTest("test should be run as root")
1044 else:
1045 raise
1046 try:
1047 # running test as root!
1048 self.assertEqual(socket.gethostname(), 'new')
1049 # Should work with bytes objects too
1050 socket.sethostname(b'bar')
1051 self.assertEqual(socket.gethostname(), 'bar')
1052 finally:
1053 socket.sethostname(oldhn)
1054
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001055 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1056 'socket.if_nameindex() not available.')
1057 def testInterfaceNameIndex(self):
1058 interfaces = socket.if_nameindex()
1059 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001060 self.assertIsInstance(index, int)
1061 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001062 # interface indices are non-zero integers
1063 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001064 _index = socket.if_nametoindex(name)
1065 self.assertIsInstance(_index, int)
1066 self.assertEqual(index, _index)
1067 _name = socket.if_indextoname(index)
1068 self.assertIsInstance(_name, str)
1069 self.assertEqual(name, _name)
1070
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001071 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1072 'socket.if_indextoname() not available.')
1073 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001074 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001075 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001076
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001077 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1078 'socket.if_nametoindex() not available.')
1079 def testInvalidInterfaceNameToIndex(self):
1080 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1081 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1082
Serhiy Storchaka43767632013-11-03 21:31:38 +02001083 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1084 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001085 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001086 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001087 try:
1088 # On some versions, this loses a reference
1089 orig = sys.getrefcount(__name__)
1090 socket.getnameinfo(__name__,0)
1091 except TypeError:
1092 if sys.getrefcount(__name__) != orig:
1093 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001094
Guido van Rossum24e4af82002-06-12 19:18:08 +00001095 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001096 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097 try:
1098 # On some versions, this crashes the interpreter.
1099 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001100 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001101 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001102
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001103 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001104 # This just checks that htons etc. are their own inverse,
1105 # when looking at the lower 16 or 32 bits.
1106 sizes = {socket.htonl: 32, socket.ntohl: 32,
1107 socket.htons: 16, socket.ntohs: 16}
1108 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001109 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001110 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1111 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001112
Guido van Rossuma2627af2002-09-14 00:58:46 +00001113 swapped = func(mask)
1114 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001115 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001116
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001117 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001118 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001119 import _testcapi
1120 s_good_values = [0, 1, 2, 0xffff]
1121 l_good_values = s_good_values + [0xffffffff]
1122 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1123 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1124 _testcapi.INT_MAX + 1]
1125 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1126 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001127 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001128 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001129 for k in l_good_values:
1130 socket.ntohl(k)
1131 socket.htonl(k)
1132 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001133 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001134 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001135 for k in l_bad_values:
1136 self.assertRaises(OverflowError, socket.ntohl, k)
1137 self.assertRaises(OverflowError, socket.htonl, k)
1138 for k in s_deprecated_values:
1139 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1140 self.assertWarns(DeprecationWarning, socket.htons, 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)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001521 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1522 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001523 self.assertEqual(str(type), 'SocketKind.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)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001613 self.assertRaises(socket.timeout, c.sendall,
1614 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:
1681 with sock.makefile(mode) as fp:
1682 self.assertEqual(fp.mode, mode)
1683
1684 def test_makefile_invalid_mode(self):
1685 for mode in 'rt', 'x', '+', 'a':
1686 with self.subTest(mode=mode):
1687 with socket.socket() as sock:
1688 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1689 sock.makefile(mode)
1690
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001691 def test_pickle(self):
1692 sock = socket.socket()
1693 with sock:
1694 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1695 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001696 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1697 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1698 self.assertEqual(family, socket.AF_INET)
1699 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1700 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001701
Serhiy Storchaka78980432013-01-15 01:12:17 +02001702 def test_listen_backlog(self):
1703 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001704 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1705 srv.bind((HOST, 0))
1706 srv.listen(backlog)
1707
1708 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001709 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001710 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001711
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001712 @support.cpython_only
1713 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001714 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001715 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001716 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1717 srv.bind((HOST, 0))
1718 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001719
Serhiy Storchaka16994912020-04-25 10:06:29 +03001720 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001721 def test_flowinfo(self):
1722 self.assertRaises(OverflowError, socket.getnameinfo,
Serhiy Storchaka16994912020-04-25 10:06:29 +03001723 (socket_helper.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001724 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03001725 self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001726
Serhiy Storchaka16994912020-04-25 10:06:29 +03001727 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001728 def test_getaddrinfo_ipv6_basic(self):
1729 ((*_, sockaddr),) = socket.getaddrinfo(
1730 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1731 1234, socket.AF_INET6,
1732 socket.SOCK_DGRAM,
1733 socket.IPPROTO_UDP
1734 )
1735 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1736
Serhiy Storchaka16994912020-04-25 10:06:29 +03001737 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001738 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001739 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001740 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1741 # Just pick up any network interface (Linux, Mac OS X)
1742 (ifindex, test_interface) = socket.if_nameindex()[0]
1743 ((*_, sockaddr),) = socket.getaddrinfo(
1744 'ff02::1de:c0:face:8D%' + test_interface,
1745 1234, socket.AF_INET6,
1746 socket.SOCK_DGRAM,
1747 socket.IPPROTO_UDP
1748 )
1749 # Note missing interface name part in IPv6 address
1750 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1751
Serhiy Storchaka16994912020-04-25 10:06:29 +03001752 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Коренберг Марк7766b962018-02-13 00:47:42 +05001753 @unittest.skipUnless(
1754 sys.platform == 'win32',
1755 'Numeric scope id does not work or undocumented')
1756 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1757 # Also works on Linux and Mac OS X, but is not documented (?)
1758 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1759 ifindex = 42
1760 ((*_, sockaddr),) = socket.getaddrinfo(
1761 'ff02::1de:c0:face:8D%' + str(ifindex),
1762 1234, socket.AF_INET6,
1763 socket.SOCK_DGRAM,
1764 socket.IPPROTO_UDP
1765 )
1766 # Note missing interface name part in IPv6 address
1767 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1768
Serhiy Storchaka16994912020-04-25 10:06:29 +03001769 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001770 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001771 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001772 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1773 # Just pick up any network interface.
1774 (ifindex, test_interface) = socket.if_nameindex()[0]
1775 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1776 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1777 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1778
Serhiy Storchaka16994912020-04-25 10:06:29 +03001779 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001780 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001781 'Numeric scope id does not work or undocumented')
1782 def test_getnameinfo_ipv6_scopeid_numeric(self):
1783 # Also works on Linux (undocumented), but does not work on Mac OS X
1784 # Windows and Linux allow nonexistent interface numbers here.
1785 ifindex = 42
1786 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1787 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1788 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1789
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001790 def test_str_for_enums(self):
1791 # Make sure that the AF_* and SOCK_* constants have enum-like string
1792 # reprs.
1793 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1794 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001795 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001796
Yury Selivanov98181422017-12-18 20:02:54 -05001797 def test_socket_consistent_sock_type(self):
1798 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1799 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1800 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1801
1802 with socket.socket(socket.AF_INET, sock_type) as s:
1803 self.assertEqual(s.type, socket.SOCK_STREAM)
1804 s.settimeout(1)
1805 self.assertEqual(s.type, socket.SOCK_STREAM)
1806 s.settimeout(0)
1807 self.assertEqual(s.type, socket.SOCK_STREAM)
1808 s.setblocking(True)
1809 self.assertEqual(s.type, socket.SOCK_STREAM)
1810 s.setblocking(False)
1811 self.assertEqual(s.type, socket.SOCK_STREAM)
1812
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001813 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001814 # Test that when created with a family that's not one of the known
1815 # AF_*/SOCK_* constants, socket.family just returns the number.
1816 #
1817 # To do this we fool socket.socket into believing it already has an
1818 # open fd because on this path it doesn't actually verify the family and
1819 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001820 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1821 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001822 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1823
1824 unknown_type = max(
1825 kind
1826 for name, kind in socket.SocketKind.__members__.items()
1827 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1828 ) + 1
1829
1830 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001831 family=unknown_family, type=unknown_type, proto=23,
1832 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001833 self.assertEqual(s.family, unknown_family)
1834 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001835 # some OS like macOS ignore proto
1836 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001837
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001838 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1839 def test__sendfile_use_sendfile(self):
1840 class File:
1841 def __init__(self, fd):
1842 self.fd = fd
1843
1844 def fileno(self):
1845 return self.fd
1846 with socket.socket() as sock:
1847 fd = os.open(os.curdir, os.O_RDONLY)
1848 os.close(fd)
1849 with self.assertRaises(socket._GiveupOnSendfile):
1850 sock._sendfile_use_sendfile(File(fd))
1851 with self.assertRaises(OverflowError):
1852 sock._sendfile_use_sendfile(File(2**1000))
1853 with self.assertRaises(TypeError):
1854 sock._sendfile_use_sendfile(File(None))
1855
Christian Heimesb6e43af2018-01-29 22:37:58 +01001856 def _test_socket_fileno(self, s, family, stype):
1857 self.assertEqual(s.family, family)
1858 self.assertEqual(s.type, stype)
1859
1860 fd = s.fileno()
1861 s2 = socket.socket(fileno=fd)
1862 self.addCleanup(s2.close)
1863 # detach old fd to avoid double close
1864 s.detach()
1865 self.assertEqual(s2.family, family)
1866 self.assertEqual(s2.type, stype)
1867 self.assertEqual(s2.fileno(), fd)
1868
1869 def test_socket_fileno(self):
1870 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1871 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001872 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001873 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1874
1875 if hasattr(socket, "SOCK_DGRAM"):
1876 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1877 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001878 s.bind((socket_helper.HOST, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001879 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1880
Serhiy Storchaka16994912020-04-25 10:06:29 +03001881 if socket_helper.IPV6_ENABLED:
Christian Heimesb6e43af2018-01-29 22:37:58 +01001882 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1883 self.addCleanup(s.close)
Serhiy Storchaka16994912020-04-25 10:06:29 +03001884 s.bind((socket_helper.HOSTv6, 0, 0, 0))
Christian Heimesb6e43af2018-01-29 22:37:58 +01001885 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1886
1887 if hasattr(socket, "AF_UNIX"):
1888 tmpdir = tempfile.mkdtemp()
1889 self.addCleanup(shutil.rmtree, tmpdir)
1890 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1891 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001892 try:
1893 s.bind(os.path.join(tmpdir, 'socket'))
1894 except PermissionError:
1895 pass
1896 else:
1897 self._test_socket_fileno(s, socket.AF_UNIX,
1898 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001899
Dima Tisneke9912702018-12-17 22:07:55 +09001900 def test_socket_fileno_rejects_float(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001901 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001902 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1903
1904 def test_socket_fileno_rejects_other_types(self):
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001905 with self.assertRaises(TypeError):
Dima Tisneke9912702018-12-17 22:07:55 +09001906 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1907
1908 def test_socket_fileno_rejects_invalid_socket(self):
1909 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1910 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1911
1912 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1913 def test_socket_fileno_rejects_negative(self):
1914 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1915 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1916
1917 def test_socket_fileno_requires_valid_fd(self):
1918 WSAENOTSOCK = 10038
1919 with self.assertRaises(OSError) as cm:
1920 socket.socket(fileno=support.make_bad_fd())
1921 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1922
1923 with self.assertRaises(OSError) as cm:
1924 socket.socket(
1925 socket.AF_INET,
1926 socket.SOCK_STREAM,
1927 fileno=support.make_bad_fd())
1928 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1929
1930 def test_socket_fileno_requires_socket_fd(self):
1931 with tempfile.NamedTemporaryFile() as afile:
1932 with self.assertRaises(OSError):
1933 socket.socket(fileno=afile.fileno())
1934
1935 with self.assertRaises(OSError) as cm:
1936 socket.socket(
1937 socket.AF_INET,
1938 socket.SOCK_STREAM,
1939 fileno=afile.fileno())
1940 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1941
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001942
Charles-François Natali47413c12011-10-06 19:47:44 +02001943@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1944class BasicCANTest(unittest.TestCase):
1945
1946 def testCrucialConstants(self):
1947 socket.AF_CAN
1948 socket.PF_CAN
1949 socket.CAN_RAW
1950
Charles-François Natali773e42d2013-02-05 19:42:01 +01001951 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1952 'socket.CAN_BCM required for this test.')
1953 def testBCMConstants(self):
1954 socket.CAN_BCM
1955
1956 # opcodes
1957 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1958 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1959 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1960 socket.CAN_BCM_TX_SEND # send one CAN frame
1961 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1962 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1963 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1964 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1965 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1966 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1967 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1968 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1969
karl ding31c4fd22019-07-31 01:47:16 -07001970 # flags
1971 socket.CAN_BCM_SETTIMER
1972 socket.CAN_BCM_STARTTIMER
1973 socket.CAN_BCM_TX_COUNTEVT
1974 socket.CAN_BCM_TX_ANNOUNCE
1975 socket.CAN_BCM_TX_CP_CAN_ID
1976 socket.CAN_BCM_RX_FILTER_ID
1977 socket.CAN_BCM_RX_CHECK_DLC
1978 socket.CAN_BCM_RX_NO_AUTOTIMER
1979 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1980 socket.CAN_BCM_TX_RESET_MULTI_IDX
1981 socket.CAN_BCM_RX_RTR_FRAME
1982
Charles-François Natali47413c12011-10-06 19:47:44 +02001983 def testCreateSocket(self):
1984 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1985 pass
1986
Charles-François Natali773e42d2013-02-05 19:42:01 +01001987 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1988 'socket.CAN_BCM required for this test.')
1989 def testCreateBCMSocket(self):
1990 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1991 pass
1992
Charles-François Natali47413c12011-10-06 19:47:44 +02001993 def testBindAny(self):
1994 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001995 address = ('', )
1996 s.bind(address)
1997 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001998
1999 def testTooLongInterfaceName(self):
2000 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2001 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002002 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02002003 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02002004
2005 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
2006 'socket.CAN_RAW_LOOPBACK required for this test.')
2007 def testLoopback(self):
2008 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2009 for loopback in (0, 1):
2010 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
2011 loopback)
2012 self.assertEqual(loopback,
2013 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
2014
2015 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
2016 'socket.CAN_RAW_FILTER required for this test.')
2017 def testFilter(self):
2018 can_id, can_mask = 0x200, 0x700
2019 can_filter = struct.pack("=II", can_id, can_mask)
2020 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2021 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
2022 self.assertEqual(can_filter,
2023 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002024 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02002025
2026
2027@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02002028class CANTest(ThreadedCANSocketTest):
2029
Charles-François Natali47413c12011-10-06 19:47:44 +02002030 def __init__(self, methodName='runTest'):
2031 ThreadedCANSocketTest.__init__(self, methodName=methodName)
2032
2033 @classmethod
2034 def build_can_frame(cls, can_id, data):
2035 """Build a CAN frame."""
2036 can_dlc = len(data)
2037 data = data.ljust(8, b'\x00')
2038 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
2039
2040 @classmethod
2041 def dissect_can_frame(cls, frame):
2042 """Dissect a CAN frame."""
2043 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2044 return (can_id, can_dlc, data[:can_dlc])
2045
2046 def testSendFrame(self):
2047 cf, addr = self.s.recvfrom(self.bufsize)
2048 self.assertEqual(self.cf, cf)
2049 self.assertEqual(addr[0], self.interface)
2050 self.assertEqual(addr[1], socket.AF_CAN)
2051
2052 def _testSendFrame(self):
2053 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2054 self.cli.send(self.cf)
2055
2056 def testSendMaxFrame(self):
2057 cf, addr = self.s.recvfrom(self.bufsize)
2058 self.assertEqual(self.cf, cf)
2059
2060 def _testSendMaxFrame(self):
2061 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2062 self.cli.send(self.cf)
2063
2064 def testSendMultiFrames(self):
2065 cf, addr = self.s.recvfrom(self.bufsize)
2066 self.assertEqual(self.cf1, cf)
2067
2068 cf, addr = self.s.recvfrom(self.bufsize)
2069 self.assertEqual(self.cf2, cf)
2070
2071 def _testSendMultiFrames(self):
2072 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2073 self.cli.send(self.cf1)
2074
2075 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2076 self.cli.send(self.cf2)
2077
Charles-François Natali773e42d2013-02-05 19:42:01 +01002078 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2079 'socket.CAN_BCM required for this test.')
2080 def _testBCM(self):
2081 cf, addr = self.cli.recvfrom(self.bufsize)
2082 self.assertEqual(self.cf, cf)
2083 can_id, can_dlc, data = self.dissect_can_frame(cf)
2084 self.assertEqual(self.can_id, can_id)
2085 self.assertEqual(self.data, data)
2086
2087 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2088 'socket.CAN_BCM required for this test.')
2089 def testBCM(self):
2090 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2091 self.addCleanup(bcm.close)
2092 bcm.connect((self.interface,))
2093 self.can_id = 0x123
2094 self.data = bytes([0xc0, 0xff, 0xee])
2095 self.cf = self.build_can_frame(self.can_id, self.data)
2096 opcode = socket.CAN_BCM_TX_SEND
2097 flags = 0
2098 count = 0
2099 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2100 bcm_can_id = 0x0222
2101 nframes = 1
2102 assert len(self.cf) == 16
2103 header = struct.pack(self.bcm_cmd_msg_fmt,
2104 opcode,
2105 flags,
2106 count,
2107 ival1_seconds,
2108 ival1_usec,
2109 ival2_seconds,
2110 ival2_usec,
2111 bcm_can_id,
2112 nframes,
2113 )
2114 header_plus_frame = header + self.cf
2115 bytes_sent = bcm.send(header_plus_frame)
2116 self.assertEqual(bytes_sent, len(header_plus_frame))
2117
Charles-François Natali47413c12011-10-06 19:47:44 +02002118
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002119@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2120class ISOTPTest(unittest.TestCase):
2121
2122 def __init__(self, *args, **kwargs):
2123 super().__init__(*args, **kwargs)
2124 self.interface = "vcan0"
2125
2126 def testCrucialConstants(self):
2127 socket.AF_CAN
2128 socket.PF_CAN
2129 socket.CAN_ISOTP
2130 socket.SOCK_DGRAM
2131
2132 def testCreateSocket(self):
2133 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2134 pass
2135
2136 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2137 'socket.CAN_ISOTP required for this test.')
2138 def testCreateISOTPSocket(self):
2139 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2140 pass
2141
2142 def testTooLongInterfaceName(self):
2143 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2144 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2145 with self.assertRaisesRegex(OSError, 'interface name too long'):
2146 s.bind(('x' * 1024, 1, 2))
2147
2148 def testBind(self):
2149 try:
2150 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2151 addr = self.interface, 0x123, 0x456
2152 s.bind(addr)
2153 self.assertEqual(s.getsockname(), addr)
2154 except OSError as e:
2155 if e.errno == errno.ENODEV:
2156 self.skipTest('network interface `%s` does not exist' %
2157 self.interface)
2158 else:
2159 raise
2160
2161
karl ding360371f2020-04-29 15:31:19 -07002162@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
2163class J1939Test(unittest.TestCase):
2164
2165 def __init__(self, *args, **kwargs):
2166 super().__init__(*args, **kwargs)
2167 self.interface = "vcan0"
2168
2169 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2170 'socket.CAN_J1939 required for this test.')
2171 def testJ1939Constants(self):
2172 socket.CAN_J1939
2173
2174 socket.J1939_MAX_UNICAST_ADDR
2175 socket.J1939_IDLE_ADDR
2176 socket.J1939_NO_ADDR
2177 socket.J1939_NO_NAME
2178 socket.J1939_PGN_REQUEST
2179 socket.J1939_PGN_ADDRESS_CLAIMED
2180 socket.J1939_PGN_ADDRESS_COMMANDED
2181 socket.J1939_PGN_PDU1_MAX
2182 socket.J1939_PGN_MAX
2183 socket.J1939_NO_PGN
2184
2185 # J1939 socket options
2186 socket.SO_J1939_FILTER
2187 socket.SO_J1939_PROMISC
2188 socket.SO_J1939_SEND_PRIO
2189 socket.SO_J1939_ERRQUEUE
2190
2191 socket.SCM_J1939_DEST_ADDR
2192 socket.SCM_J1939_DEST_NAME
2193 socket.SCM_J1939_PRIO
2194 socket.SCM_J1939_ERRQUEUE
2195
2196 socket.J1939_NLA_PAD
2197 socket.J1939_NLA_BYTES_ACKED
2198
2199 socket.J1939_EE_INFO_NONE
2200 socket.J1939_EE_INFO_TX_ABORT
2201
2202 socket.J1939_FILTER_MAX
2203
2204 @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
2205 'socket.CAN_J1939 required for this test.')
2206 def testCreateJ1939Socket(self):
2207 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2208 pass
2209
2210 def testBind(self):
2211 try:
2212 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
2213 addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
2214 s.bind(addr)
2215 self.assertEqual(s.getsockname(), addr)
2216 except OSError as e:
2217 if e.errno == errno.ENODEV:
2218 self.skipTest('network interface `%s` does not exist' %
2219 self.interface)
2220 else:
2221 raise
2222
2223
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002224@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2225class BasicRDSTest(unittest.TestCase):
2226
2227 def testCrucialConstants(self):
2228 socket.AF_RDS
2229 socket.PF_RDS
2230
2231 def testCreateSocket(self):
2232 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2233 pass
2234
2235 def testSocketBufferSize(self):
2236 bufsize = 16384
2237 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2238 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2239 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2240
2241
2242@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002243class RDSTest(ThreadedRDSSocketTest):
2244
2245 def __init__(self, methodName='runTest'):
2246 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2247
Charles-François Natali240c55f2011-11-10 20:33:36 +01002248 def setUp(self):
2249 super().setUp()
2250 self.evt = threading.Event()
2251
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002252 def testSendAndRecv(self):
2253 data, addr = self.serv.recvfrom(self.bufsize)
2254 self.assertEqual(self.data, data)
2255 self.assertEqual(self.cli_addr, addr)
2256
2257 def _testSendAndRecv(self):
2258 self.data = b'spam'
2259 self.cli.sendto(self.data, 0, (HOST, self.port))
2260
2261 def testPeek(self):
2262 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2263 self.assertEqual(self.data, data)
2264 data, addr = self.serv.recvfrom(self.bufsize)
2265 self.assertEqual(self.data, data)
2266
2267 def _testPeek(self):
2268 self.data = b'spam'
2269 self.cli.sendto(self.data, 0, (HOST, self.port))
2270
2271 @requireAttrs(socket.socket, 'recvmsg')
2272 def testSendAndRecvMsg(self):
2273 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2274 self.assertEqual(self.data, data)
2275
2276 @requireAttrs(socket.socket, 'sendmsg')
2277 def _testSendAndRecvMsg(self):
2278 self.data = b'hello ' * 10
2279 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2280
2281 def testSendAndRecvMulti(self):
2282 data, addr = self.serv.recvfrom(self.bufsize)
2283 self.assertEqual(self.data1, data)
2284
2285 data, addr = self.serv.recvfrom(self.bufsize)
2286 self.assertEqual(self.data2, data)
2287
2288 def _testSendAndRecvMulti(self):
2289 self.data1 = b'bacon'
2290 self.cli.sendto(self.data1, 0, (HOST, self.port))
2291
2292 self.data2 = b'egg'
2293 self.cli.sendto(self.data2, 0, (HOST, self.port))
2294
2295 def testSelect(self):
2296 r, w, x = select.select([self.serv], [], [], 3.0)
2297 self.assertIn(self.serv, r)
2298 data, addr = self.serv.recvfrom(self.bufsize)
2299 self.assertEqual(self.data, data)
2300
2301 def _testSelect(self):
2302 self.data = b'select'
2303 self.cli.sendto(self.data, 0, (HOST, self.port))
2304
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002305@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2306 'QIPCRTR sockets required for this test.')
2307class BasicQIPCRTRTest(unittest.TestCase):
2308
2309 def testCrucialConstants(self):
2310 socket.AF_QIPCRTR
2311
2312 def testCreateSocket(self):
2313 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2314 pass
2315
2316 def testUnbound(self):
2317 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2318 self.assertEqual(s.getsockname()[1], 0)
2319
2320 def testBindSock(self):
2321 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002322 socket_helper.bind_port(s, host=s.getsockname()[0])
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002323 self.assertNotEqual(s.getsockname()[1], 0)
2324
2325 def testInvalidBindSock(self):
2326 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
Serhiy Storchaka16994912020-04-25 10:06:29 +03002327 self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002328
2329 def testAutoBindSock(self):
2330 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2331 s.connect((123, 123))
2332 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002333
caaveryeffc12f2017-09-06 18:18:10 -04002334@unittest.skipIf(fcntl is None, "need fcntl")
2335@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2336 'VSOCK sockets required for this test.')
2337class BasicVSOCKTest(unittest.TestCase):
2338
2339 def testCrucialConstants(self):
2340 socket.AF_VSOCK
2341
2342 def testVSOCKConstants(self):
2343 socket.SO_VM_SOCKETS_BUFFER_SIZE
2344 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2345 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2346 socket.VMADDR_CID_ANY
2347 socket.VMADDR_PORT_ANY
2348 socket.VMADDR_CID_HOST
2349 socket.VM_SOCKETS_INVALID_VERSION
2350 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2351
2352 def testCreateSocket(self):
2353 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2354 pass
2355
2356 def testSocketBufferSize(self):
2357 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2358 orig_max = s.getsockopt(socket.AF_VSOCK,
2359 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2360 orig = s.getsockopt(socket.AF_VSOCK,
2361 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2362 orig_min = s.getsockopt(socket.AF_VSOCK,
2363 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2364
2365 s.setsockopt(socket.AF_VSOCK,
2366 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2367 s.setsockopt(socket.AF_VSOCK,
2368 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2369 s.setsockopt(socket.AF_VSOCK,
2370 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2371
2372 self.assertEqual(orig_max * 2,
2373 s.getsockopt(socket.AF_VSOCK,
2374 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2375 self.assertEqual(orig * 2,
2376 s.getsockopt(socket.AF_VSOCK,
2377 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2378 self.assertEqual(orig_min * 2,
2379 s.getsockopt(socket.AF_VSOCK,
2380 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2381
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002382
Greg Bowser8fbece12019-08-02 16:29:52 -04002383@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2384 'Bluetooth sockets required for this test.')
2385class BasicBluetoothTest(unittest.TestCase):
2386
2387 def testBluetoothConstants(self):
2388 socket.BDADDR_ANY
2389 socket.BDADDR_LOCAL
2390 socket.AF_BLUETOOTH
2391 socket.BTPROTO_RFCOMM
2392
2393 if sys.platform != "win32":
2394 socket.BTPROTO_HCI
2395 socket.SOL_HCI
2396 socket.BTPROTO_L2CAP
2397
2398 if not sys.platform.startswith("freebsd"):
2399 socket.BTPROTO_SCO
2400
2401 def testCreateRfcommSocket(self):
2402 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2403 pass
2404
2405 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2406 def testCreateL2capSocket(self):
2407 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2408 pass
2409
2410 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2411 def testCreateHciSocket(self):
2412 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2413 pass
2414
2415 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2416 "windows and freebsd do not support SCO sockets")
2417 def testCreateScoSocket(self):
2418 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2419 pass
2420
2421
Guido van Rossum24e4af82002-06-12 19:18:08 +00002422class BasicTCPTest(SocketConnectedTest):
2423
2424 def __init__(self, methodName='runTest'):
2425 SocketConnectedTest.__init__(self, methodName=methodName)
2426
2427 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002428 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002429 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002430 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002431
2432 def _testRecv(self):
2433 self.serv_conn.send(MSG)
2434
2435 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002436 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002437 seg1 = self.cli_conn.recv(len(MSG) - 3)
2438 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002439 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002440 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002441
2442 def _testOverFlowRecv(self):
2443 self.serv_conn.send(MSG)
2444
2445 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002446 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002447 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002448 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002449
2450 def _testRecvFrom(self):
2451 self.serv_conn.send(MSG)
2452
2453 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002454 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002455 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2456 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002457 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002458 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002459
2460 def _testOverFlowRecvFrom(self):
2461 self.serv_conn.send(MSG)
2462
2463 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002464 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002465 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002466 while 1:
2467 read = self.cli_conn.recv(1024)
2468 if not read:
2469 break
Guido van Rossume531e292002-08-08 20:28:34 +00002470 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002471 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002472
2473 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002474 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002475 self.serv_conn.sendall(big_chunk)
2476
2477 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002478 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002479 fd = self.cli_conn.fileno()
2480 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002481 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002482 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002483 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002484 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002485
2486 def _testFromFd(self):
2487 self.serv_conn.send(MSG)
2488
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002489 def testDup(self):
2490 # Testing dup()
2491 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002492 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002493 msg = sock.recv(1024)
2494 self.assertEqual(msg, MSG)
2495
2496 def _testDup(self):
2497 self.serv_conn.send(MSG)
2498
Guido van Rossum24e4af82002-06-12 19:18:08 +00002499 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002500 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002501 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002502 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002503 # wait for _testShutdown to finish: on OS X, when the server
2504 # closes the connection the client also becomes disconnected,
2505 # and the client's shutdown call will fail. (Issue #4397.)
2506 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002507
2508 def _testShutdown(self):
2509 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002510 self.serv_conn.shutdown(2)
2511
2512 testShutdown_overflow = support.cpython_only(testShutdown)
2513
2514 @support.cpython_only
2515 def _testShutdown_overflow(self):
2516 import _testcapi
2517 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002518 # Issue 15989
2519 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2520 _testcapi.INT_MAX + 1)
2521 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2522 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002523 self.serv_conn.shutdown(2)
2524
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002525 def testDetach(self):
2526 # Testing detach()
2527 fileno = self.cli_conn.fileno()
2528 f = self.cli_conn.detach()
2529 self.assertEqual(f, fileno)
2530 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002531 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002532 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002533 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002534 # ...but we can create another socket using the (still open)
2535 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002536 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002537 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002538 msg = sock.recv(1024)
2539 self.assertEqual(msg, MSG)
2540
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002541 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002542 self.serv_conn.send(MSG)
2543
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002544
Guido van Rossum24e4af82002-06-12 19:18:08 +00002545class BasicUDPTest(ThreadedUDPSocketTest):
2546
2547 def __init__(self, methodName='runTest'):
2548 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2549
2550 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002551 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002552 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002553 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002554
2555 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002556 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002557
Guido van Rossum1c938012002-06-12 21:17:20 +00002558 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002559 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002560 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002561 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002562
Guido van Rossum1c938012002-06-12 21:17:20 +00002563 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002564 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002565
Guido van Rossumd8faa362007-04-27 19:54:29 +00002566 def testRecvFromNegative(self):
2567 # Negative lengths passed to recvfrom should give ValueError.
2568 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2569
2570 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002571 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002572
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002573
2574@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2575 'UDPLITE sockets required for this test.')
2576class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2577
2578 def __init__(self, methodName='runTest'):
2579 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2580
2581 def testSendtoAndRecv(self):
2582 # Testing sendto() and Recv() over UDPLITE
2583 msg = self.serv.recv(len(MSG))
2584 self.assertEqual(msg, MSG)
2585
2586 def _testSendtoAndRecv(self):
2587 self.cli.sendto(MSG, 0, (HOST, self.port))
2588
2589 def testRecvFrom(self):
2590 # Testing recvfrom() over UDPLITE
2591 msg, addr = self.serv.recvfrom(len(MSG))
2592 self.assertEqual(msg, MSG)
2593
2594 def _testRecvFrom(self):
2595 self.cli.sendto(MSG, 0, (HOST, self.port))
2596
2597 def testRecvFromNegative(self):
2598 # Negative lengths passed to recvfrom should give ValueError.
2599 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2600
2601 def _testRecvFromNegative(self):
2602 self.cli.sendto(MSG, 0, (HOST, self.port))
2603
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002604# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2605# same test code is used with different families and types of socket
2606# (e.g. stream, datagram), and tests using recvmsg() are repeated
2607# using recvmsg_into().
2608#
2609# The generic test classes such as SendmsgTests and
2610# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2611# supplied with sockets cli_sock and serv_sock representing the
2612# client's and the server's end of the connection respectively, and
2613# attributes cli_addr and serv_addr holding their (numeric where
2614# appropriate) addresses.
2615#
2616# The final concrete test classes combine these with subclasses of
2617# SocketTestBase which set up client and server sockets of a specific
2618# type, and with subclasses of SendrecvmsgBase such as
2619# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2620# sockets to cli_sock and serv_sock and override the methods and
2621# attributes of SendrecvmsgBase to fill in destination addresses if
2622# needed when sending, check for specific flags in msg_flags, etc.
2623#
2624# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2625# recvmsg_into().
2626
2627# XXX: like the other datagram (UDP) tests in this module, the code
2628# here assumes that datagram delivery on the local machine will be
2629# reliable.
2630
2631class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2632 # Base class for sendmsg()/recvmsg() tests.
2633
2634 # Time in seconds to wait before considering a test failed, or
2635 # None for no timeout. Not all tests actually set a timeout.
Victor Stinner24c62582019-10-30 12:41:43 +01002636 fail_timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002637
2638 def setUp(self):
2639 self.misc_event = threading.Event()
2640 super().setUp()
2641
2642 def sendToServer(self, msg):
2643 # Send msg to the server.
2644 return self.cli_sock.send(msg)
2645
2646 # Tuple of alternative default arguments for sendmsg() when called
2647 # via sendmsgToServer() (e.g. to include a destination address).
2648 sendmsg_to_server_defaults = ()
2649
2650 def sendmsgToServer(self, *args):
2651 # Call sendmsg() on self.cli_sock with the given arguments,
2652 # filling in any arguments which are not supplied with the
2653 # corresponding items of self.sendmsg_to_server_defaults, if
2654 # any.
2655 return self.cli_sock.sendmsg(
2656 *(args + self.sendmsg_to_server_defaults[len(args):]))
2657
2658 def doRecvmsg(self, sock, bufsize, *args):
2659 # Call recvmsg() on sock with given arguments and return its
2660 # result. Should be used for tests which can use either
2661 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2662 # this method with one which emulates it using recvmsg_into(),
2663 # thus allowing the same test to be used for both methods.
2664 result = sock.recvmsg(bufsize, *args)
2665 self.registerRecvmsgResult(result)
2666 return result
2667
2668 def registerRecvmsgResult(self, result):
2669 # Called by doRecvmsg() with the return value of recvmsg() or
2670 # recvmsg_into(). Can be overridden to arrange cleanup based
2671 # on the returned ancillary data, for instance.
2672 pass
2673
2674 def checkRecvmsgAddress(self, addr1, addr2):
2675 # Called to compare the received address with the address of
2676 # the peer.
2677 self.assertEqual(addr1, addr2)
2678
2679 # Flags that are normally unset in msg_flags
2680 msg_flags_common_unset = 0
2681 for name in ("MSG_CTRUNC", "MSG_OOB"):
2682 msg_flags_common_unset |= getattr(socket, name, 0)
2683
2684 # Flags that are normally set
2685 msg_flags_common_set = 0
2686
2687 # Flags set when a complete record has been received (e.g. MSG_EOR
2688 # for SCTP)
2689 msg_flags_eor_indicator = 0
2690
2691 # Flags set when a complete record has not been received
2692 # (e.g. MSG_TRUNC for datagram sockets)
2693 msg_flags_non_eor_indicator = 0
2694
2695 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2696 # Method to check the value of msg_flags returned by recvmsg[_into]().
2697 #
2698 # Checks that all bits in msg_flags_common_set attribute are
2699 # set in "flags" and all bits in msg_flags_common_unset are
2700 # unset.
2701 #
2702 # The "eor" argument specifies whether the flags should
2703 # indicate that a full record (or datagram) has been received.
2704 # If "eor" is None, no checks are done; otherwise, checks
2705 # that:
2706 #
2707 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2708 # set and all bits in msg_flags_non_eor_indicator are unset
2709 #
2710 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2711 # are set and all bits in msg_flags_eor_indicator are unset
2712 #
2713 # If "checkset" and/or "checkunset" are supplied, they require
2714 # the given bits to be set or unset respectively, overriding
2715 # what the attributes require for those bits.
2716 #
2717 # If any bits are set in "ignore", they will not be checked,
2718 # regardless of the other inputs.
2719 #
2720 # Will raise Exception if the inputs require a bit to be both
2721 # set and unset, and it is not ignored.
2722
2723 defaultset = self.msg_flags_common_set
2724 defaultunset = self.msg_flags_common_unset
2725
2726 if eor:
2727 defaultset |= self.msg_flags_eor_indicator
2728 defaultunset |= self.msg_flags_non_eor_indicator
2729 elif eor is not None:
2730 defaultset |= self.msg_flags_non_eor_indicator
2731 defaultunset |= self.msg_flags_eor_indicator
2732
2733 # Function arguments override defaults
2734 defaultset &= ~checkunset
2735 defaultunset &= ~checkset
2736
2737 # Merge arguments with remaining defaults, and check for conflicts
2738 checkset |= defaultset
2739 checkunset |= defaultunset
2740 inboth = checkset & checkunset & ~ignore
2741 if inboth:
2742 raise Exception("contradictory set, unset requirements for flags "
2743 "{0:#x}".format(inboth))
2744
2745 # Compare with given msg_flags value
2746 mask = (checkset | checkunset) & ~ignore
2747 self.assertEqual(flags & mask, checkset & mask)
2748
2749
2750class RecvmsgIntoMixin(SendrecvmsgBase):
2751 # Mixin to implement doRecvmsg() using recvmsg_into().
2752
2753 def doRecvmsg(self, sock, bufsize, *args):
2754 buf = bytearray(bufsize)
2755 result = sock.recvmsg_into([buf], *args)
2756 self.registerRecvmsgResult(result)
2757 self.assertGreaterEqual(result[0], 0)
2758 self.assertLessEqual(result[0], bufsize)
2759 return (bytes(buf[:result[0]]),) + result[1:]
2760
2761
2762class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2763 # Defines flags to be checked in msg_flags for datagram sockets.
2764
2765 @property
2766 def msg_flags_non_eor_indicator(self):
2767 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2768
2769
2770class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2771 # Defines flags to be checked in msg_flags for SCTP sockets.
2772
2773 @property
2774 def msg_flags_eor_indicator(self):
2775 return super().msg_flags_eor_indicator | socket.MSG_EOR
2776
2777
2778class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2779 # Base class for tests on connectionless-mode sockets. Users must
2780 # supply sockets on attributes cli and serv to be mapped to
2781 # cli_sock and serv_sock respectively.
2782
2783 @property
2784 def serv_sock(self):
2785 return self.serv
2786
2787 @property
2788 def cli_sock(self):
2789 return self.cli
2790
2791 @property
2792 def sendmsg_to_server_defaults(self):
2793 return ([], [], 0, self.serv_addr)
2794
2795 def sendToServer(self, msg):
2796 return self.cli_sock.sendto(msg, self.serv_addr)
2797
2798
2799class SendrecvmsgConnectedBase(SendrecvmsgBase):
2800 # Base class for tests on connected sockets. Users must supply
2801 # sockets on attributes serv_conn and cli_conn (representing the
2802 # connections *to* the server and the client), to be mapped to
2803 # cli_sock and serv_sock respectively.
2804
2805 @property
2806 def serv_sock(self):
2807 return self.cli_conn
2808
2809 @property
2810 def cli_sock(self):
2811 return self.serv_conn
2812
2813 def checkRecvmsgAddress(self, addr1, addr2):
2814 # Address is currently "unspecified" for a connected socket,
2815 # so we don't examine it
2816 pass
2817
2818
2819class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2820 # Base class to set a timeout on server's socket.
2821
2822 def setUp(self):
2823 super().setUp()
2824 self.serv_sock.settimeout(self.fail_timeout)
2825
2826
2827class SendmsgTests(SendrecvmsgServerTimeoutBase):
2828 # Tests for sendmsg() which can use any socket type and do not
2829 # involve recvmsg() or recvmsg_into().
2830
2831 def testSendmsg(self):
2832 # Send a simple message with sendmsg().
2833 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2834
2835 def _testSendmsg(self):
2836 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2837
2838 def testSendmsgDataGenerator(self):
2839 # Send from buffer obtained from a generator (not a sequence).
2840 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2841
2842 def _testSendmsgDataGenerator(self):
2843 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2844 len(MSG))
2845
2846 def testSendmsgAncillaryGenerator(self):
2847 # Gather (empty) ancillary data from a generator.
2848 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2849
2850 def _testSendmsgAncillaryGenerator(self):
2851 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2852 len(MSG))
2853
2854 def testSendmsgArray(self):
2855 # Send data from an array instead of the usual bytes object.
2856 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2857
2858 def _testSendmsgArray(self):
2859 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2860 len(MSG))
2861
2862 def testSendmsgGather(self):
2863 # Send message data from more than one buffer (gather write).
2864 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2865
2866 def _testSendmsgGather(self):
2867 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2868
2869 def testSendmsgBadArgs(self):
2870 # Check that sendmsg() rejects invalid arguments.
2871 self.assertEqual(self.serv_sock.recv(1000), b"done")
2872
2873 def _testSendmsgBadArgs(self):
2874 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2875 self.assertRaises(TypeError, self.sendmsgToServer,
2876 b"not in an iterable")
2877 self.assertRaises(TypeError, self.sendmsgToServer,
2878 object())
2879 self.assertRaises(TypeError, self.sendmsgToServer,
2880 [object()])
2881 self.assertRaises(TypeError, self.sendmsgToServer,
2882 [MSG, object()])
2883 self.assertRaises(TypeError, self.sendmsgToServer,
2884 [MSG], object())
2885 self.assertRaises(TypeError, self.sendmsgToServer,
2886 [MSG], [], object())
2887 self.assertRaises(TypeError, self.sendmsgToServer,
2888 [MSG], [], 0, object())
2889 self.sendToServer(b"done")
2890
2891 def testSendmsgBadCmsg(self):
2892 # Check that invalid ancillary data items are rejected.
2893 self.assertEqual(self.serv_sock.recv(1000), b"done")
2894
2895 def _testSendmsgBadCmsg(self):
2896 self.assertRaises(TypeError, self.sendmsgToServer,
2897 [MSG], [object()])
2898 self.assertRaises(TypeError, self.sendmsgToServer,
2899 [MSG], [(object(), 0, b"data")])
2900 self.assertRaises(TypeError, self.sendmsgToServer,
2901 [MSG], [(0, object(), b"data")])
2902 self.assertRaises(TypeError, self.sendmsgToServer,
2903 [MSG], [(0, 0, object())])
2904 self.assertRaises(TypeError, self.sendmsgToServer,
2905 [MSG], [(0, 0)])
2906 self.assertRaises(TypeError, self.sendmsgToServer,
2907 [MSG], [(0, 0, b"data", 42)])
2908 self.sendToServer(b"done")
2909
2910 @requireAttrs(socket, "CMSG_SPACE")
2911 def testSendmsgBadMultiCmsg(self):
2912 # Check that invalid ancillary data items are rejected when
2913 # more than one item is present.
2914 self.assertEqual(self.serv_sock.recv(1000), b"done")
2915
2916 @testSendmsgBadMultiCmsg.client_skip
2917 def _testSendmsgBadMultiCmsg(self):
2918 self.assertRaises(TypeError, self.sendmsgToServer,
2919 [MSG], [0, 0, b""])
2920 self.assertRaises(TypeError, self.sendmsgToServer,
2921 [MSG], [(0, 0, b""), object()])
2922 self.sendToServer(b"done")
2923
2924 def testSendmsgExcessCmsgReject(self):
2925 # Check that sendmsg() rejects excess ancillary data items
2926 # when the number that can be sent is limited.
2927 self.assertEqual(self.serv_sock.recv(1000), b"done")
2928
2929 def _testSendmsgExcessCmsgReject(self):
2930 if not hasattr(socket, "CMSG_SPACE"):
2931 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002932 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002933 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2934 self.assertIsNone(cm.exception.errno)
2935 self.sendToServer(b"done")
2936
2937 def testSendmsgAfterClose(self):
2938 # Check that sendmsg() fails on a closed socket.
2939 pass
2940
2941 def _testSendmsgAfterClose(self):
2942 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002943 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002944
2945
2946class SendmsgStreamTests(SendmsgTests):
2947 # Tests for sendmsg() which require a stream socket and do not
2948 # involve recvmsg() or recvmsg_into().
2949
2950 def testSendmsgExplicitNoneAddr(self):
2951 # Check that peer address can be specified as None.
2952 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2953
2954 def _testSendmsgExplicitNoneAddr(self):
2955 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2956
2957 def testSendmsgTimeout(self):
2958 # Check that timeout works with sendmsg().
2959 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2960 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2961
2962 def _testSendmsgTimeout(self):
2963 try:
2964 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002965 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002966 while True:
2967 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002968 except socket.timeout:
2969 pass
2970 except OSError as exc:
2971 if exc.errno != errno.ENOMEM:
2972 raise
2973 # bpo-33937 the test randomly fails on Travis CI with
2974 # "OSError: [Errno 12] Cannot allocate memory"
2975 else:
2976 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002977 finally:
2978 self.misc_event.set()
2979
2980 # XXX: would be nice to have more tests for sendmsg flags argument.
2981
2982 # Linux supports MSG_DONTWAIT when sending, but in general, it
2983 # only works when receiving. Could add other platforms if they
2984 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002985 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002986 "MSG_DONTWAIT not known to work on this platform when "
2987 "sending")
2988 def testSendmsgDontWait(self):
2989 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2990 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2991 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2992
2993 @testSendmsgDontWait.client_skip
2994 def _testSendmsgDontWait(self):
2995 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002996 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002997 while True:
2998 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002999 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
3000 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003001 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07003002 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003003 finally:
3004 self.misc_event.set()
3005
3006
3007class SendmsgConnectionlessTests(SendmsgTests):
3008 # Tests for sendmsg() which require a connectionless-mode
3009 # (e.g. datagram) socket, and do not involve recvmsg() or
3010 # recvmsg_into().
3011
3012 def testSendmsgNoDestAddr(self):
3013 # Check that sendmsg() fails when no destination address is
3014 # given for unconnected socket.
3015 pass
3016
3017 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003018 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003019 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003020 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003021 [MSG], [], 0, None)
3022
3023
3024class RecvmsgGenericTests(SendrecvmsgBase):
3025 # Tests for recvmsg() which can also be emulated using
3026 # recvmsg_into(), and can use any socket type.
3027
3028 def testRecvmsg(self):
3029 # Receive a simple message with recvmsg[_into]().
3030 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3031 self.assertEqual(msg, MSG)
3032 self.checkRecvmsgAddress(addr, self.cli_addr)
3033 self.assertEqual(ancdata, [])
3034 self.checkFlags(flags, eor=True)
3035
3036 def _testRecvmsg(self):
3037 self.sendToServer(MSG)
3038
3039 def testRecvmsgExplicitDefaults(self):
3040 # Test recvmsg[_into]() with default arguments provided explicitly.
3041 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3042 len(MSG), 0, 0)
3043 self.assertEqual(msg, MSG)
3044 self.checkRecvmsgAddress(addr, self.cli_addr)
3045 self.assertEqual(ancdata, [])
3046 self.checkFlags(flags, eor=True)
3047
3048 def _testRecvmsgExplicitDefaults(self):
3049 self.sendToServer(MSG)
3050
3051 def testRecvmsgShorter(self):
3052 # Receive a message smaller than buffer.
3053 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3054 len(MSG) + 42)
3055 self.assertEqual(msg, MSG)
3056 self.checkRecvmsgAddress(addr, self.cli_addr)
3057 self.assertEqual(ancdata, [])
3058 self.checkFlags(flags, eor=True)
3059
3060 def _testRecvmsgShorter(self):
3061 self.sendToServer(MSG)
3062
3063 def testRecvmsgTrunc(self):
3064 # Receive part of message, check for truncation indicators.
3065 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3066 len(MSG) - 3)
3067 self.assertEqual(msg, MSG[:-3])
3068 self.checkRecvmsgAddress(addr, self.cli_addr)
3069 self.assertEqual(ancdata, [])
3070 self.checkFlags(flags, eor=False)
3071
3072 def _testRecvmsgTrunc(self):
3073 self.sendToServer(MSG)
3074
3075 def testRecvmsgShortAncillaryBuf(self):
3076 # Test ancillary data buffer too small to hold any ancillary data.
3077 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3078 len(MSG), 1)
3079 self.assertEqual(msg, MSG)
3080 self.checkRecvmsgAddress(addr, self.cli_addr)
3081 self.assertEqual(ancdata, [])
3082 self.checkFlags(flags, eor=True)
3083
3084 def _testRecvmsgShortAncillaryBuf(self):
3085 self.sendToServer(MSG)
3086
3087 def testRecvmsgLongAncillaryBuf(self):
3088 # Test large ancillary data buffer.
3089 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3090 len(MSG), 10240)
3091 self.assertEqual(msg, MSG)
3092 self.checkRecvmsgAddress(addr, self.cli_addr)
3093 self.assertEqual(ancdata, [])
3094 self.checkFlags(flags, eor=True)
3095
3096 def _testRecvmsgLongAncillaryBuf(self):
3097 self.sendToServer(MSG)
3098
3099 def testRecvmsgAfterClose(self):
3100 # Check that recvmsg[_into]() fails on a closed socket.
3101 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003102 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003103
3104 def _testRecvmsgAfterClose(self):
3105 pass
3106
3107 def testRecvmsgTimeout(self):
3108 # Check that timeout works.
3109 try:
3110 self.serv_sock.settimeout(0.03)
3111 self.assertRaises(socket.timeout,
3112 self.doRecvmsg, self.serv_sock, len(MSG))
3113 finally:
3114 self.misc_event.set()
3115
3116 def _testRecvmsgTimeout(self):
3117 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3118
3119 @requireAttrs(socket, "MSG_PEEK")
3120 def testRecvmsgPeek(self):
3121 # Check that MSG_PEEK in flags enables examination of pending
3122 # data without consuming it.
3123
3124 # Receive part of data with MSG_PEEK.
3125 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3126 len(MSG) - 3, 0,
3127 socket.MSG_PEEK)
3128 self.assertEqual(msg, MSG[:-3])
3129 self.checkRecvmsgAddress(addr, self.cli_addr)
3130 self.assertEqual(ancdata, [])
3131 # Ignoring MSG_TRUNC here (so this test is the same for stream
3132 # and datagram sockets). Some wording in POSIX seems to
3133 # suggest that it needn't be set when peeking, but that may
3134 # just be a slip.
3135 self.checkFlags(flags, eor=False,
3136 ignore=getattr(socket, "MSG_TRUNC", 0))
3137
3138 # Receive all data with MSG_PEEK.
3139 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3140 len(MSG), 0,
3141 socket.MSG_PEEK)
3142 self.assertEqual(msg, MSG)
3143 self.checkRecvmsgAddress(addr, self.cli_addr)
3144 self.assertEqual(ancdata, [])
3145 self.checkFlags(flags, eor=True)
3146
3147 # Check that the same data can still be received normally.
3148 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3149 self.assertEqual(msg, MSG)
3150 self.checkRecvmsgAddress(addr, self.cli_addr)
3151 self.assertEqual(ancdata, [])
3152 self.checkFlags(flags, eor=True)
3153
3154 @testRecvmsgPeek.client_skip
3155 def _testRecvmsgPeek(self):
3156 self.sendToServer(MSG)
3157
3158 @requireAttrs(socket.socket, "sendmsg")
3159 def testRecvmsgFromSendmsg(self):
3160 # Test receiving with recvmsg[_into]() when message is sent
3161 # using sendmsg().
3162 self.serv_sock.settimeout(self.fail_timeout)
3163 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3164 self.assertEqual(msg, MSG)
3165 self.checkRecvmsgAddress(addr, self.cli_addr)
3166 self.assertEqual(ancdata, [])
3167 self.checkFlags(flags, eor=True)
3168
3169 @testRecvmsgFromSendmsg.client_skip
3170 def _testRecvmsgFromSendmsg(self):
3171 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3172
3173
3174class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3175 # Tests which require a stream socket and can use either recvmsg()
3176 # or recvmsg_into().
3177
3178 def testRecvmsgEOF(self):
3179 # Receive end-of-stream indicator (b"", peer socket closed).
3180 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3181 self.assertEqual(msg, b"")
3182 self.checkRecvmsgAddress(addr, self.cli_addr)
3183 self.assertEqual(ancdata, [])
3184 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3185
3186 def _testRecvmsgEOF(self):
3187 self.cli_sock.close()
3188
3189 def testRecvmsgOverflow(self):
3190 # Receive a message in more than one chunk.
3191 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3192 len(MSG) - 3)
3193 self.checkRecvmsgAddress(addr, self.cli_addr)
3194 self.assertEqual(ancdata, [])
3195 self.checkFlags(flags, eor=False)
3196
3197 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3198 self.checkRecvmsgAddress(addr, self.cli_addr)
3199 self.assertEqual(ancdata, [])
3200 self.checkFlags(flags, eor=True)
3201
3202 msg = seg1 + seg2
3203 self.assertEqual(msg, MSG)
3204
3205 def _testRecvmsgOverflow(self):
3206 self.sendToServer(MSG)
3207
3208
3209class RecvmsgTests(RecvmsgGenericTests):
3210 # Tests for recvmsg() which can use any socket type.
3211
3212 def testRecvmsgBadArgs(self):
3213 # Check that recvmsg() rejects invalid arguments.
3214 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3215 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3216 -1, 0, 0)
3217 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3218 len(MSG), -1, 0)
3219 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3220 [bytearray(10)], 0, 0)
3221 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3222 object(), 0, 0)
3223 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3224 len(MSG), object(), 0)
3225 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3226 len(MSG), 0, object())
3227
3228 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3229 self.assertEqual(msg, MSG)
3230 self.checkRecvmsgAddress(addr, self.cli_addr)
3231 self.assertEqual(ancdata, [])
3232 self.checkFlags(flags, eor=True)
3233
3234 def _testRecvmsgBadArgs(self):
3235 self.sendToServer(MSG)
3236
3237
3238class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3239 # Tests for recvmsg_into() which can use any socket type.
3240
3241 def testRecvmsgIntoBadArgs(self):
3242 # Check that recvmsg_into() rejects invalid arguments.
3243 buf = bytearray(len(MSG))
3244 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3245 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3246 len(MSG), 0, 0)
3247 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3248 buf, 0, 0)
3249 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3250 [object()], 0, 0)
3251 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3252 [b"I'm not writable"], 0, 0)
3253 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3254 [buf, object()], 0, 0)
3255 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3256 [buf], -1, 0)
3257 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3258 [buf], object(), 0)
3259 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3260 [buf], 0, object())
3261
3262 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3263 self.assertEqual(nbytes, len(MSG))
3264 self.assertEqual(buf, bytearray(MSG))
3265 self.checkRecvmsgAddress(addr, self.cli_addr)
3266 self.assertEqual(ancdata, [])
3267 self.checkFlags(flags, eor=True)
3268
3269 def _testRecvmsgIntoBadArgs(self):
3270 self.sendToServer(MSG)
3271
3272 def testRecvmsgIntoGenerator(self):
3273 # Receive into buffer obtained from a generator (not a sequence).
3274 buf = bytearray(len(MSG))
3275 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3276 (o for o in [buf]))
3277 self.assertEqual(nbytes, len(MSG))
3278 self.assertEqual(buf, bytearray(MSG))
3279 self.checkRecvmsgAddress(addr, self.cli_addr)
3280 self.assertEqual(ancdata, [])
3281 self.checkFlags(flags, eor=True)
3282
3283 def _testRecvmsgIntoGenerator(self):
3284 self.sendToServer(MSG)
3285
3286 def testRecvmsgIntoArray(self):
3287 # Receive into an array rather than the usual bytearray.
3288 buf = array.array("B", [0] * len(MSG))
3289 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3290 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003291 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003292 self.checkRecvmsgAddress(addr, self.cli_addr)
3293 self.assertEqual(ancdata, [])
3294 self.checkFlags(flags, eor=True)
3295
3296 def _testRecvmsgIntoArray(self):
3297 self.sendToServer(MSG)
3298
3299 def testRecvmsgIntoScatter(self):
3300 # Receive into multiple buffers (scatter write).
3301 b1 = bytearray(b"----")
3302 b2 = bytearray(b"0123456789")
3303 b3 = bytearray(b"--------------")
3304 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3305 [b1, memoryview(b2)[2:9], b3])
3306 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3307 self.assertEqual(b1, bytearray(b"Mary"))
3308 self.assertEqual(b2, bytearray(b"01 had a 9"))
3309 self.assertEqual(b3, bytearray(b"little lamb---"))
3310 self.checkRecvmsgAddress(addr, self.cli_addr)
3311 self.assertEqual(ancdata, [])
3312 self.checkFlags(flags, eor=True)
3313
3314 def _testRecvmsgIntoScatter(self):
3315 self.sendToServer(b"Mary had a little lamb")
3316
3317
3318class CmsgMacroTests(unittest.TestCase):
3319 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3320 # assumptions used by sendmsg() and recvmsg[_into](), which share
3321 # code with these functions.
3322
3323 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003324 try:
3325 import _testcapi
3326 except ImportError:
3327 socklen_t_limit = 0x7fffffff
3328 else:
3329 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003330
3331 @requireAttrs(socket, "CMSG_LEN")
3332 def testCMSG_LEN(self):
3333 # Test CMSG_LEN() with various valid and invalid values,
3334 # checking the assumptions used by recvmsg() and sendmsg().
3335 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3336 values = list(range(257)) + list(range(toobig - 257, toobig))
3337
3338 # struct cmsghdr has at least three members, two of which are ints
3339 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3340 for n in values:
3341 ret = socket.CMSG_LEN(n)
3342 # This is how recvmsg() calculates the data size
3343 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3344 self.assertLessEqual(ret, self.socklen_t_limit)
3345
3346 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3347 # sendmsg() shares code with these functions, and requires
3348 # that it reject values over the limit.
3349 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3350 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3351
3352 @requireAttrs(socket, "CMSG_SPACE")
3353 def testCMSG_SPACE(self):
3354 # Test CMSG_SPACE() with various valid and invalid values,
3355 # checking the assumptions used by sendmsg().
3356 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3357 values = list(range(257)) + list(range(toobig - 257, toobig))
3358
3359 last = socket.CMSG_SPACE(0)
3360 # struct cmsghdr has at least three members, two of which are ints
3361 self.assertGreater(last, array.array("i").itemsize * 2)
3362 for n in values:
3363 ret = socket.CMSG_SPACE(n)
3364 self.assertGreaterEqual(ret, last)
3365 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3366 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3367 self.assertLessEqual(ret, self.socklen_t_limit)
3368 last = ret
3369
3370 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3371 # sendmsg() shares code with these functions, and requires
3372 # that it reject values over the limit.
3373 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3374 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3375
3376
3377class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3378 # Tests for file descriptor passing on Unix-domain sockets.
3379
3380 # Invalid file descriptor value that's unlikely to evaluate to a
3381 # real FD even if one of its bytes is replaced with a different
3382 # value (which shouldn't actually happen).
3383 badfd = -0x5555
3384
3385 def newFDs(self, n):
3386 # Return a list of n file descriptors for newly-created files
3387 # containing their list indices as ASCII numbers.
3388 fds = []
3389 for i in range(n):
3390 fd, path = tempfile.mkstemp()
3391 self.addCleanup(os.unlink, path)
3392 self.addCleanup(os.close, fd)
3393 os.write(fd, str(i).encode())
3394 fds.append(fd)
3395 return fds
3396
3397 def checkFDs(self, fds):
3398 # Check that the file descriptors in the given list contain
3399 # their correct list indices as ASCII numbers.
3400 for n, fd in enumerate(fds):
3401 os.lseek(fd, 0, os.SEEK_SET)
3402 self.assertEqual(os.read(fd, 1024), str(n).encode())
3403
3404 def registerRecvmsgResult(self, result):
3405 self.addCleanup(self.closeRecvmsgFDs, result)
3406
3407 def closeRecvmsgFDs(self, recvmsg_result):
3408 # Close all file descriptors specified in the ancillary data
3409 # of the given return value from recvmsg() or recvmsg_into().
3410 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3411 if (cmsg_level == socket.SOL_SOCKET and
3412 cmsg_type == socket.SCM_RIGHTS):
3413 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003414 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003415 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3416 for fd in fds:
3417 os.close(fd)
3418
3419 def createAndSendFDs(self, n):
3420 # Send n new file descriptors created by newFDs() to the
3421 # server, with the constant MSG as the non-ancillary data.
3422 self.assertEqual(
3423 self.sendmsgToServer([MSG],
3424 [(socket.SOL_SOCKET,
3425 socket.SCM_RIGHTS,
3426 array.array("i", self.newFDs(n)))]),
3427 len(MSG))
3428
3429 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3430 # Check that constant MSG was received with numfds file
3431 # descriptors in a maximum of maxcmsgs control messages (which
3432 # must contain only complete integers). By default, check
3433 # that MSG_CTRUNC is unset, but ignore any flags in
3434 # ignoreflags.
3435 msg, ancdata, flags, addr = result
3436 self.assertEqual(msg, MSG)
3437 self.checkRecvmsgAddress(addr, self.cli_addr)
3438 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3439 ignore=ignoreflags)
3440
3441 self.assertIsInstance(ancdata, list)
3442 self.assertLessEqual(len(ancdata), maxcmsgs)
3443 fds = array.array("i")
3444 for item in ancdata:
3445 self.assertIsInstance(item, tuple)
3446 cmsg_level, cmsg_type, cmsg_data = item
3447 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3448 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3449 self.assertIsInstance(cmsg_data, bytes)
3450 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003451 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452
3453 self.assertEqual(len(fds), numfds)
3454 self.checkFDs(fds)
3455
3456 def testFDPassSimple(self):
3457 # Pass a single FD (array read from bytes object).
3458 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3459 len(MSG), 10240))
3460
3461 def _testFDPassSimple(self):
3462 self.assertEqual(
3463 self.sendmsgToServer(
3464 [MSG],
3465 [(socket.SOL_SOCKET,
3466 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003467 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003468 len(MSG))
3469
3470 def testMultipleFDPass(self):
3471 # Pass multiple FDs in a single array.
3472 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3473 len(MSG), 10240))
3474
3475 def _testMultipleFDPass(self):
3476 self.createAndSendFDs(4)
3477
3478 @requireAttrs(socket, "CMSG_SPACE")
3479 def testFDPassCMSG_SPACE(self):
3480 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3481 self.checkRecvmsgFDs(
3482 4, self.doRecvmsg(self.serv_sock, len(MSG),
3483 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3484
3485 @testFDPassCMSG_SPACE.client_skip
3486 def _testFDPassCMSG_SPACE(self):
3487 self.createAndSendFDs(4)
3488
3489 def testFDPassCMSG_LEN(self):
3490 # Test using CMSG_LEN() to calculate ancillary buffer size.
3491 self.checkRecvmsgFDs(1,
3492 self.doRecvmsg(self.serv_sock, len(MSG),
3493 socket.CMSG_LEN(4 * SIZEOF_INT)),
3494 # RFC 3542 says implementations may set
3495 # MSG_CTRUNC if there isn't enough space
3496 # for trailing padding.
3497 ignoreflags=socket.MSG_CTRUNC)
3498
3499 def _testFDPassCMSG_LEN(self):
3500 self.createAndSendFDs(1)
3501
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003502 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003503 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003504 @requireAttrs(socket, "CMSG_SPACE")
3505 def testFDPassSeparate(self):
3506 # Pass two FDs in two separate arrays. Arrays may be combined
3507 # into a single control message by the OS.
3508 self.checkRecvmsgFDs(2,
3509 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3510 maxcmsgs=2)
3511
3512 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003513 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003514 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003515 def _testFDPassSeparate(self):
3516 fd0, fd1 = self.newFDs(2)
3517 self.assertEqual(
3518 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3519 socket.SCM_RIGHTS,
3520 array.array("i", [fd0])),
3521 (socket.SOL_SOCKET,
3522 socket.SCM_RIGHTS,
3523 array.array("i", [fd1]))]),
3524 len(MSG))
3525
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003526 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003527 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003528 @requireAttrs(socket, "CMSG_SPACE")
3529 def testFDPassSeparateMinSpace(self):
3530 # Pass two FDs in two separate arrays, receiving them into the
3531 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003532 num_fds = 2
3533 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003534 self.doRecvmsg(self.serv_sock, len(MSG),
3535 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003536 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003537 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3538
3539 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003540 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003541 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003542 def _testFDPassSeparateMinSpace(self):
3543 fd0, fd1 = self.newFDs(2)
3544 self.assertEqual(
3545 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3546 socket.SCM_RIGHTS,
3547 array.array("i", [fd0])),
3548 (socket.SOL_SOCKET,
3549 socket.SCM_RIGHTS,
3550 array.array("i", [fd1]))]),
3551 len(MSG))
3552
3553 def sendAncillaryIfPossible(self, msg, ancdata):
3554 # Try to send msg and ancdata to server, but if the system
3555 # call fails, just send msg with no ancillary data.
3556 try:
3557 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003558 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003559 # Check that it was the system call that failed
3560 self.assertIsInstance(e.errno, int)
3561 nbytes = self.sendmsgToServer([msg])
3562 self.assertEqual(nbytes, len(msg))
3563
Brett Cannon3bbad122015-12-28 17:21:44 -08003564 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003565 def testFDPassEmpty(self):
3566 # Try to pass an empty FD array. Can receive either no array
3567 # or an empty array.
3568 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3569 len(MSG), 10240),
3570 ignoreflags=socket.MSG_CTRUNC)
3571
3572 def _testFDPassEmpty(self):
3573 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3574 socket.SCM_RIGHTS,
3575 b"")])
3576
3577 def testFDPassPartialInt(self):
3578 # Try to pass a truncated FD array.
3579 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3580 len(MSG), 10240)
3581 self.assertEqual(msg, MSG)
3582 self.checkRecvmsgAddress(addr, self.cli_addr)
3583 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3584 self.assertLessEqual(len(ancdata), 1)
3585 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3586 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3587 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3588 self.assertLess(len(cmsg_data), SIZEOF_INT)
3589
3590 def _testFDPassPartialInt(self):
3591 self.sendAncillaryIfPossible(
3592 MSG,
3593 [(socket.SOL_SOCKET,
3594 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003595 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003596
3597 @requireAttrs(socket, "CMSG_SPACE")
3598 def testFDPassPartialIntInMiddle(self):
3599 # Try to pass two FD arrays, the first of which is truncated.
3600 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3601 len(MSG), 10240)
3602 self.assertEqual(msg, MSG)
3603 self.checkRecvmsgAddress(addr, self.cli_addr)
3604 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3605 self.assertLessEqual(len(ancdata), 2)
3606 fds = array.array("i")
3607 # Arrays may have been combined in a single control message
3608 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3609 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3610 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003611 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003612 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3613 self.assertLessEqual(len(fds), 2)
3614 self.checkFDs(fds)
3615
3616 @testFDPassPartialIntInMiddle.client_skip
3617 def _testFDPassPartialIntInMiddle(self):
3618 fd0, fd1 = self.newFDs(2)
3619 self.sendAncillaryIfPossible(
3620 MSG,
3621 [(socket.SOL_SOCKET,
3622 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003623 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003624 (socket.SOL_SOCKET,
3625 socket.SCM_RIGHTS,
3626 array.array("i", [fd1]))])
3627
3628 def checkTruncatedHeader(self, result, ignoreflags=0):
3629 # Check that no ancillary data items are returned when data is
3630 # truncated inside the cmsghdr structure.
3631 msg, ancdata, flags, addr = result
3632 self.assertEqual(msg, MSG)
3633 self.checkRecvmsgAddress(addr, self.cli_addr)
3634 self.assertEqual(ancdata, [])
3635 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3636 ignore=ignoreflags)
3637
3638 def testCmsgTruncNoBufSize(self):
3639 # Check that no ancillary data is received when no buffer size
3640 # is specified.
3641 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3642 # BSD seems to set MSG_CTRUNC only
3643 # if an item has been partially
3644 # received.
3645 ignoreflags=socket.MSG_CTRUNC)
3646
3647 def _testCmsgTruncNoBufSize(self):
3648 self.createAndSendFDs(1)
3649
3650 def testCmsgTrunc0(self):
3651 # Check that no ancillary data is received when buffer size is 0.
3652 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3653 ignoreflags=socket.MSG_CTRUNC)
3654
3655 def _testCmsgTrunc0(self):
3656 self.createAndSendFDs(1)
3657
3658 # Check that no ancillary data is returned for various non-zero
3659 # (but still too small) buffer sizes.
3660
3661 def testCmsgTrunc1(self):
3662 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3663
3664 def _testCmsgTrunc1(self):
3665 self.createAndSendFDs(1)
3666
3667 def testCmsgTrunc2Int(self):
3668 # The cmsghdr structure has at least three members, two of
3669 # which are ints, so we still shouldn't see any ancillary
3670 # data.
3671 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3672 SIZEOF_INT * 2))
3673
3674 def _testCmsgTrunc2Int(self):
3675 self.createAndSendFDs(1)
3676
3677 def testCmsgTruncLen0Minus1(self):
3678 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3679 socket.CMSG_LEN(0) - 1))
3680
3681 def _testCmsgTruncLen0Minus1(self):
3682 self.createAndSendFDs(1)
3683
3684 # The following tests try to truncate the control message in the
3685 # middle of the FD array.
3686
3687 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3688 # Check that file descriptor data is truncated to between
3689 # mindata and maxdata bytes when received with buffer size
3690 # ancbuf, and that any complete file descriptor numbers are
3691 # valid.
3692 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3693 len(MSG), ancbuf)
3694 self.assertEqual(msg, MSG)
3695 self.checkRecvmsgAddress(addr, self.cli_addr)
3696 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3697
3698 if mindata == 0 and ancdata == []:
3699 return
3700 self.assertEqual(len(ancdata), 1)
3701 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3702 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3703 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3704 self.assertGreaterEqual(len(cmsg_data), mindata)
3705 self.assertLessEqual(len(cmsg_data), maxdata)
3706 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003707 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3709 self.checkFDs(fds)
3710
3711 def testCmsgTruncLen0(self):
3712 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3713
3714 def _testCmsgTruncLen0(self):
3715 self.createAndSendFDs(1)
3716
3717 def testCmsgTruncLen0Plus1(self):
3718 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3719
3720 def _testCmsgTruncLen0Plus1(self):
3721 self.createAndSendFDs(2)
3722
3723 def testCmsgTruncLen1(self):
3724 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3725 maxdata=SIZEOF_INT)
3726
3727 def _testCmsgTruncLen1(self):
3728 self.createAndSendFDs(2)
3729
3730 def testCmsgTruncLen2Minus1(self):
3731 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3732 maxdata=(2 * SIZEOF_INT) - 1)
3733
3734 def _testCmsgTruncLen2Minus1(self):
3735 self.createAndSendFDs(2)
3736
3737
3738class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3739 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3740 # features of the RFC 3542 Advanced Sockets API for IPv6.
3741 # Currently we can only handle certain data items (e.g. traffic
3742 # class, hop limit, MTU discovery and fragmentation settings)
3743 # without resorting to unportable means such as the struct module,
3744 # but the tests here are aimed at testing the ancillary data
3745 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3746 # itself.
3747
3748 # Test value to use when setting hop limit of packet
3749 hop_limit = 2
3750
3751 # Test value to use when setting traffic class of packet.
3752 # -1 means "use kernel default".
3753 traffic_class = -1
3754
3755 def ancillaryMapping(self, ancdata):
3756 # Given ancillary data list ancdata, return a mapping from
3757 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3758 # Check that no (level, type) pair appears more than once.
3759 d = {}
3760 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3761 self.assertNotIn((cmsg_level, cmsg_type), d)
3762 d[(cmsg_level, cmsg_type)] = cmsg_data
3763 return d
3764
3765 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3766 # Receive hop limit into ancbufsize bytes of ancillary data
3767 # space. Check that data is MSG, ancillary data is not
3768 # truncated (but ignore any flags in ignoreflags), and hop
3769 # limit is between 0 and maxhop inclusive.
3770 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3771 socket.IPV6_RECVHOPLIMIT, 1)
3772 self.misc_event.set()
3773 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3774 len(MSG), ancbufsize)
3775
3776 self.assertEqual(msg, MSG)
3777 self.checkRecvmsgAddress(addr, self.cli_addr)
3778 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3779 ignore=ignoreflags)
3780
3781 self.assertEqual(len(ancdata), 1)
3782 self.assertIsInstance(ancdata[0], tuple)
3783 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3784 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3785 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3786 self.assertIsInstance(cmsg_data, bytes)
3787 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3788 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003789 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003790 self.assertGreaterEqual(a[0], 0)
3791 self.assertLessEqual(a[0], maxhop)
3792
3793 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3794 def testRecvHopLimit(self):
3795 # Test receiving the packet hop limit as ancillary data.
3796 self.checkHopLimit(ancbufsize=10240)
3797
3798 @testRecvHopLimit.client_skip
3799 def _testRecvHopLimit(self):
3800 # Need to wait until server has asked to receive ancillary
3801 # data, as implementations are not required to buffer it
3802 # otherwise.
3803 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3804 self.sendToServer(MSG)
3805
3806 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3807 def testRecvHopLimitCMSG_SPACE(self):
3808 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3809 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3810
3811 @testRecvHopLimitCMSG_SPACE.client_skip
3812 def _testRecvHopLimitCMSG_SPACE(self):
3813 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3814 self.sendToServer(MSG)
3815
3816 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3817 # 3542 says portable applications must provide space for trailing
3818 # padding. Implementations may set MSG_CTRUNC if there isn't
3819 # enough space for the padding.
3820
3821 @requireAttrs(socket.socket, "sendmsg")
3822 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3823 def testSetHopLimit(self):
3824 # Test setting hop limit on outgoing packet and receiving it
3825 # at the other end.
3826 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3827
3828 @testSetHopLimit.client_skip
3829 def _testSetHopLimit(self):
3830 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3831 self.assertEqual(
3832 self.sendmsgToServer([MSG],
3833 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3834 array.array("i", [self.hop_limit]))]),
3835 len(MSG))
3836
3837 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3838 ignoreflags=0):
3839 # Receive traffic class and hop limit into ancbufsize bytes of
3840 # ancillary data space. Check that data is MSG, ancillary
3841 # data is not truncated (but ignore any flags in ignoreflags),
3842 # and traffic class and hop limit are in range (hop limit no
3843 # more than maxhop).
3844 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3845 socket.IPV6_RECVHOPLIMIT, 1)
3846 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3847 socket.IPV6_RECVTCLASS, 1)
3848 self.misc_event.set()
3849 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3850 len(MSG), ancbufsize)
3851
3852 self.assertEqual(msg, MSG)
3853 self.checkRecvmsgAddress(addr, self.cli_addr)
3854 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3855 ignore=ignoreflags)
3856 self.assertEqual(len(ancdata), 2)
3857 ancmap = self.ancillaryMapping(ancdata)
3858
3859 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3860 self.assertEqual(len(tcdata), SIZEOF_INT)
3861 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003862 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003863 self.assertGreaterEqual(a[0], 0)
3864 self.assertLessEqual(a[0], 255)
3865
3866 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3867 self.assertEqual(len(hldata), SIZEOF_INT)
3868 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003869 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003870 self.assertGreaterEqual(a[0], 0)
3871 self.assertLessEqual(a[0], maxhop)
3872
3873 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3874 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3875 def testRecvTrafficClassAndHopLimit(self):
3876 # Test receiving traffic class and hop limit as ancillary data.
3877 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3878
3879 @testRecvTrafficClassAndHopLimit.client_skip
3880 def _testRecvTrafficClassAndHopLimit(self):
3881 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3882 self.sendToServer(MSG)
3883
3884 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3885 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3886 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3887 # Test receiving traffic class and hop limit, using
3888 # CMSG_SPACE() to calculate buffer size.
3889 self.checkTrafficClassAndHopLimit(
3890 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3891
3892 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3893 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3894 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3895 self.sendToServer(MSG)
3896
3897 @requireAttrs(socket.socket, "sendmsg")
3898 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3899 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3900 def testSetTrafficClassAndHopLimit(self):
3901 # Test setting traffic class and hop limit on outgoing packet,
3902 # and receiving them at the other end.
3903 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3904 maxhop=self.hop_limit)
3905
3906 @testSetTrafficClassAndHopLimit.client_skip
3907 def _testSetTrafficClassAndHopLimit(self):
3908 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3909 self.assertEqual(
3910 self.sendmsgToServer([MSG],
3911 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3912 array.array("i", [self.traffic_class])),
3913 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3914 array.array("i", [self.hop_limit]))]),
3915 len(MSG))
3916
3917 @requireAttrs(socket.socket, "sendmsg")
3918 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3919 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3920 def testOddCmsgSize(self):
3921 # Try to send ancillary data with first item one byte too
3922 # long. Fall back to sending with correct size if this fails,
3923 # and check that second item was handled correctly.
3924 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3925 maxhop=self.hop_limit)
3926
3927 @testOddCmsgSize.client_skip
3928 def _testOddCmsgSize(self):
3929 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3930 try:
3931 nbytes = self.sendmsgToServer(
3932 [MSG],
3933 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003934 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003935 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3936 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003937 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003938 self.assertIsInstance(e.errno, int)
3939 nbytes = self.sendmsgToServer(
3940 [MSG],
3941 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3942 array.array("i", [self.traffic_class])),
3943 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3944 array.array("i", [self.hop_limit]))])
3945 self.assertEqual(nbytes, len(MSG))
3946
3947 # Tests for proper handling of truncated ancillary data
3948
3949 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3950 # Receive hop limit into ancbufsize bytes of ancillary data
3951 # space, which should be too small to contain the ancillary
3952 # data header (if ancbufsize is None, pass no second argument
3953 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3954 # (unless included in ignoreflags), and no ancillary data is
3955 # returned.
3956 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3957 socket.IPV6_RECVHOPLIMIT, 1)
3958 self.misc_event.set()
3959 args = () if ancbufsize is None else (ancbufsize,)
3960 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3961 len(MSG), *args)
3962
3963 self.assertEqual(msg, MSG)
3964 self.checkRecvmsgAddress(addr, self.cli_addr)
3965 self.assertEqual(ancdata, [])
3966 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3967 ignore=ignoreflags)
3968
3969 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3970 def testCmsgTruncNoBufSize(self):
3971 # Check that no ancillary data is received when no ancillary
3972 # buffer size is provided.
3973 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3974 # BSD seems to set
3975 # MSG_CTRUNC only if an item
3976 # has been partially
3977 # received.
3978 ignoreflags=socket.MSG_CTRUNC)
3979
3980 @testCmsgTruncNoBufSize.client_skip
3981 def _testCmsgTruncNoBufSize(self):
3982 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3983 self.sendToServer(MSG)
3984
3985 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3986 def testSingleCmsgTrunc0(self):
3987 # Check that no ancillary data is received when ancillary
3988 # buffer size is zero.
3989 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3990 ignoreflags=socket.MSG_CTRUNC)
3991
3992 @testSingleCmsgTrunc0.client_skip
3993 def _testSingleCmsgTrunc0(self):
3994 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3995 self.sendToServer(MSG)
3996
3997 # Check that no ancillary data is returned for various non-zero
3998 # (but still too small) buffer sizes.
3999
4000 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4001 def testSingleCmsgTrunc1(self):
4002 self.checkHopLimitTruncatedHeader(ancbufsize=1)
4003
4004 @testSingleCmsgTrunc1.client_skip
4005 def _testSingleCmsgTrunc1(self):
4006 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4007 self.sendToServer(MSG)
4008
4009 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4010 def testSingleCmsgTrunc2Int(self):
4011 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
4012
4013 @testSingleCmsgTrunc2Int.client_skip
4014 def _testSingleCmsgTrunc2Int(self):
4015 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4016 self.sendToServer(MSG)
4017
4018 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4019 def testSingleCmsgTruncLen0Minus1(self):
4020 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
4021
4022 @testSingleCmsgTruncLen0Minus1.client_skip
4023 def _testSingleCmsgTruncLen0Minus1(self):
4024 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4025 self.sendToServer(MSG)
4026
4027 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
4028 def testSingleCmsgTruncInData(self):
4029 # Test truncation of a control message inside its associated
4030 # data. The message may be returned with its data truncated,
4031 # or not returned at all.
4032 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4033 socket.IPV6_RECVHOPLIMIT, 1)
4034 self.misc_event.set()
4035 msg, ancdata, flags, addr = self.doRecvmsg(
4036 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
4037
4038 self.assertEqual(msg, MSG)
4039 self.checkRecvmsgAddress(addr, self.cli_addr)
4040 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4041
4042 self.assertLessEqual(len(ancdata), 1)
4043 if ancdata:
4044 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4045 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4046 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
4047 self.assertLess(len(cmsg_data), SIZEOF_INT)
4048
4049 @testSingleCmsgTruncInData.client_skip
4050 def _testSingleCmsgTruncInData(self):
4051 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4052 self.sendToServer(MSG)
4053
4054 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
4055 # Receive traffic class and hop limit into ancbufsize bytes of
4056 # ancillary data space, which should be large enough to
4057 # contain the first item, but too small to contain the header
4058 # of the second. Check that data is MSG, MSG_CTRUNC is set
4059 # (unless included in ignoreflags), and only one ancillary
4060 # data item is returned.
4061 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4062 socket.IPV6_RECVHOPLIMIT, 1)
4063 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4064 socket.IPV6_RECVTCLASS, 1)
4065 self.misc_event.set()
4066 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
4067 len(MSG), ancbufsize)
4068
4069 self.assertEqual(msg, MSG)
4070 self.checkRecvmsgAddress(addr, self.cli_addr)
4071 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
4072 ignore=ignoreflags)
4073
4074 self.assertEqual(len(ancdata), 1)
4075 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
4076 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4077 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
4078 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4079 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004080 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004081 self.assertGreaterEqual(a[0], 0)
4082 self.assertLessEqual(a[0], 255)
4083
4084 # Try the above test with various buffer sizes.
4085
4086 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4087 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4088 def testSecondCmsgTrunc0(self):
4089 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
4090 ignoreflags=socket.MSG_CTRUNC)
4091
4092 @testSecondCmsgTrunc0.client_skip
4093 def _testSecondCmsgTrunc0(self):
4094 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4095 self.sendToServer(MSG)
4096
4097 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4098 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4099 def testSecondCmsgTrunc1(self):
4100 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
4101
4102 @testSecondCmsgTrunc1.client_skip
4103 def _testSecondCmsgTrunc1(self):
4104 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4105 self.sendToServer(MSG)
4106
4107 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4108 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4109 def testSecondCmsgTrunc2Int(self):
4110 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4111 2 * SIZEOF_INT)
4112
4113 @testSecondCmsgTrunc2Int.client_skip
4114 def _testSecondCmsgTrunc2Int(self):
4115 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4116 self.sendToServer(MSG)
4117
4118 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4119 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4120 def testSecondCmsgTruncLen0Minus1(self):
4121 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4122 socket.CMSG_LEN(0) - 1)
4123
4124 @testSecondCmsgTruncLen0Minus1.client_skip
4125 def _testSecondCmsgTruncLen0Minus1(self):
4126 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4127 self.sendToServer(MSG)
4128
4129 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4130 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4131 def testSecomdCmsgTruncInData(self):
4132 # Test truncation of the second of two control messages inside
4133 # its associated data.
4134 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4135 socket.IPV6_RECVHOPLIMIT, 1)
4136 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4137 socket.IPV6_RECVTCLASS, 1)
4138 self.misc_event.set()
4139 msg, ancdata, flags, addr = self.doRecvmsg(
4140 self.serv_sock, len(MSG),
4141 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4142
4143 self.assertEqual(msg, MSG)
4144 self.checkRecvmsgAddress(addr, self.cli_addr)
4145 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4146
4147 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4148
4149 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4150 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4151 cmsg_types.remove(cmsg_type)
4152 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4153 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004154 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004155 self.assertGreaterEqual(a[0], 0)
4156 self.assertLessEqual(a[0], 255)
4157
4158 if ancdata:
4159 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4160 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4161 cmsg_types.remove(cmsg_type)
4162 self.assertLess(len(cmsg_data), SIZEOF_INT)
4163
4164 self.assertEqual(ancdata, [])
4165
4166 @testSecomdCmsgTruncInData.client_skip
4167 def _testSecomdCmsgTruncInData(self):
4168 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4169 self.sendToServer(MSG)
4170
4171
4172# Derive concrete test classes for different socket types.
4173
4174class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4175 SendrecvmsgConnectionlessBase,
4176 ThreadedSocketTestMixin, UDPTestBase):
4177 pass
4178
4179@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004180class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4181 pass
4182
4183@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004184class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4185 pass
4186
4187@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004188class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4189 pass
4190
4191
4192class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4193 SendrecvmsgConnectionlessBase,
4194 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004195
4196 def checkRecvmsgAddress(self, addr1, addr2):
4197 # Called to compare the received address with the address of
4198 # the peer, ignoring scope ID
4199 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004200
4201@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004202@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004203@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004204class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4205 pass
4206
4207@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004208@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004209@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004210class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4211 pass
4212
4213@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004214@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004215@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004216class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4217 pass
4218
4219@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004220@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221@requireAttrs(socket, "IPPROTO_IPV6")
4222@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004223class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4224 SendrecvmsgUDP6TestBase):
4225 pass
4226
4227@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004228@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004229@requireAttrs(socket, "IPPROTO_IPV6")
4230@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004231class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4232 RFC3542AncillaryTest,
4233 SendrecvmsgUDP6TestBase):
4234 pass
4235
4236
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004237@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4238 'UDPLITE sockets required for this test.')
4239class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4240 SendrecvmsgConnectionlessBase,
4241 ThreadedSocketTestMixin, UDPLITETestBase):
4242 pass
4243
4244@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4245 'UDPLITE sockets required for this test.')
4246@requireAttrs(socket.socket, "sendmsg")
4247class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4248 pass
4249
4250@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4251 'UDPLITE sockets required for this test.')
4252@requireAttrs(socket.socket, "recvmsg")
4253class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4254 pass
4255
4256@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4257 'UDPLITE sockets required for this test.')
4258@requireAttrs(socket.socket, "recvmsg_into")
4259class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4260 pass
4261
4262
4263@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4264 'UDPLITE sockets required for this test.')
4265class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4266 SendrecvmsgConnectionlessBase,
4267 ThreadedSocketTestMixin, UDPLITE6TestBase):
4268
4269 def checkRecvmsgAddress(self, addr1, addr2):
4270 # Called to compare the received address with the address of
4271 # the peer, ignoring scope ID
4272 self.assertEqual(addr1[:-1], addr2[:-1])
4273
4274@requireAttrs(socket.socket, "sendmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004275@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004276@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4277 'UDPLITE sockets required for this test.')
4278@requireSocket("AF_INET6", "SOCK_DGRAM")
4279class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4280 pass
4281
4282@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004283@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004284@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4285 'UDPLITE sockets required for this test.')
4286@requireSocket("AF_INET6", "SOCK_DGRAM")
4287class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4288 pass
4289
4290@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004291@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004292@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4293 'UDPLITE sockets required for this test.')
4294@requireSocket("AF_INET6", "SOCK_DGRAM")
4295class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4296 pass
4297
4298@requireAttrs(socket.socket, "recvmsg")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004299@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004300@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4301 'UDPLITE sockets required for this test.')
4302@requireAttrs(socket, "IPPROTO_IPV6")
4303@requireSocket("AF_INET6", "SOCK_DGRAM")
4304class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4305 SendrecvmsgUDPLITE6TestBase):
4306 pass
4307
4308@requireAttrs(socket.socket, "recvmsg_into")
Serhiy Storchaka16994912020-04-25 10:06:29 +03004309@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004310@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4311 'UDPLITE sockets required for this test.')
4312@requireAttrs(socket, "IPPROTO_IPV6")
4313@requireSocket("AF_INET6", "SOCK_DGRAM")
4314class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4315 RFC3542AncillaryTest,
4316 SendrecvmsgUDPLITE6TestBase):
4317 pass
4318
4319
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004320class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4321 ConnectedStreamTestMixin, TCPTestBase):
4322 pass
4323
4324@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004325class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4326 pass
4327
4328@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004329class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4330 SendrecvmsgTCPTestBase):
4331 pass
4332
4333@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004334class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4335 SendrecvmsgTCPTestBase):
4336 pass
4337
4338
4339class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4340 SendrecvmsgConnectedBase,
4341 ConnectedStreamTestMixin, SCTPStreamBase):
4342 pass
4343
4344@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004345@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004346@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004347class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4348 pass
4349
4350@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004351@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004352@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004353class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4354 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004355
4356 def testRecvmsgEOF(self):
4357 try:
4358 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4359 except OSError as e:
4360 if e.errno != errno.ENOTCONN:
4361 raise
4362 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004363
4364@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004365@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004366@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004367class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4368 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004369
4370 def testRecvmsgEOF(self):
4371 try:
4372 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4373 except OSError as e:
4374 if e.errno != errno.ENOTCONN:
4375 raise
4376 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004377
4378
4379class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4380 ConnectedStreamTestMixin, UnixStreamBase):
4381 pass
4382
4383@requireAttrs(socket.socket, "sendmsg")
4384@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004385class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4386 pass
4387
4388@requireAttrs(socket.socket, "recvmsg")
4389@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004390class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4391 SendrecvmsgUnixStreamTestBase):
4392 pass
4393
4394@requireAttrs(socket.socket, "recvmsg_into")
4395@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004396class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4397 SendrecvmsgUnixStreamTestBase):
4398 pass
4399
4400@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4401@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004402class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4403 pass
4404
4405@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4406@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004407class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4408 SendrecvmsgUnixStreamTestBase):
4409 pass
4410
4411
4412# Test interrupting the interruptible send/receive methods with a
4413# signal when a timeout is set. These tests avoid having multiple
4414# threads alive during the test so that the OS cannot deliver the
4415# signal to the wrong one.
4416
4417class InterruptedTimeoutBase(unittest.TestCase):
4418 # Base class for interrupted send/receive tests. Installs an
4419 # empty handler for SIGALRM and removes it on teardown, along with
4420 # any scheduled alarms.
4421
4422 def setUp(self):
4423 super().setUp()
4424 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004425 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004426 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427
4428 # Timeout for socket operations
Victor Stinner24c62582019-10-30 12:41:43 +01004429 timeout = support.LOOPBACK_TIMEOUT
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004430
4431 # Provide setAlarm() method to schedule delivery of SIGALRM after
4432 # given number of seconds, or cancel it if zero, and an
4433 # appropriate time value to use. Use setitimer() if available.
4434 if hasattr(signal, "setitimer"):
4435 alarm_time = 0.05
4436
4437 def setAlarm(self, seconds):
4438 signal.setitimer(signal.ITIMER_REAL, seconds)
4439 else:
4440 # Old systems may deliver the alarm up to one second early
4441 alarm_time = 2
4442
4443 def setAlarm(self, seconds):
4444 signal.alarm(seconds)
4445
4446
4447# Require siginterrupt() in order to ensure that system calls are
4448# interrupted by default.
4449@requireAttrs(signal, "siginterrupt")
4450@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4451 "Don't have signal.alarm or signal.setitimer")
4452class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4453 # Test interrupting the recv*() methods with signals when a
4454 # timeout is set.
4455
4456 def setUp(self):
4457 super().setUp()
4458 self.serv.settimeout(self.timeout)
4459
4460 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004461 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004462 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004463 try:
4464 self.setAlarm(self.alarm_time)
4465 with self.assertRaises(ZeroDivisionError) as cm:
4466 func(*args, **kwargs)
4467 finally:
4468 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004469
4470 def testInterruptedRecvTimeout(self):
4471 self.checkInterruptedRecv(self.serv.recv, 1024)
4472
4473 def testInterruptedRecvIntoTimeout(self):
4474 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4475
4476 def testInterruptedRecvfromTimeout(self):
4477 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4478
4479 def testInterruptedRecvfromIntoTimeout(self):
4480 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4481
4482 @requireAttrs(socket.socket, "recvmsg")
4483 def testInterruptedRecvmsgTimeout(self):
4484 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4485
4486 @requireAttrs(socket.socket, "recvmsg_into")
4487 def testInterruptedRecvmsgIntoTimeout(self):
4488 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4489
4490
4491# Require siginterrupt() in order to ensure that system calls are
4492# interrupted by default.
4493@requireAttrs(signal, "siginterrupt")
4494@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4495 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004496class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4497 ThreadSafeCleanupTestCase,
4498 SocketListeningTestMixin, TCPTestBase):
4499 # Test interrupting the interruptible send*() methods with signals
4500 # when a timeout is set.
4501
4502 def setUp(self):
4503 super().setUp()
4504 self.serv_conn = self.newSocket()
4505 self.addCleanup(self.serv_conn.close)
4506 # Use a thread to complete the connection, but wait for it to
4507 # terminate before running the test, so that there is only one
4508 # thread to accept the signal.
4509 cli_thread = threading.Thread(target=self.doConnect)
4510 cli_thread.start()
4511 self.cli_conn, addr = self.serv.accept()
4512 self.addCleanup(self.cli_conn.close)
4513 cli_thread.join()
4514 self.serv_conn.settimeout(self.timeout)
4515
4516 def doConnect(self):
4517 self.serv_conn.connect(self.serv_addr)
4518
4519 def checkInterruptedSend(self, func, *args, **kwargs):
4520 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004521 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004522 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004523 try:
4524 with self.assertRaises(ZeroDivisionError) as cm:
4525 while True:
4526 self.setAlarm(self.alarm_time)
4527 func(*args, **kwargs)
4528 finally:
4529 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004530
Ned Deilyc5640382014-02-03 13:58:31 -08004531 # Issue #12958: The following tests have problems on OS X prior to 10.7
4532 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004533 def testInterruptedSendTimeout(self):
4534 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4535
Ned Deilyc5640382014-02-03 13:58:31 -08004536 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004537 def testInterruptedSendtoTimeout(self):
4538 # Passing an actual address here as Python's wrapper for
4539 # sendto() doesn't allow passing a zero-length one; POSIX
4540 # requires that the address is ignored since the socket is
4541 # connection-mode, however.
4542 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4543 self.serv_addr)
4544
Ned Deilyc5640382014-02-03 13:58:31 -08004545 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004546 @requireAttrs(socket.socket, "sendmsg")
4547 def testInterruptedSendmsgTimeout(self):
4548 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4549
4550
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004551class TCPCloserTest(ThreadedTCPSocketTest):
4552
4553 def testClose(self):
4554 conn, addr = self.serv.accept()
4555 conn.close()
4556
4557 sd = self.cli
4558 read, write, err = select.select([sd], [], [], 1.0)
4559 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004560 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004561
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004562 # Calling close() many times should be safe.
4563 conn.close()
4564 conn.close()
4565
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004566 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004567 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004568 time.sleep(1.0)
4569
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004570
Dave Cole331708b2004-08-09 04:51:41 +00004571class BasicSocketPairTest(SocketPairTest):
4572
4573 def __init__(self, methodName='runTest'):
4574 SocketPairTest.__init__(self, methodName=methodName)
4575
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004576 def _check_defaults(self, sock):
4577 self.assertIsInstance(sock, socket.socket)
4578 if hasattr(socket, 'AF_UNIX'):
4579 self.assertEqual(sock.family, socket.AF_UNIX)
4580 else:
4581 self.assertEqual(sock.family, socket.AF_INET)
4582 self.assertEqual(sock.type, socket.SOCK_STREAM)
4583 self.assertEqual(sock.proto, 0)
4584
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004585 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004586 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004587
4588 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004589 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004590
Dave Cole331708b2004-08-09 04:51:41 +00004591 def testRecv(self):
4592 msg = self.serv.recv(1024)
4593 self.assertEqual(msg, MSG)
4594
4595 def _testRecv(self):
4596 self.cli.send(MSG)
4597
4598 def testSend(self):
4599 self.serv.send(MSG)
4600
4601 def _testSend(self):
4602 msg = self.cli.recv(1024)
4603 self.assertEqual(msg, MSG)
4604
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004605
Guido van Rossum24e4af82002-06-12 19:18:08 +00004606class NonBlockingTCPTests(ThreadedTCPSocketTest):
4607
4608 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004609 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004610 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4611
Victor Stinner304315d2018-11-30 13:22:44 +01004612 def assert_sock_timeout(self, sock, timeout):
4613 self.assertEqual(self.serv.gettimeout(), timeout)
4614
4615 blocking = (timeout != 0.0)
4616 self.assertEqual(sock.getblocking(), blocking)
4617
4618 if fcntl is not None:
4619 # When a Python socket has a non-zero timeout, it's switched
4620 # internally to a non-blocking mode. Later, sock.sendall(),
4621 # sock.recv(), and other socket operations use a select() call and
4622 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4623 # timeouts are enforced.
4624 fd_blocking = (timeout is None)
4625
4626 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4627 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4628
Guido van Rossum24e4af82002-06-12 19:18:08 +00004629 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004630 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004631 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004632 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004633
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004634 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004635 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004636
4637 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004638 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004639
4640 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004641 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004642
4643 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004644 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004645
4646 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004647 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004648
4649 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004650 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004651
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004652 @support.cpython_only
4653 def testSetBlocking_overflow(self):
4654 # Issue 15989
4655 import _testcapi
4656 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4657 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004658
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004659 self.serv.setblocking(False)
4660 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004661
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004662 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4663 self.assertIsNone(self.serv.gettimeout())
4664
4665 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4666
Serhiy Storchaka43767632013-11-03 21:31:38 +02004667 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4668 'test needs socket.SOCK_NONBLOCK')
4669 @support.requires_linux_version(2, 6, 28)
4670 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004671 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004672 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004673 self.serv = socket.socket(socket.AF_INET,
4674 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4675 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004676
4677 def _testInitNonBlocking(self):
4678 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004679
Victor Stinner304315d2018-11-30 13:22:44 +01004680 def testInheritFlagsBlocking(self):
4681 # bpo-7995: accept() on a listening socket with a timeout and the
4682 # default timeout is None, the resulting socket must be blocking.
4683 with socket_setdefaulttimeout(None):
4684 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004685 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004686 self.addCleanup(conn.close)
4687 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004688
Victor Stinner304315d2018-11-30 13:22:44 +01004689 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004690 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004691
4692 def testInheritFlagsTimeout(self):
4693 # bpo-7995: accept() on a listening socket with a timeout and the
4694 # default timeout is None, the resulting socket must inherit
4695 # the default timeout.
4696 default_timeout = 20.0
4697 with socket_setdefaulttimeout(default_timeout):
4698 self.serv.settimeout(10)
4699 conn, addr = self.serv.accept()
4700 self.addCleanup(conn.close)
4701 self.assertEqual(conn.gettimeout(), default_timeout)
4702
4703 def _testInheritFlagsTimeout(self):
4704 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004705
Guido van Rossum24e4af82002-06-12 19:18:08 +00004706 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004707 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004708 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004709
4710 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004711 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004712 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004713 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004714 dt = time.monotonic() - start_time
4715 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004716
4717 self.event.set()
4718
Victor Stinner24c62582019-10-30 12:41:43 +01004719 read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004720 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004721 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004722
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004723 # connect() completed: non-blocking accept() doesn't block
4724 conn, addr = self.serv.accept()
4725 self.addCleanup(conn.close)
4726 self.assertIsNone(conn.gettimeout())
4727
Guido van Rossum24e4af82002-06-12 19:18:08 +00004728 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004729 # don't connect before event is set to check
4730 # that non-blocking accept() raises BlockingIOError
4731 self.event.wait()
4732
Christian Heimes5e696852008-04-09 08:37:03 +00004733 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004734
Guido van Rossum24e4af82002-06-12 19:18:08 +00004735 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004736 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004737 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004738 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004739 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004740
4741 # the server didn't send data yet: non-blocking recv() fails
4742 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004743 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004744
4745 self.event.set()
4746
Victor Stinner24c62582019-10-30 12:41:43 +01004747 read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004748 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004749 self.fail("Error during select call to non-blocking socket.")
4750
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004751 # the server sent data yet: non-blocking recv() doesn't block
4752 msg = conn.recv(len(MSG))
4753 self.assertEqual(msg, MSG)
4754
Guido van Rossum24e4af82002-06-12 19:18:08 +00004755 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004756 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004757
4758 # don't send anything before event is set to check
4759 # that non-blocking recv() raises BlockingIOError
4760 self.event.wait()
4761
4762 # send data: recv() will no longer block
4763 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004764
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004765
Guido van Rossum24e4af82002-06-12 19:18:08 +00004766class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004767 """Unit tests for the object returned by socket.makefile()
4768
Antoine Pitrou834bd812010-10-13 16:17:14 +00004769 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004770 the client connection. You can read from this file to
4771 get output from the server.
4772
Antoine Pitrou834bd812010-10-13 16:17:14 +00004773 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004774 server connection. You can write to this file to send output
4775 to the client.
4776 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004777
Guido van Rossume9f66142002-08-07 15:46:19 +00004778 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004779 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004780 errors = 'strict'
4781 newline = None
4782
4783 read_mode = 'rb'
4784 read_msg = MSG
4785 write_mode = 'wb'
4786 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004787
Guido van Rossum24e4af82002-06-12 19:18:08 +00004788 def __init__(self, methodName='runTest'):
4789 SocketConnectedTest.__init__(self, methodName=methodName)
4790
4791 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004792 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4793 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004794 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004795 self.read_file = self.cli_conn.makefile(
4796 self.read_mode, self.bufsize,
4797 encoding = self.encoding,
4798 errors = self.errors,
4799 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004800
4801 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004802 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004803 self.read_file.close()
4804 self.assertTrue(self.read_file.closed)
4805 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004806 SocketConnectedTest.tearDown(self)
4807
4808 def clientSetUp(self):
4809 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004810 self.write_file = self.serv_conn.makefile(
4811 self.write_mode, self.bufsize,
4812 encoding = self.encoding,
4813 errors = self.errors,
4814 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004815
4816 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004817 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004818 self.write_file.close()
4819 self.assertTrue(self.write_file.closed)
4820 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004821 SocketConnectedTest.clientTearDown(self)
4822
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004823 def testReadAfterTimeout(self):
4824 # Issue #7322: A file object must disallow further reads
4825 # after a timeout has occurred.
4826 self.cli_conn.settimeout(1)
4827 self.read_file.read(3)
4828 # First read raises a timeout
4829 self.assertRaises(socket.timeout, self.read_file.read, 1)
4830 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004831 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004832 self.read_file.read(1)
4833 self.assertIn("cannot read from timed out object", str(ctx.exception))
4834
4835 def _testReadAfterTimeout(self):
4836 self.write_file.write(self.write_msg[0:3])
4837 self.write_file.flush()
4838 self.serv_finished.wait()
4839
Guido van Rossum24e4af82002-06-12 19:18:08 +00004840 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004841 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004842 first_seg = self.read_file.read(len(self.read_msg)-3)
4843 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004844 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004845 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004846
4847 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004848 self.write_file.write(self.write_msg)
4849 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004850
Guido van Rossum8c943832002-08-08 01:00:28 +00004851 def testFullRead(self):
4852 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004853 msg = self.read_file.read()
4854 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004855
4856 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004857 self.write_file.write(self.write_msg)
4858 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004859
Guido van Rossum24e4af82002-06-12 19:18:08 +00004860 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004861 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004862 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004863 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004864 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004865 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004866 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004867 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004868 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004869
4870 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004871 self.write_file.write(self.write_msg)
4872 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004873
4874 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004875 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004876 line = self.read_file.readline()
4877 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004878
4879 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004880 self.write_file.write(self.write_msg)
4881 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004882
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004883 def testCloseAfterMakefile(self):
4884 # The file returned by makefile should keep the socket open.
4885 self.cli_conn.close()
4886 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004887 msg = self.read_file.read()
4888 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004889
4890 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004891 self.write_file.write(self.write_msg)
4892 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004893
4894 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004895 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004896 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004897 if isinstance(self.read_msg, str):
4898 msg = msg.decode()
4899 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004900
4901 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004902 self.write_file.write(self.write_msg)
4903 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004904
Tim Peters116d83c2004-03-28 02:20:45 +00004905 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004906 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004907
4908 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004909 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004910
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004911 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004912 self.assertEqual(self.read_file.mode, self.read_mode)
4913 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004914
4915 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004916 self.assertEqual(self.write_file.mode, self.write_mode)
4917 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004918
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004919 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004920 self.read_file.close()
4921 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004922 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004923 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004924
4925 def _testRealClose(self):
4926 pass
4927
4928
Guido van Rossume9f66142002-08-07 15:46:19 +00004929class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4930
4931 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004932
Guido van Rossume9f66142002-08-07 15:46:19 +00004933 In this case (and in this case only), it should be possible to
4934 create a file object, read a line from it, create another file
4935 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004936 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004937 when reading multiple requests from the same socket."""
4938
4939 bufsize = 0 # Use unbuffered mode
4940
4941 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004942 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004943 line = self.read_file.readline() # first line
4944 self.assertEqual(line, b"A. " + self.write_msg) # first line
4945 self.read_file = self.cli_conn.makefile('rb', 0)
4946 line = self.read_file.readline() # second line
4947 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004948
4949 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004950 self.write_file.write(b"A. " + self.write_msg)
4951 self.write_file.write(b"B. " + self.write_msg)
4952 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004953
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004954 def testMakefileClose(self):
4955 # The file returned by makefile should keep the socket open...
4956 self.cli_conn.close()
4957 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004958 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004959 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004960 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004961 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004962
4963 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004964 self.write_file.write(self.write_msg)
4965 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004966
4967 def testMakefileCloseSocketDestroy(self):
4968 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004969 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004970 refcount_after = sys.getrefcount(self.cli_conn)
4971 self.assertEqual(refcount_before - 1, refcount_after)
4972
4973 def _testMakefileCloseSocketDestroy(self):
4974 pass
4975
Antoine Pitrou98b46702010-09-18 22:59:00 +00004976 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004977 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004978 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4979
4980 def testSmallReadNonBlocking(self):
4981 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004982 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4983 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004984 self.evt1.set()
4985 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004986 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004987 if first_seg is None:
4988 # Data not arrived (can happen under Windows), wait a bit
4989 time.sleep(0.5)
4990 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004991 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004992 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004993 self.assertEqual(n, 3)
4994 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004995 self.assertEqual(msg, self.read_msg)
4996 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4997 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004998
4999 def _testSmallReadNonBlocking(self):
5000 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00005001 self.write_file.write(self.write_msg)
5002 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00005003 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03005004 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00005005 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
5006 self.serv_finished.wait(5.0)
5007
5008 def testWriteNonBlocking(self):
5009 self.cli_finished.wait(5.0)
5010 # The client thread can't skip directly - the SkipTest exception
5011 # would appear as a failure.
5012 if self.serv_skipped:
5013 self.skipTest(self.serv_skipped)
5014
5015 def _testWriteNonBlocking(self):
5016 self.serv_skipped = None
5017 self.serv_conn.setblocking(False)
5018 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02005019 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00005020 LIMIT = 10
5021 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00005022 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005023 self.assertGreater(n, 0)
5024 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00005025 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00005026 if n is None:
5027 # Succeeded
5028 break
5029 self.assertGreater(n, 0)
5030 else:
5031 # Let us know that this test didn't manage to establish
5032 # the expected conditions. This is not a failure in itself but,
5033 # if it happens repeatedly, the test should be fixed.
5034 self.serv_skipped = "failed to saturate the socket buffer"
5035
Gregory P. Smithde3369f2009-01-12 04:50:11 +00005036
Guido van Rossum8c943832002-08-08 01:00:28 +00005037class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5038
5039 bufsize = 1 # Default-buffered for reading; line-buffered for writing
5040
5041
5042class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
5043
5044 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00005045
Thomas Woutersb2137042007-02-01 18:02:27 +00005046
Antoine Pitrou834bd812010-10-13 16:17:14 +00005047class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
5048 """Tests for socket.makefile() in text mode (rather than binary)"""
5049
5050 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005051 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005052 write_mode = 'wb'
5053 write_msg = MSG
5054 newline = ''
5055
5056
5057class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
5058 """Tests for socket.makefile() in text mode (rather than binary)"""
5059
5060 read_mode = 'rb'
5061 read_msg = MSG
5062 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005063 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005064 newline = ''
5065
5066
5067class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
5068 """Tests for socket.makefile() in text mode (rather than binary)"""
5069
5070 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005071 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005072 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00005073 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00005074 newline = ''
5075
5076
Guido van Rossumd8faa362007-04-27 19:54:29 +00005077class NetworkConnectionTest(object):
5078 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005079
Guido van Rossumd8faa362007-04-27 19:54:29 +00005080 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005081 # We're inherited below by BasicTCPTest2, which also inherits
5082 # BasicTCPTest, which defines self.port referenced below.
5083 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005084 self.serv_conn = self.cli
5085
5086class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
5087 """Tests that NetworkConnection does not break existing TCP functionality.
5088 """
5089
5090class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005091
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005092 class MockSocket(socket.socket):
5093 def connect(self, *args):
5094 raise socket.timeout('timed out')
5095
5096 @contextlib.contextmanager
5097 def mocked_socket_module(self):
5098 """Return a socket which times out on connect"""
5099 old_socket = socket.socket
5100 socket.socket = self.MockSocket
5101 try:
5102 yield
5103 finally:
5104 socket.socket = old_socket
5105
5106 def test_connect(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005107 port = socket_helper.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005108 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005109 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005110 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005111 cli.connect((HOST, port))
5112 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5113
5114 def test_create_connection(self):
5115 # Issue #9792: errors raised by create_connection() should have
5116 # a proper errno attribute.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005117 port = socket_helper.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005118 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005119 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005120
5121 # Issue #16257: create_connection() calls getaddrinfo() against
5122 # 'localhost'. This may result in an IPV6 addr being returned
5123 # as well as an IPV4 one:
5124 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5125 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5126 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5127 #
5128 # create_connection() enumerates through all the addresses returned
5129 # and if it doesn't successfully bind to any of them, it propagates
5130 # the last exception it encountered.
5131 #
5132 # On Solaris, ENETUNREACH is returned in this circumstance instead
5133 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5134 # expected errnos.
Serhiy Storchaka16994912020-04-25 10:06:29 +03005135 expected_errnos = socket_helper.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005136 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005137
5138 def test_create_connection_timeout(self):
5139 # Issue #9792: create_connection() should not recast timeout errors
5140 # as generic socket errors.
5141 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005142 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005143 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005144 except socket.timeout:
5145 pass
5146 except OSError as exc:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005147 if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
Zackery Spytzc2cda632019-06-30 09:24:43 -06005148 raise
5149 else:
5150 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005151
Guido van Rossumd8faa362007-04-27 19:54:29 +00005152
5153class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5154
5155 def __init__(self, methodName='runTest'):
5156 SocketTCPTest.__init__(self, methodName=methodName)
5157 ThreadableTest.__init__(self)
5158
5159 def clientSetUp(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03005160 self.source_port = socket_helper.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005161
5162 def clientTearDown(self):
5163 self.cli.close()
5164 self.cli = None
5165 ThreadableTest.clientTearDown(self)
5166
5167 def _justAccept(self):
5168 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005169 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005170
5171 testFamily = _justAccept
5172 def _testFamily(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005173 self.cli = socket.create_connection((HOST, self.port),
5174 timeout=support.LOOPBACK_TIMEOUT)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005175 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005176 self.assertEqual(self.cli.family, 2)
5177
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005178 testSourceAddress = _justAccept
5179 def _testSourceAddress(self):
Victor Stinner7772b1a2019-12-11 22:17:04 +01005180 self.cli = socket.create_connection((HOST, self.port),
5181 timeout=support.LOOPBACK_TIMEOUT,
5182 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005183 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005184 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005185 # The port number being used is sufficient to show that the bind()
5186 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005187
Guido van Rossumd8faa362007-04-27 19:54:29 +00005188 testTimeoutDefault = _justAccept
5189 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005190 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005191 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005192 socket.setdefaulttimeout(42)
5193 try:
5194 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005195 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005196 finally:
5197 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005198 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005199
5200 testTimeoutNone = _justAccept
5201 def _testTimeoutNone(self):
5202 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005203 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005204 socket.setdefaulttimeout(30)
5205 try:
5206 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005207 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005208 finally:
5209 socket.setdefaulttimeout(None)
5210 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005211
5212 testTimeoutValueNamed = _justAccept
5213 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005214 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005215 self.assertEqual(self.cli.gettimeout(), 30)
5216
5217 testTimeoutValueNonamed = _justAccept
5218 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005219 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005220 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005221 self.assertEqual(self.cli.gettimeout(), 30)
5222
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005223
Guido van Rossumd8faa362007-04-27 19:54:29 +00005224class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5225
5226 def __init__(self, methodName='runTest'):
5227 SocketTCPTest.__init__(self, methodName=methodName)
5228 ThreadableTest.__init__(self)
5229
5230 def clientSetUp(self):
5231 pass
5232
5233 def clientTearDown(self):
5234 self.cli.close()
5235 self.cli = None
5236 ThreadableTest.clientTearDown(self)
5237
5238 def testInsideTimeout(self):
5239 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005240 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005241 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005242 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005243 testOutsideTimeout = testInsideTimeout
5244
5245 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005246 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005247 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005248 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005249
5250 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005251 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005252 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005253
5254
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005255class TCPTimeoutTest(SocketTCPTest):
5256
5257 def testTCPTimeout(self):
5258 def raise_timeout(*args, **kwargs):
5259 self.serv.settimeout(1.0)
5260 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005261 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005262 "Error generating a timeout exception (TCP)")
5263
5264 def testTimeoutZero(self):
5265 ok = False
5266 try:
5267 self.serv.settimeout(0.0)
5268 foo = self.serv.accept()
5269 except socket.timeout:
5270 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005271 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005272 ok = True
5273 except:
5274 self.fail("caught unexpected exception (TCP)")
5275 if not ok:
5276 self.fail("accept() returned success when we did not expect it")
5277
Serhiy Storchaka43767632013-11-03 21:31:38 +02005278 @unittest.skipUnless(hasattr(signal, 'alarm'),
5279 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005280 def testInterruptedTimeout(self):
5281 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005282 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005283 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005284 self.serv.settimeout(5.0) # must be longer than alarm
5285 class Alarm(Exception):
5286 pass
5287 def alarm_handler(signal, frame):
5288 raise Alarm
5289 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5290 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005291 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005292 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005293 foo = self.serv.accept()
5294 except socket.timeout:
5295 self.fail("caught timeout instead of Alarm")
5296 except Alarm:
5297 pass
5298 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005299 self.fail("caught other exception instead of Alarm:"
5300 " %s(%s):\n%s" %
5301 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005302 else:
5303 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005304 finally:
5305 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005306 except Alarm:
5307 self.fail("got Alarm in wrong place")
5308 finally:
5309 # no alarm can be pending. Safe to restore old handler.
5310 signal.signal(signal.SIGALRM, old_alarm)
5311
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005312class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005313
5314 def testUDPTimeout(self):
5315 def raise_timeout(*args, **kwargs):
5316 self.serv.settimeout(1.0)
5317 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005318 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005319 "Error generating a timeout exception (UDP)")
5320
5321 def testTimeoutZero(self):
5322 ok = False
5323 try:
5324 self.serv.settimeout(0.0)
5325 foo = self.serv.recv(1024)
5326 except socket.timeout:
5327 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005328 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005329 ok = True
5330 except:
5331 self.fail("caught unexpected exception (UDP)")
5332 if not ok:
5333 self.fail("recv() returned success when we did not expect it")
5334
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005335@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5336 'UDPLITE sockets required for this test.')
5337class UDPLITETimeoutTest(SocketUDPLITETest):
5338
5339 def testUDPLITETimeout(self):
5340 def raise_timeout(*args, **kwargs):
5341 self.serv.settimeout(1.0)
5342 self.serv.recv(1024)
5343 self.assertRaises(socket.timeout, raise_timeout,
5344 "Error generating a timeout exception (UDPLITE)")
5345
5346 def testTimeoutZero(self):
5347 ok = False
5348 try:
5349 self.serv.settimeout(0.0)
5350 foo = self.serv.recv(1024)
5351 except socket.timeout:
5352 self.fail("caught timeout instead of error (UDPLITE)")
5353 except OSError:
5354 ok = True
5355 except:
5356 self.fail("caught unexpected exception (UDPLITE)")
5357 if not ok:
5358 self.fail("recv() returned success when we did not expect it")
5359
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005360class TestExceptions(unittest.TestCase):
5361
5362 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005363 self.assertTrue(issubclass(OSError, Exception))
5364 self.assertTrue(issubclass(socket.herror, OSError))
5365 self.assertTrue(issubclass(socket.gaierror, OSError))
5366 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005367
Yury Selivanovfa22b292016-10-18 16:03:52 -04005368 def test_setblocking_invalidfd(self):
5369 # Regression test for issue #28471
5370
5371 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5372 sock = socket.socket(
5373 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5374 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005375 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005376
5377 with self.assertRaises(OSError):
5378 sock.setblocking(False)
5379
5380
Serhiy Storchaka43767632013-11-03 21:31:38 +02005381@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005382class TestLinuxAbstractNamespace(unittest.TestCase):
5383
5384 UNIX_PATH_MAX = 108
5385
5386 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005387 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005388 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5389 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005390 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005391 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5392 s2.connect(s1.getsockname())
5393 with s1.accept()[0] as s3:
5394 self.assertEqual(s1.getsockname(), address)
5395 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005396
5397 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005398 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005399 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5400 s.bind(address)
5401 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005402
5403 def testNameOverflow(self):
5404 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005405 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005406 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005407
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005408 def testStrName(self):
5409 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005410 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5411 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005412 s.bind("\x00python\x00test\x00")
5413 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005414 finally:
5415 s.close()
5416
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005417 def testBytearrayName(self):
5418 # Check that an abstract name can be passed as a bytearray.
5419 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5420 s.bind(bytearray(b"\x00python\x00test\x00"))
5421 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5422
Serhiy Storchaka43767632013-11-03 21:31:38 +02005423@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005424class TestUnixDomain(unittest.TestCase):
5425
5426 def setUp(self):
5427 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5428
5429 def tearDown(self):
5430 self.sock.close()
5431
5432 def encoded(self, path):
5433 # Return the given path encoded in the file system encoding,
5434 # or skip the test if this is not possible.
5435 try:
5436 return os.fsencode(path)
5437 except UnicodeEncodeError:
5438 self.skipTest(
5439 "Pathname {0!a} cannot be represented in file "
5440 "system encoding {1!r}".format(
5441 path, sys.getfilesystemencoding()))
5442
Antoine Pitrou16374872011-12-16 15:04:12 +01005443 def bind(self, sock, path):
5444 # Bind the socket
5445 try:
Serhiy Storchaka16994912020-04-25 10:06:29 +03005446 socket_helper.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005447 except OSError as e:
5448 if str(e) == "AF_UNIX path too long":
5449 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005450 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005451 .format(path))
5452 else:
5453 raise
5454
Antoine Pitrou495b5022017-05-02 17:20:00 +02005455 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005456 # Issue #30205 (note getsockname() can return None on OS X)
5457 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005458
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005459 def testStrAddr(self):
5460 # Test binding to and retrieving a normal string pathname.
5461 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005462 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005463 self.addCleanup(support.unlink, path)
5464 self.assertEqual(self.sock.getsockname(), path)
5465
5466 def testBytesAddr(self):
5467 # Test binding to a bytes pathname.
5468 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005469 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005470 self.addCleanup(support.unlink, path)
5471 self.assertEqual(self.sock.getsockname(), path)
5472
5473 def testSurrogateescapeBind(self):
5474 # Test binding to a valid non-ASCII pathname, with the
5475 # non-ASCII bytes supplied using surrogateescape encoding.
5476 path = os.path.abspath(support.TESTFN_UNICODE)
5477 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005478 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005479 self.addCleanup(support.unlink, path)
5480 self.assertEqual(self.sock.getsockname(), path)
5481
5482 def testUnencodableAddr(self):
5483 # Test binding to a pathname that cannot be encoded in the
5484 # file system encoding.
5485 if support.TESTFN_UNENCODABLE is None:
5486 self.skipTest("No unencodable filename available")
5487 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005488 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005489 self.addCleanup(support.unlink, path)
5490 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005491
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005492
Thomas Wouters477c8d52006-05-27 19:21:47 +00005493class BufferIOTest(SocketConnectedTest):
5494 """
5495 Test the buffer versions of socket.recv() and socket.send().
5496 """
5497 def __init__(self, methodName='runTest'):
5498 SocketConnectedTest.__init__(self, methodName=methodName)
5499
Antoine Pitrou25480782010-03-17 22:50:28 +00005500 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005501 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005502 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005503 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005504 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005505 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005506 self.assertEqual(msg, MSG)
5507
Antoine Pitrou25480782010-03-17 22:50:28 +00005508 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005509 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005510 self.serv_conn.send(buf)
5511
Antoine Pitrou25480782010-03-17 22:50:28 +00005512 def testRecvIntoBytearray(self):
5513 buf = bytearray(1024)
5514 nbytes = self.cli_conn.recv_into(buf)
5515 self.assertEqual(nbytes, len(MSG))
5516 msg = buf[:len(MSG)]
5517 self.assertEqual(msg, MSG)
5518
5519 _testRecvIntoBytearray = _testRecvIntoArray
5520
5521 def testRecvIntoMemoryview(self):
5522 buf = bytearray(1024)
5523 nbytes = self.cli_conn.recv_into(memoryview(buf))
5524 self.assertEqual(nbytes, len(MSG))
5525 msg = buf[:len(MSG)]
5526 self.assertEqual(msg, MSG)
5527
5528 _testRecvIntoMemoryview = _testRecvIntoArray
5529
5530 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005531 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005532 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005533 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005534 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005535 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005536 self.assertEqual(msg, MSG)
5537
Antoine Pitrou25480782010-03-17 22:50:28 +00005538 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005539 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005540 self.serv_conn.send(buf)
5541
Antoine Pitrou25480782010-03-17 22:50:28 +00005542 def testRecvFromIntoBytearray(self):
5543 buf = bytearray(1024)
5544 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5545 self.assertEqual(nbytes, len(MSG))
5546 msg = buf[:len(MSG)]
5547 self.assertEqual(msg, MSG)
5548
5549 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5550
5551 def testRecvFromIntoMemoryview(self):
5552 buf = bytearray(1024)
5553 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5554 self.assertEqual(nbytes, len(MSG))
5555 msg = buf[:len(MSG)]
5556 self.assertEqual(msg, MSG)
5557
5558 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5559
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005560 def testRecvFromIntoSmallBuffer(self):
5561 # See issue #20246.
5562 buf = bytearray(8)
5563 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5564
5565 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005566 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005567
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005568 def testRecvFromIntoEmptyBuffer(self):
5569 buf = bytearray()
5570 self.cli_conn.recvfrom_into(buf)
5571 self.cli_conn.recvfrom_into(buf, 0)
5572
5573 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5574
Christian Heimes043d6f62008-01-07 17:19:16 +00005575
5576TIPC_STYPE = 2000
5577TIPC_LOWER = 200
5578TIPC_UPPER = 210
5579
5580def isTipcAvailable():
5581 """Check if the TIPC module is loaded
5582
5583 The TIPC module is not loaded automatically on Ubuntu and probably
5584 other Linux distros.
5585 """
5586 if not hasattr(socket, "AF_TIPC"):
5587 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005588 try:
5589 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005590 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005591 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005592 # have not the permission to read it.
5593 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005594 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005595 for line in f:
5596 if line.startswith("tipc "):
5597 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005598 return False
5599
Serhiy Storchaka43767632013-11-03 21:31:38 +02005600@unittest.skipUnless(isTipcAvailable(),
5601 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005602class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005603 def testRDM(self):
5604 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5605 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005606 self.addCleanup(srv.close)
5607 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005608
5609 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5610 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5611 TIPC_LOWER, TIPC_UPPER)
5612 srv.bind(srvaddr)
5613
5614 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5615 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5616 cli.sendto(MSG, sendaddr)
5617
5618 msg, recvaddr = srv.recvfrom(1024)
5619
5620 self.assertEqual(cli.getsockname(), recvaddr)
5621 self.assertEqual(msg, MSG)
5622
5623
Serhiy Storchaka43767632013-11-03 21:31:38 +02005624@unittest.skipUnless(isTipcAvailable(),
5625 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005626class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005627 def __init__(self, methodName = 'runTest'):
5628 unittest.TestCase.__init__(self, methodName = methodName)
5629 ThreadableTest.__init__(self)
5630
5631 def setUp(self):
5632 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005633 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005634 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5635 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5636 TIPC_LOWER, TIPC_UPPER)
5637 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005638 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005639 self.serverExplicitReady()
5640 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005641 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005642
5643 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005644 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005645 # accept() call; sleep a little while to avoid it, otherwise
5646 # we could get an exception
5647 time.sleep(0.1)
5648 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005649 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005650 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5651 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5652 self.cli.connect(addr)
5653 self.cliaddr = self.cli.getsockname()
5654
5655 def testStream(self):
5656 msg = self.conn.recv(1024)
5657 self.assertEqual(msg, MSG)
5658 self.assertEqual(self.cliaddr, self.connaddr)
5659
5660 def _testStream(self):
5661 self.cli.send(MSG)
5662 self.cli.close()
5663
5664
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005665class ContextManagersTest(ThreadedTCPSocketTest):
5666
5667 def _testSocketClass(self):
5668 # base test
5669 with socket.socket() as sock:
5670 self.assertFalse(sock._closed)
5671 self.assertTrue(sock._closed)
5672 # close inside with block
5673 with socket.socket() as sock:
5674 sock.close()
5675 self.assertTrue(sock._closed)
5676 # exception inside with block
5677 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005678 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005679 self.assertTrue(sock._closed)
5680
5681 def testCreateConnectionBase(self):
5682 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005683 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005684 data = conn.recv(1024)
5685 conn.sendall(data)
5686
5687 def _testCreateConnectionBase(self):
5688 address = self.serv.getsockname()
5689 with socket.create_connection(address) as sock:
5690 self.assertFalse(sock._closed)
5691 sock.sendall(b'foo')
5692 self.assertEqual(sock.recv(1024), b'foo')
5693 self.assertTrue(sock._closed)
5694
5695 def testCreateConnectionClose(self):
5696 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005697 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005698 data = conn.recv(1024)
5699 conn.sendall(data)
5700
5701 def _testCreateConnectionClose(self):
5702 address = self.serv.getsockname()
5703 with socket.create_connection(address) as sock:
5704 sock.close()
5705 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005706 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005707
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005708
Victor Stinnerdaf45552013-08-28 00:53:59 +02005709class InheritanceTest(unittest.TestCase):
5710 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5711 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005712 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005713 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005714 with socket.socket(socket.AF_INET,
5715 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005716 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005717 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005718
5719 def test_default_inheritable(self):
5720 sock = socket.socket()
5721 with sock:
5722 self.assertEqual(sock.get_inheritable(), False)
5723
5724 def test_dup(self):
5725 sock = socket.socket()
5726 with sock:
5727 newsock = sock.dup()
5728 sock.close()
5729 with newsock:
5730 self.assertEqual(newsock.get_inheritable(), False)
5731
5732 def test_set_inheritable(self):
5733 sock = socket.socket()
5734 with sock:
5735 sock.set_inheritable(True)
5736 self.assertEqual(sock.get_inheritable(), True)
5737
5738 sock.set_inheritable(False)
5739 self.assertEqual(sock.get_inheritable(), False)
5740
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005741 @unittest.skipIf(fcntl is None, "need fcntl")
5742 def test_get_inheritable_cloexec(self):
5743 sock = socket.socket()
5744 with sock:
5745 fd = sock.fileno()
5746 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005747
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005748 # clear FD_CLOEXEC flag
5749 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5750 flags &= ~fcntl.FD_CLOEXEC
5751 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005752
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005753 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005754
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005755 @unittest.skipIf(fcntl is None, "need fcntl")
5756 def test_set_inheritable_cloexec(self):
5757 sock = socket.socket()
5758 with sock:
5759 fd = sock.fileno()
5760 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5761 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005762
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005763 sock.set_inheritable(True)
5764 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5765 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005766
5767
Victor Stinnerdaf45552013-08-28 00:53:59 +02005768 def test_socketpair(self):
5769 s1, s2 = socket.socketpair()
5770 self.addCleanup(s1.close)
5771 self.addCleanup(s2.close)
5772 self.assertEqual(s1.get_inheritable(), False)
5773 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005774
5775
5776@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5777 "SOCK_NONBLOCK not defined")
5778class NonblockConstantTest(unittest.TestCase):
5779 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5780 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005781 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005782 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005783 self.assertTrue(
5784 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005785 if timeout == 0:
5786 # timeout == 0: means that getblocking() must be False.
5787 self.assertFalse(s.getblocking())
5788 else:
5789 # If timeout > 0, the socket will be in a "blocking" mode
5790 # from the standpoint of the Python API. For Python socket
5791 # object, "blocking" means that operations like 'sock.recv()'
5792 # will block. Internally, file descriptors for
5793 # "blocking" Python sockets *with timeouts* are in a
5794 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5795 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5796 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005797 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005798 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005799 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005800 self.assertFalse(
5801 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005802 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005803
Charles-François Natali239bb962011-06-03 12:55:15 +02005804 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005805 def test_SOCK_NONBLOCK(self):
5806 # a lot of it seems silly and redundant, but I wanted to test that
5807 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005808 with socket.socket(socket.AF_INET,
5809 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5810 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005811 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005812 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005813 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005814 self.checkNonblock(s)
5815 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005816 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005817 s.settimeout(2.0)
5818 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005819 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005820 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005821 # defaulttimeout
5822 t = socket.getdefaulttimeout()
5823 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005824 with socket.socket() as s:
5825 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005826 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005827 with socket.socket() as s:
5828 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005829 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005830 with socket.socket() as s:
5831 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005832 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005833 with socket.socket() as s:
5834 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005835 socket.setdefaulttimeout(t)
5836
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005837
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005838@unittest.skipUnless(os.name == "nt", "Windows specific")
5839@unittest.skipUnless(multiprocessing, "need multiprocessing")
5840class TestSocketSharing(SocketTCPTest):
5841 # This must be classmethod and not staticmethod or multiprocessing
5842 # won't be able to bootstrap it.
5843 @classmethod
5844 def remoteProcessServer(cls, q):
5845 # Recreate socket from shared data
5846 sdata = q.get()
5847 message = q.get()
5848
5849 s = socket.fromshare(sdata)
5850 s2, c = s.accept()
5851
5852 # Send the message
5853 s2.sendall(message)
5854 s2.close()
5855 s.close()
5856
5857 def testShare(self):
5858 # Transfer the listening server socket to another process
5859 # and service it from there.
5860
5861 # Create process:
5862 q = multiprocessing.Queue()
5863 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5864 p.start()
5865
5866 # Get the shared socket data
5867 data = self.serv.share(p.pid)
5868
5869 # Pass the shared socket to the other process
5870 addr = self.serv.getsockname()
5871 self.serv.close()
5872 q.put(data)
5873
5874 # The data that the server will send us
5875 message = b"slapmahfro"
5876 q.put(message)
5877
5878 # Connect
5879 s = socket.create_connection(addr)
5880 # listen for the data
5881 m = []
5882 while True:
5883 data = s.recv(100)
5884 if not data:
5885 break
5886 m.append(data)
5887 s.close()
5888 received = b"".join(m)
5889 self.assertEqual(received, message)
5890 p.join()
5891
5892 def testShareLength(self):
5893 data = self.serv.share(os.getpid())
5894 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5895 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5896
5897 def compareSockets(self, org, other):
5898 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005899 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005900 self.assertEqual(org.gettimeout(), None)
5901 self.assertEqual(org.gettimeout(), other.gettimeout())
5902
5903 self.assertEqual(org.family, other.family)
5904 self.assertEqual(org.type, other.type)
5905 # If the user specified "0" for proto, then
5906 # internally windows will have picked the correct value.
5907 # Python introspection on the socket however will still return
5908 # 0. For the shared socket, the python value is recreated
5909 # from the actual value, so it may not compare correctly.
5910 if org.proto != 0:
5911 self.assertEqual(org.proto, other.proto)
5912
5913 def testShareLocal(self):
5914 data = self.serv.share(os.getpid())
5915 s = socket.fromshare(data)
5916 try:
5917 self.compareSockets(self.serv, s)
5918 finally:
5919 s.close()
5920
5921 def testTypes(self):
5922 families = [socket.AF_INET, socket.AF_INET6]
5923 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5924 for f in families:
5925 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005926 try:
5927 source = socket.socket(f, t)
5928 except OSError:
5929 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005930 try:
5931 data = source.share(os.getpid())
5932 shared = socket.fromshare(data)
5933 try:
5934 self.compareSockets(source, shared)
5935 finally:
5936 shared.close()
5937 finally:
5938 source.close()
5939
5940
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005941class SendfileUsingSendTest(ThreadedTCPSocketTest):
5942 """
5943 Test the send() implementation of socket.sendfile().
5944 """
5945
Victor Stinner8c663fd2017-11-08 14:44:44 -08005946 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005947 BUFSIZE = 8192
5948 FILEDATA = b""
Victor Stinner24c62582019-10-30 12:41:43 +01005949 TIMEOUT = support.LOOPBACK_TIMEOUT
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005950
5951 @classmethod
5952 def setUpClass(cls):
5953 def chunks(total, step):
5954 assert total >= step
5955 while total > step:
5956 yield step
5957 total -= step
5958 if total:
5959 yield total
5960
5961 chunk = b"".join([random.choice(string.ascii_letters).encode()
5962 for i in range(cls.BUFSIZE)])
5963 with open(support.TESTFN, 'wb') as f:
5964 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5965 f.write(chunk)
5966 with open(support.TESTFN, 'rb') as f:
5967 cls.FILEDATA = f.read()
5968 assert len(cls.FILEDATA) == cls.FILESIZE
5969
5970 @classmethod
5971 def tearDownClass(cls):
5972 support.unlink(support.TESTFN)
5973
5974 def accept_conn(self):
Victor Stinner24c62582019-10-30 12:41:43 +01005975 self.serv.settimeout(support.LONG_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005976 conn, addr = self.serv.accept()
5977 conn.settimeout(self.TIMEOUT)
5978 self.addCleanup(conn.close)
5979 return conn
5980
5981 def recv_data(self, conn):
5982 received = []
5983 while True:
5984 chunk = conn.recv(self.BUFSIZE)
5985 if not chunk:
5986 break
5987 received.append(chunk)
5988 return b''.join(received)
5989
5990 def meth_from_sock(self, sock):
5991 # Depending on the mixin class being run return either send()
5992 # or sendfile() method implementation.
5993 return getattr(sock, "_sendfile_use_send")
5994
5995 # regular file
5996
5997 def _testRegularFile(self):
5998 address = self.serv.getsockname()
5999 file = open(support.TESTFN, 'rb')
6000 with socket.create_connection(address) as sock, file as file:
6001 meth = self.meth_from_sock(sock)
6002 sent = meth(file)
6003 self.assertEqual(sent, self.FILESIZE)
6004 self.assertEqual(file.tell(), self.FILESIZE)
6005
6006 def testRegularFile(self):
6007 conn = self.accept_conn()
6008 data = self.recv_data(conn)
6009 self.assertEqual(len(data), self.FILESIZE)
6010 self.assertEqual(data, self.FILEDATA)
6011
6012 # non regular file
6013
6014 def _testNonRegularFile(self):
6015 address = self.serv.getsockname()
6016 file = io.BytesIO(self.FILEDATA)
6017 with socket.create_connection(address) as sock, file as file:
6018 sent = sock.sendfile(file)
6019 self.assertEqual(sent, self.FILESIZE)
6020 self.assertEqual(file.tell(), self.FILESIZE)
6021 self.assertRaises(socket._GiveupOnSendfile,
6022 sock._sendfile_use_sendfile, file)
6023
6024 def testNonRegularFile(self):
6025 conn = self.accept_conn()
6026 data = self.recv_data(conn)
6027 self.assertEqual(len(data), self.FILESIZE)
6028 self.assertEqual(data, self.FILEDATA)
6029
6030 # empty file
6031
6032 def _testEmptyFileSend(self):
6033 address = self.serv.getsockname()
6034 filename = support.TESTFN + "2"
6035 with open(filename, 'wb'):
6036 self.addCleanup(support.unlink, filename)
6037 file = open(filename, 'rb')
6038 with socket.create_connection(address) as sock, file as file:
6039 meth = self.meth_from_sock(sock)
6040 sent = meth(file)
6041 self.assertEqual(sent, 0)
6042 self.assertEqual(file.tell(), 0)
6043
6044 def testEmptyFileSend(self):
6045 conn = self.accept_conn()
6046 data = self.recv_data(conn)
6047 self.assertEqual(data, b"")
6048
6049 # offset
6050
6051 def _testOffset(self):
6052 address = self.serv.getsockname()
6053 file = open(support.TESTFN, 'rb')
6054 with socket.create_connection(address) as sock, file as file:
6055 meth = self.meth_from_sock(sock)
6056 sent = meth(file, offset=5000)
6057 self.assertEqual(sent, self.FILESIZE - 5000)
6058 self.assertEqual(file.tell(), self.FILESIZE)
6059
6060 def testOffset(self):
6061 conn = self.accept_conn()
6062 data = self.recv_data(conn)
6063 self.assertEqual(len(data), self.FILESIZE - 5000)
6064 self.assertEqual(data, self.FILEDATA[5000:])
6065
6066 # count
6067
6068 def _testCount(self):
6069 address = self.serv.getsockname()
6070 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006071 sock = socket.create_connection(address,
6072 timeout=support.LOOPBACK_TIMEOUT)
6073 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006074 count = 5000007
6075 meth = self.meth_from_sock(sock)
6076 sent = meth(file, count=count)
6077 self.assertEqual(sent, count)
6078 self.assertEqual(file.tell(), count)
6079
6080 def testCount(self):
6081 count = 5000007
6082 conn = self.accept_conn()
6083 data = self.recv_data(conn)
6084 self.assertEqual(len(data), count)
6085 self.assertEqual(data, self.FILEDATA[:count])
6086
6087 # count small
6088
6089 def _testCountSmall(self):
6090 address = self.serv.getsockname()
6091 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006092 sock = socket.create_connection(address,
6093 timeout=support.LOOPBACK_TIMEOUT)
6094 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006095 count = 1
6096 meth = self.meth_from_sock(sock)
6097 sent = meth(file, count=count)
6098 self.assertEqual(sent, count)
6099 self.assertEqual(file.tell(), count)
6100
6101 def testCountSmall(self):
6102 count = 1
6103 conn = self.accept_conn()
6104 data = self.recv_data(conn)
6105 self.assertEqual(len(data), count)
6106 self.assertEqual(data, self.FILEDATA[:count])
6107
6108 # count + offset
6109
6110 def _testCountWithOffset(self):
6111 address = self.serv.getsockname()
6112 file = open(support.TESTFN, 'rb')
6113 with socket.create_connection(address, timeout=2) as sock, file as file:
6114 count = 100007
6115 meth = self.meth_from_sock(sock)
6116 sent = meth(file, offset=2007, count=count)
6117 self.assertEqual(sent, count)
6118 self.assertEqual(file.tell(), count + 2007)
6119
6120 def testCountWithOffset(self):
6121 count = 100007
6122 conn = self.accept_conn()
6123 data = self.recv_data(conn)
6124 self.assertEqual(len(data), count)
6125 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6126
6127 # non blocking sockets are not supposed to work
6128
6129 def _testNonBlocking(self):
6130 address = self.serv.getsockname()
6131 file = open(support.TESTFN, 'rb')
6132 with socket.create_connection(address) as sock, file as file:
6133 sock.setblocking(False)
6134 meth = self.meth_from_sock(sock)
6135 self.assertRaises(ValueError, meth, file)
6136 self.assertRaises(ValueError, sock.sendfile, file)
6137
6138 def testNonBlocking(self):
6139 conn = self.accept_conn()
6140 if conn.recv(8192):
6141 self.fail('was not supposed to receive any data')
6142
6143 # timeout (non-triggered)
6144
6145 def _testWithTimeout(self):
6146 address = self.serv.getsockname()
6147 file = open(support.TESTFN, 'rb')
Victor Stinner7772b1a2019-12-11 22:17:04 +01006148 sock = socket.create_connection(address,
6149 timeout=support.LOOPBACK_TIMEOUT)
6150 with sock, file:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006151 meth = self.meth_from_sock(sock)
6152 sent = meth(file)
6153 self.assertEqual(sent, self.FILESIZE)
6154
6155 def testWithTimeout(self):
6156 conn = self.accept_conn()
6157 data = self.recv_data(conn)
6158 self.assertEqual(len(data), self.FILESIZE)
6159 self.assertEqual(data, self.FILEDATA)
6160
6161 # timeout (triggered)
6162
6163 def _testWithTimeoutTriggeredSend(self):
6164 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006165 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006166 with socket.create_connection(address) as sock:
6167 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006168 meth = self.meth_from_sock(sock)
6169 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006170
6171 def testWithTimeoutTriggeredSend(self):
6172 conn = self.accept_conn()
6173 conn.recv(88192)
6174
6175 # errors
6176
6177 def _test_errors(self):
6178 pass
6179
6180 def test_errors(self):
6181 with open(support.TESTFN, 'rb') as file:
6182 with socket.socket(type=socket.SOCK_DGRAM) as s:
6183 meth = self.meth_from_sock(s)
6184 self.assertRaisesRegex(
6185 ValueError, "SOCK_STREAM", meth, file)
6186 with open(support.TESTFN, 'rt') as file:
6187 with socket.socket() as s:
6188 meth = self.meth_from_sock(s)
6189 self.assertRaisesRegex(
6190 ValueError, "binary mode", meth, file)
6191 with open(support.TESTFN, 'rb') as file:
6192 with socket.socket() as s:
6193 meth = self.meth_from_sock(s)
6194 self.assertRaisesRegex(TypeError, "positive integer",
6195 meth, file, count='2')
6196 self.assertRaisesRegex(TypeError, "positive integer",
6197 meth, file, count=0.1)
6198 self.assertRaisesRegex(ValueError, "positive integer",
6199 meth, file, count=0)
6200 self.assertRaisesRegex(ValueError, "positive integer",
6201 meth, file, count=-1)
6202
6203
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006204@unittest.skipUnless(hasattr(os, "sendfile"),
6205 'os.sendfile() required for this test.')
6206class SendfileUsingSendfileTest(SendfileUsingSendTest):
6207 """
6208 Test the sendfile() implementation of socket.sendfile().
6209 """
6210 def meth_from_sock(self, sock):
6211 return getattr(sock, "_sendfile_use_sendfile")
6212
Christian Heimes48371412016-09-06 00:37:46 +02006213
6214@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006215class LinuxKernelCryptoAPI(unittest.TestCase):
6216 # tests for AF_ALG
6217 def create_alg(self, typ, name):
6218 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006219 try:
6220 sock.bind((typ, name))
6221 except FileNotFoundError as e:
6222 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006223 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006224 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006225 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006226 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006227
Victor Stinner86afc1f2017-11-30 13:58:43 +01006228 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6229 # at least on ppc64le architecture
6230 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006231 def test_sha256(self):
6232 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6233 "177a9cb410ff61f20015ad")
6234 with self.create_alg('hash', 'sha256') as algo:
6235 op, _ = algo.accept()
6236 with op:
6237 op.sendall(b"abc")
6238 self.assertEqual(op.recv(512), expected)
6239
6240 op, _ = algo.accept()
6241 with op:
6242 op.send(b'a', socket.MSG_MORE)
6243 op.send(b'b', socket.MSG_MORE)
6244 op.send(b'c', socket.MSG_MORE)
6245 op.send(b'')
6246 self.assertEqual(op.recv(512), expected)
6247
6248 def test_hmac_sha1(self):
6249 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6250 with self.create_alg('hash', 'hmac(sha1)') as algo:
6251 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6252 op, _ = algo.accept()
6253 with op:
6254 op.sendall(b"what do ya want for nothing?")
6255 self.assertEqual(op.recv(512), expected)
6256
Christian Heimese084f842016-09-11 20:11:30 +02006257 # Although it should work with 3.19 and newer the test blocks on
6258 # Ubuntu 15.10 with Kernel 4.2.0-19.
6259 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006260 def test_aes_cbc(self):
6261 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6262 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6263 msg = b"Single block msg"
6264 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6265 msglen = len(msg)
6266 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6267 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6268 op, _ = algo.accept()
6269 with op:
6270 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6271 flags=socket.MSG_MORE)
6272 op.sendall(msg)
6273 self.assertEqual(op.recv(msglen), ciphertext)
6274
6275 op, _ = algo.accept()
6276 with op:
6277 op.sendmsg_afalg([ciphertext],
6278 op=socket.ALG_OP_DECRYPT, iv=iv)
6279 self.assertEqual(op.recv(msglen), msg)
6280
6281 # long message
6282 multiplier = 1024
6283 longmsg = [msg] * multiplier
6284 op, _ = algo.accept()
6285 with op:
6286 op.sendmsg_afalg(longmsg,
6287 op=socket.ALG_OP_ENCRYPT, iv=iv)
6288 enc = op.recv(msglen * multiplier)
6289 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006290 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006291
6292 op, _ = algo.accept()
6293 with op:
6294 op.sendmsg_afalg([enc],
6295 op=socket.ALG_OP_DECRYPT, iv=iv)
6296 dec = op.recv(msglen * multiplier)
6297 self.assertEqual(len(dec), msglen * multiplier)
6298 self.assertEqual(dec, msg * multiplier)
6299
matejcik9764c152017-02-16 14:41:31 +01006300 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006301 def test_aead_aes_gcm(self):
6302 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6303 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6304 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6305 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6306 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6307 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6308
6309 taglen = len(expected_tag)
6310 assoclen = len(assoc)
6311
6312 with self.create_alg('aead', 'gcm(aes)') as algo:
6313 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6314 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6315 None, taglen)
6316
6317 # send assoc, plain and tag buffer in separate steps
6318 op, _ = algo.accept()
6319 with op:
6320 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6321 assoclen=assoclen, flags=socket.MSG_MORE)
6322 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006323 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006324 res = op.recv(assoclen + len(plain) + taglen)
6325 self.assertEqual(expected_ct, res[assoclen:-taglen])
6326 self.assertEqual(expected_tag, res[-taglen:])
6327
6328 # now with msg
6329 op, _ = algo.accept()
6330 with op:
matejcik9764c152017-02-16 14:41:31 +01006331 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006332 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6333 assoclen=assoclen)
6334 res = op.recv(assoclen + len(plain) + taglen)
6335 self.assertEqual(expected_ct, res[assoclen:-taglen])
6336 self.assertEqual(expected_tag, res[-taglen:])
6337
6338 # create anc data manually
6339 pack_uint32 = struct.Struct('I').pack
6340 op, _ = algo.accept()
6341 with op:
matejcik9764c152017-02-16 14:41:31 +01006342 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006343 op.sendmsg(
6344 [msg],
6345 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6346 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6347 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6348 )
6349 )
matejcik9764c152017-02-16 14:41:31 +01006350 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006351 self.assertEqual(expected_ct, res[assoclen:-taglen])
6352 self.assertEqual(expected_tag, res[-taglen:])
6353
6354 # decrypt and verify
6355 op, _ = algo.accept()
6356 with op:
6357 msg = assoc + expected_ct + expected_tag
6358 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6359 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006360 res = op.recv(len(msg) - taglen)
6361 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006362
Christian Heimese084f842016-09-11 20:11:30 +02006363 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006364 def test_drbg_pr_sha256(self):
6365 # deterministic random bit generator, prediction resistance, sha256
6366 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6367 extra_seed = os.urandom(32)
6368 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6369 op, _ = algo.accept()
6370 with op:
6371 rn = op.recv(32)
6372 self.assertEqual(len(rn), 32)
6373
6374 def test_sendmsg_afalg_args(self):
6375 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006376 with sock:
6377 with self.assertRaises(TypeError):
6378 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006379
Christian Heimes02b30352016-09-11 19:49:56 +02006380 with self.assertRaises(TypeError):
6381 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006382
Christian Heimes02b30352016-09-11 19:49:56 +02006383 with self.assertRaises(TypeError):
6384 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006385
Christian Heimes02b30352016-09-11 19:49:56 +02006386 with self.assertRaises(TypeError):
6387 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006388
Christian Heimes02b30352016-09-11 19:49:56 +02006389 with self.assertRaises(TypeError):
6390 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6391
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006392 def test_length_restriction(self):
6393 # bpo-35050, off-by-one error in length check
6394 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6395 self.addCleanup(sock.close)
6396
6397 # salg_type[14]
6398 with self.assertRaises(FileNotFoundError):
6399 sock.bind(("t" * 13, "name"))
6400 with self.assertRaisesRegex(ValueError, "type too long"):
6401 sock.bind(("t" * 14, "name"))
6402
6403 # salg_name[64]
6404 with self.assertRaises(FileNotFoundError):
6405 sock.bind(("type", "n" * 63))
6406 with self.assertRaisesRegex(ValueError, "name too long"):
6407 sock.bind(("type", "n" * 64))
6408
6409
animalize19e7d482018-02-27 02:10:36 +08006410@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6411class TestMSWindowsTCPFlags(unittest.TestCase):
6412 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006413 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006414 'TCP_MAXSEG',
6415 'TCP_NODELAY',
6416 # available starting with Windows 10 1607
6417 'TCP_FASTOPEN',
6418 # available starting with Windows 10 1703
6419 'TCP_KEEPCNT',
6420 # available starting with Windows 10 1709
6421 'TCP_KEEPIDLE',
6422 'TCP_KEEPINTVL'
6423 }
6424
6425 def test_new_tcp_flags(self):
6426 provided = [s for s in dir(socket) if s.startswith('TCP')]
6427 unknown = [s for s in provided if s not in self.knownTCPFlags]
6428
6429 self.assertEqual([], unknown,
6430 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006431
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006432
6433class CreateServerTest(unittest.TestCase):
6434
6435 def test_address(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006436 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006437 with socket.create_server(("127.0.0.1", port)) as sock:
6438 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6439 self.assertEqual(sock.getsockname()[1], port)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006440 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006441 with socket.create_server(("::1", port),
6442 family=socket.AF_INET6) as sock:
6443 self.assertEqual(sock.getsockname()[0], "::1")
6444 self.assertEqual(sock.getsockname()[1], port)
6445
6446 def test_family_and_type(self):
6447 with socket.create_server(("127.0.0.1", 0)) as sock:
6448 self.assertEqual(sock.family, socket.AF_INET)
6449 self.assertEqual(sock.type, socket.SOCK_STREAM)
Serhiy Storchaka16994912020-04-25 10:06:29 +03006450 if socket_helper.IPV6_ENABLED:
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006451 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6452 self.assertEqual(s.family, socket.AF_INET6)
6453 self.assertEqual(sock.type, socket.SOCK_STREAM)
6454
6455 def test_reuse_port(self):
6456 if not hasattr(socket, "SO_REUSEPORT"):
6457 with self.assertRaises(ValueError):
6458 socket.create_server(("localhost", 0), reuse_port=True)
6459 else:
6460 with socket.create_server(("localhost", 0)) as sock:
6461 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6462 self.assertEqual(opt, 0)
6463 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6464 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6465 self.assertNotEqual(opt, 0)
6466
6467 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6468 not hasattr(_socket, 'IPV6_V6ONLY'),
6469 "IPV6_V6ONLY option not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006470 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006471 def test_ipv6_only_default(self):
6472 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6473 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6474
6475 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6476 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006477 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006478 def test_dualstack_ipv6_family(self):
6479 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6480 dualstack_ipv6=True) as sock:
6481 self.assertEqual(sock.family, socket.AF_INET6)
6482
6483
6484class CreateServerFunctionalTest(unittest.TestCase):
Victor Stinner24c62582019-10-30 12:41:43 +01006485 timeout = support.LOOPBACK_TIMEOUT
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006486
6487 def setUp(self):
6488 self.thread = None
6489
6490 def tearDown(self):
6491 if self.thread is not None:
6492 self.thread.join(self.timeout)
6493
6494 def echo_server(self, sock):
6495 def run(sock):
6496 with sock:
6497 conn, _ = sock.accept()
6498 with conn:
6499 event.wait(self.timeout)
6500 msg = conn.recv(1024)
6501 if not msg:
6502 return
6503 conn.sendall(msg)
6504
6505 event = threading.Event()
6506 sock.settimeout(self.timeout)
6507 self.thread = threading.Thread(target=run, args=(sock, ))
6508 self.thread.start()
6509 event.set()
6510
6511 def echo_client(self, addr, family):
6512 with socket.socket(family=family) as sock:
6513 sock.settimeout(self.timeout)
6514 sock.connect(addr)
6515 sock.sendall(b'foo')
6516 self.assertEqual(sock.recv(1024), b'foo')
6517
6518 def test_tcp4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006519 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006520 with socket.create_server(("", port)) as sock:
6521 self.echo_server(sock)
6522 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6523
Serhiy Storchaka16994912020-04-25 10:06:29 +03006524 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006525 def test_tcp6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006526 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006527 with socket.create_server(("", port),
6528 family=socket.AF_INET6) as sock:
6529 self.echo_server(sock)
6530 self.echo_client(("::1", port), socket.AF_INET6)
6531
6532 # --- dual stack tests
6533
6534 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6535 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006536 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006537 def test_dual_stack_client_v4(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006538 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006539 with socket.create_server(("", port), family=socket.AF_INET6,
6540 dualstack_ipv6=True) as sock:
6541 self.echo_server(sock)
6542 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6543
6544 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6545 "dualstack_ipv6 not supported")
Serhiy Storchaka16994912020-04-25 10:06:29 +03006546 @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006547 def test_dual_stack_client_v6(self):
Serhiy Storchaka16994912020-04-25 10:06:29 +03006548 port = socket_helper.find_unused_port()
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006549 with socket.create_server(("", port), family=socket.AF_INET6,
6550 dualstack_ipv6=True) as sock:
6551 self.echo_server(sock)
6552 self.echo_client(("::1", port), socket.AF_INET6)
6553
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006554@requireAttrs(socket, "send_fds")
6555@requireAttrs(socket, "recv_fds")
6556@requireAttrs(socket, "AF_UNIX")
6557class SendRecvFdsTests(unittest.TestCase):
6558 def testSendAndRecvFds(self):
6559 def close_pipes(pipes):
6560 for fd1, fd2 in pipes:
6561 os.close(fd1)
6562 os.close(fd2)
6563
6564 def close_fds(fds):
6565 for fd in fds:
6566 os.close(fd)
6567
6568 # send 10 file descriptors
6569 pipes = [os.pipe() for _ in range(10)]
6570 self.addCleanup(close_pipes, pipes)
6571 fds = [rfd for rfd, wfd in pipes]
6572
6573 # use a UNIX socket pair to exchange file descriptors locally
6574 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6575 with sock1, sock2:
6576 socket.send_fds(sock1, [MSG], fds)
6577 # request more data and file descriptors than expected
6578 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6579 self.addCleanup(close_fds, fds2)
6580
6581 self.assertEqual(msg, MSG)
6582 self.assertEqual(len(fds2), len(fds))
6583 self.assertEqual(flags, 0)
6584 # don't test addr
6585
6586 # test that file descriptors are connected
6587 for index, fds in enumerate(pipes):
6588 rfd, wfd = fds
6589 os.write(wfd, str(index).encode())
6590
6591 for index, rfd in enumerate(fds2):
6592 data = os.read(rfd, 100)
6593 self.assertEqual(data, str(index).encode())
6594
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006595
Guido van Rossumb995eb72002-07-31 16:08:40 +00006596def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006597 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006598 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006599 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6600 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006601
6602 tests.extend([
6603 NonBlockingTCPTests,
6604 FileObjectClassTestCase,
6605 UnbufferedFileObjectClassTestCase,
6606 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006607 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006608 UnicodeReadFileObjectClassTestCase,
6609 UnicodeWriteFileObjectClassTestCase,
6610 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006611 NetworkConnectionNoServer,
6612 NetworkConnectionAttributesTest,
6613 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006614 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006615 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006616 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006617 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006618 tests.append(BasicSocketPairTest)
6619 tests.append(TestUnixDomain)
6620 tests.append(TestLinuxAbstractNamespace)
6621 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006622 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006623 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006624 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006625 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006626 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006627 BasicVSOCKTest,
6628 ThreadedVSOCKSocketStreamTest,
6629 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006630 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006631 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006632 CmsgMacroTests,
6633 SendmsgUDPTest,
6634 RecvmsgUDPTest,
6635 RecvmsgIntoUDPTest,
6636 SendmsgUDP6Test,
6637 RecvmsgUDP6Test,
6638 RecvmsgRFC3542AncillaryUDP6Test,
6639 RecvmsgIntoRFC3542AncillaryUDP6Test,
6640 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006641 SendmsgUDPLITETest,
6642 RecvmsgUDPLITETest,
6643 RecvmsgIntoUDPLITETest,
6644 SendmsgUDPLITE6Test,
6645 RecvmsgUDPLITE6Test,
6646 RecvmsgRFC3542AncillaryUDPLITE6Test,
6647 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6648 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006649 SendmsgTCPTest,
6650 RecvmsgTCPTest,
6651 RecvmsgIntoTCPTest,
6652 SendmsgSCTPStreamTest,
6653 RecvmsgSCTPStreamTest,
6654 RecvmsgIntoSCTPStreamTest,
6655 SendmsgUnixStreamTest,
6656 RecvmsgUnixStreamTest,
6657 RecvmsgIntoUnixStreamTest,
6658 RecvmsgSCMRightsStreamTest,
6659 RecvmsgIntoSCMRightsStreamTest,
6660 # These are slow when setitimer() is not available
6661 InterruptedRecvTimeoutTest,
6662 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006663 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006664 SendfileUsingSendTest,
6665 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006666 ])
animalize19e7d482018-02-27 02:10:36 +08006667 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006668
Hai Shie80697d2020-05-28 06:10:27 +08006669 thread_info = threading_helper.threading_setup()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006670 support.run_unittest(*tests)
Hai Shie80697d2020-05-28 06:10:27 +08006671 threading_helper.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006672
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006673
Guido van Rossum24e4af82002-06-12 19:18:08 +00006674if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006675 test_main()