blob: b74549024b789116de22eb057d4900a3b0661312 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
Michael Felt56614592018-12-26 04:34:37 +010015import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020022import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020023import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010024import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020025import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020026import _thread as thread
27import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000028try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000029 import multiprocessing
30except ImportError:
31 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020032try:
33 import fcntl
34except ImportError:
35 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Benjamin Petersonee8712c2008-05-20 21:35:26 +000037HOST = support.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010038# test unicode string and carriage return
39MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Victor Stinnerebd5d6d2018-11-30 12:29:25 +010040MAIN_TIMEOUT = 60.0
Barry Warsawcf3d4b51997-01-03 20:03:32 +000041
caaveryeffc12f2017-09-06 18:18:10 -040042VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010043AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040044
Victor Stinner45df8202010-04-28 22:31:17 +000045try:
Victor Stinnere254e532014-07-26 14:36:55 +020046 import _socket
47except ImportError:
48 _socket = None
49
caaveryeffc12f2017-09-06 18:18:10 -040050def get_cid():
51 if fcntl is None:
52 return None
53 try:
54 with open("/dev/vsock", "rb") as f:
55 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
56 except OSError:
57 return None
58 else:
59 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000060
Charles-François Natali47413c12011-10-06 19:47:44 +020061def _have_socket_can():
62 """Check whether CAN sockets are supported on this host."""
63 try:
64 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020065 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020066 return False
67 else:
68 s.close()
69 return True
70
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040071def _have_socket_can_isotp():
72 """Check whether CAN ISOTP sockets are supported on this host."""
73 try:
74 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
75 except (AttributeError, OSError):
76 return False
77 else:
78 s.close()
79 return True
80
Charles-François Natali10b8cf42011-11-10 19:21:37 +010081def _have_socket_rds():
82 """Check whether RDS sockets are supported on this host."""
83 try:
84 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
85 except (AttributeError, OSError):
86 return False
87 else:
88 s.close()
89 return True
90
Christian Heimes48371412016-09-06 00:37:46 +020091def _have_socket_alg():
92 """Check whether AF_ALG sockets are supported on this host."""
93 try:
94 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
95 except (AttributeError, OSError):
96 return False
97 else:
98 s.close()
99 return True
100
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700101def _have_socket_qipcrtr():
102 """Check whether AF_QIPCRTR sockets are supported on this host."""
103 try:
104 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
105 except (AttributeError, OSError):
106 return False
107 else:
108 s.close()
109 return True
110
caaveryeffc12f2017-09-06 18:18:10 -0400111def _have_socket_vsock():
112 """Check whether AF_VSOCK sockets are supported on this host."""
113 ret = get_cid() is not None
114 return ret
115
Yury Selivanovf11b4602018-01-28 17:27:38 -0500116
Greg Bowser8fbece12019-08-02 16:29:52 -0400117def _have_socket_bluetooth():
118 """Check whether AF_BLUETOOTH sockets are supported on this host."""
119 try:
120 # RFCOMM is supported by all platforms with bluetooth support. Windows
121 # does not support omitting the protocol.
122 s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
123 except (AttributeError, OSError):
124 return False
125 else:
126 s.close()
127 return True
128
129
Victor Stinner304315d2018-11-30 13:22:44 +0100130@contextlib.contextmanager
131def socket_setdefaulttimeout(timeout):
132 old_timeout = socket.getdefaulttimeout()
133 try:
134 socket.setdefaulttimeout(timeout)
135 yield
136 finally:
137 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500138
139
Charles-François Natali47413c12011-10-06 19:47:44 +0200140HAVE_SOCKET_CAN = _have_socket_can()
141
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400142HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
143
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100144HAVE_SOCKET_RDS = _have_socket_rds()
145
Christian Heimes48371412016-09-06 00:37:46 +0200146HAVE_SOCKET_ALG = _have_socket_alg()
147
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700148HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
149
caaveryeffc12f2017-09-06 18:18:10 -0400150HAVE_SOCKET_VSOCK = _have_socket_vsock()
151
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700152HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
153
Greg Bowser8fbece12019-08-02 16:29:52 -0400154HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
155
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000156# Size in bytes of the int type
157SIZEOF_INT = array.array("i").itemsize
158
Guido van Rossum24e4af82002-06-12 19:18:08 +0000159class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000160
Guido van Rossum24e4af82002-06-12 19:18:08 +0000161 def setUp(self):
162 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000163 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100164 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000165
Guido van Rossum24e4af82002-06-12 19:18:08 +0000166 def tearDown(self):
167 self.serv.close()
168 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000169
Guido van Rossum24e4af82002-06-12 19:18:08 +0000170class SocketUDPTest(unittest.TestCase):
171
172 def setUp(self):
173 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000174 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175
176 def tearDown(self):
177 self.serv.close()
178 self.serv = None
179
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700180class SocketUDPLITETest(SocketUDPTest):
181
182 def setUp(self):
183 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
184 self.port = support.bind_port(self.serv)
185
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000186class ThreadSafeCleanupTestCase(unittest.TestCase):
187 """Subclass of unittest.TestCase with thread-safe cleanup methods.
188
189 This subclass protects the addCleanup() and doCleanups() methods
190 with a recursive lock.
191 """
192
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200193 def __init__(self, *args, **kwargs):
194 super().__init__(*args, **kwargs)
195 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000196
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200197 def addCleanup(self, *args, **kwargs):
198 with self._cleanup_lock:
199 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000200
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200201 def doCleanups(self, *args, **kwargs):
202 with self._cleanup_lock:
203 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000204
Charles-François Natali47413c12011-10-06 19:47:44 +0200205class SocketCANTest(unittest.TestCase):
206
207 """To be able to run this test, a `vcan0` CAN interface can be created with
208 the following commands:
209 # modprobe vcan
210 # ip link add dev vcan0 type vcan
211 # ifconfig vcan0 up
212 """
213 interface = 'vcan0'
214 bufsize = 128
215
Charles-François Natali773e42d2013-02-05 19:42:01 +0100216 """The CAN frame structure is defined in <linux/can.h>:
217
218 struct can_frame {
219 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
220 __u8 can_dlc; /* data length code: 0 .. 8 */
221 __u8 data[8] __attribute__((aligned(8)));
222 };
223 """
224 can_frame_fmt = "=IB3x8s"
225 can_frame_size = struct.calcsize(can_frame_fmt)
226
227 """The Broadcast Management Command frame structure is defined
228 in <linux/can/bcm.h>:
229
230 struct bcm_msg_head {
231 __u32 opcode;
232 __u32 flags;
233 __u32 count;
234 struct timeval ival1, ival2;
235 canid_t can_id;
236 __u32 nframes;
237 struct can_frame frames[0];
238 }
239
240 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
241 `struct can_frame` definition). Must use native not standard types for packing.
242 """
243 bcm_cmd_msg_fmt = "@3I4l2I"
244 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
245
Charles-François Natali47413c12011-10-06 19:47:44 +0200246 def setUp(self):
247 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200248 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200249 try:
250 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200251 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200252 self.skipTest('network interface `%s` does not exist' %
253 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200254
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100255
256class SocketRDSTest(unittest.TestCase):
257
258 """To be able to run this test, the `rds` kernel module must be loaded:
259 # modprobe rds
260 """
261 bufsize = 8192
262
263 def setUp(self):
264 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
265 self.addCleanup(self.serv.close)
266 try:
267 self.port = support.bind_port(self.serv)
268 except OSError:
269 self.skipTest('unable to bind RDS socket')
270
271
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000273 """Threadable Test class
274
275 The ThreadableTest class makes it easy to create a threaded
276 client/server pair from an existing unit test. To create a
277 new threaded class from an existing unit test, use multiple
278 inheritance:
279
280 class NewClass (OldClass, ThreadableTest):
281 pass
282
283 This class defines two new fixture functions with obvious
284 purposes for overriding:
285
286 clientSetUp ()
287 clientTearDown ()
288
289 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000290 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000291 '_' to indicate the client portion of the test. Ex:
292
293 def testFoo(self):
294 # Server portion
295
296 def _testFoo(self):
297 # Client portion
298
299 Any exceptions raised by the clients during their tests
300 are caught and transferred to the main thread to alert
301 the testing framework.
302
303 Note, the server setup function cannot call any blocking
304 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000305 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000306 the blocking call (such as in setting up a client/server
307 connection and performing the accept() in setUp().
308 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000309
310 def __init__(self):
311 # Swap the true setup function
312 self.__setUp = self.setUp
313 self.__tearDown = self.tearDown
314 self.setUp = self._setUp
315 self.tearDown = self._tearDown
316
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000317 def serverExplicitReady(self):
318 """This method allows the server to explicitly indicate that
319 it wants the client thread to proceed. This is useful if the
320 server is about to execute a blocking routine that is
321 dependent upon the client thread during its setup routine."""
322 self.server_ready.set()
323
Guido van Rossum24e4af82002-06-12 19:18:08 +0000324 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700325 self.wait_threads = support.wait_threads_exit()
326 self.wait_threads.__enter__()
327
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000328 self.server_ready = threading.Event()
329 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000331 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200332 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000333
334 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000335 methodname = self.id()
336 i = methodname.rfind('.')
337 methodname = methodname[i+1:]
338 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000339 self.client_thread = thread.start_new_thread(
340 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000341
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200342 try:
343 self.__setUp()
344 except:
345 self.server_crashed = True
346 raise
347 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000348 self.server_ready.set()
349 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000350
351 def _tearDown(self):
352 self.__tearDown()
353 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700354 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000355
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000356 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000357 exc = self.queue.get()
358 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359
360 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000361 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100362 try:
363 self.clientSetUp()
364 except BaseException as e:
365 self.queue.put(e)
366 self.clientTearDown()
367 return
368 finally:
369 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200370 if self.server_crashed:
371 self.clientTearDown()
372 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000373 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000374 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375 try:
376 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000377 except BaseException as e:
378 self.queue.put(e)
379 finally:
380 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000381
382 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000383 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384
385 def clientTearDown(self):
386 self.done.set()
387 thread.exit()
388
389class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
390
391 def __init__(self, methodName='runTest'):
392 SocketTCPTest.__init__(self, methodName=methodName)
393 ThreadableTest.__init__(self)
394
395 def clientSetUp(self):
396 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
397
398 def clientTearDown(self):
399 self.cli.close()
400 self.cli = None
401 ThreadableTest.clientTearDown(self)
402
403class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
404
405 def __init__(self, methodName='runTest'):
406 SocketUDPTest.__init__(self, methodName=methodName)
407 ThreadableTest.__init__(self)
408
409 def clientSetUp(self):
410 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
411
Brian Curtin3beb38f2010-11-04 03:41:43 +0000412 def clientTearDown(self):
413 self.cli.close()
414 self.cli = None
415 ThreadableTest.clientTearDown(self)
416
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700417@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
418 'UDPLITE sockets required for this test.')
419class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
420
421 def __init__(self, methodName='runTest'):
422 SocketUDPLITETest.__init__(self, methodName=methodName)
423 ThreadableTest.__init__(self)
424
425 def clientSetUp(self):
426 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
427
428 def clientTearDown(self):
429 self.cli.close()
430 self.cli = None
431 ThreadableTest.clientTearDown(self)
432
Charles-François Natali47413c12011-10-06 19:47:44 +0200433class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
434
435 def __init__(self, methodName='runTest'):
436 SocketCANTest.__init__(self, methodName=methodName)
437 ThreadableTest.__init__(self)
438
439 def clientSetUp(self):
440 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
441 try:
442 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200443 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200444 # skipTest should not be called here, and will be called in the
445 # server instead
446 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200447
448 def clientTearDown(self):
449 self.cli.close()
450 self.cli = None
451 ThreadableTest.clientTearDown(self)
452
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100453class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
454
455 def __init__(self, methodName='runTest'):
456 SocketRDSTest.__init__(self, methodName=methodName)
457 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100458
459 def clientSetUp(self):
460 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
461 try:
462 # RDS sockets must be bound explicitly to send or receive data
463 self.cli.bind((HOST, 0))
464 self.cli_addr = self.cli.getsockname()
465 except OSError:
466 # skipTest should not be called here, and will be called in the
467 # server instead
468 pass
469
470 def clientTearDown(self):
471 self.cli.close()
472 self.cli = None
473 ThreadableTest.clientTearDown(self)
474
caaveryeffc12f2017-09-06 18:18:10 -0400475@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400476@unittest.skipUnless(HAVE_SOCKET_VSOCK,
477 'VSOCK sockets required for this test.')
478@unittest.skipUnless(get_cid() != 2,
479 "This test can only be run on a virtual guest.")
480class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
481
482 def __init__(self, methodName='runTest'):
483 unittest.TestCase.__init__(self, methodName=methodName)
484 ThreadableTest.__init__(self)
485
486 def setUp(self):
487 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
488 self.addCleanup(self.serv.close)
489 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
490 self.serv.listen()
491 self.serverExplicitReady()
492 self.conn, self.connaddr = self.serv.accept()
493 self.addCleanup(self.conn.close)
494
495 def clientSetUp(self):
496 time.sleep(0.1)
497 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
498 self.addCleanup(self.cli.close)
499 cid = get_cid()
500 self.cli.connect((cid, VSOCKPORT))
501
502 def testStream(self):
503 msg = self.conn.recv(1024)
504 self.assertEqual(msg, MSG)
505
506 def _testStream(self):
507 self.cli.send(MSG)
508 self.cli.close()
509
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000511 """Socket tests for client-server connection.
512
513 self.cli_conn is a client socket connected to the server. The
514 setUp() method guarantees that it is connected to the server.
515 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000516
517 def __init__(self, methodName='runTest'):
518 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
519
520 def setUp(self):
521 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000522 # Indicate explicitly we're ready for the client thread to
523 # proceed and then perform the blocking call to accept
524 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525 conn, addr = self.serv.accept()
526 self.cli_conn = conn
527
528 def tearDown(self):
529 self.cli_conn.close()
530 self.cli_conn = None
531 ThreadedTCPSocketTest.tearDown(self)
532
533 def clientSetUp(self):
534 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000535 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536 self.serv_conn = self.cli
537
538 def clientTearDown(self):
539 self.serv_conn.close()
540 self.serv_conn = None
541 ThreadedTCPSocketTest.clientTearDown(self)
542
Dave Cole331708b2004-08-09 04:51:41 +0000543class SocketPairTest(unittest.TestCase, ThreadableTest):
544
545 def __init__(self, methodName='runTest'):
546 unittest.TestCase.__init__(self, methodName=methodName)
547 ThreadableTest.__init__(self)
548
549 def setUp(self):
550 self.serv, self.cli = socket.socketpair()
551
552 def tearDown(self):
553 self.serv.close()
554 self.serv = None
555
556 def clientSetUp(self):
557 pass
558
559 def clientTearDown(self):
560 self.cli.close()
561 self.cli = None
562 ThreadableTest.clientTearDown(self)
563
Tim Peters494aaee2004-08-09 18:54:11 +0000564
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000565# The following classes are used by the sendmsg()/recvmsg() tests.
566# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
567# gives a drop-in replacement for SocketConnectedTest, but different
568# address families can be used, and the attributes serv_addr and
569# cli_addr will be set to the addresses of the endpoints.
570
571class SocketTestBase(unittest.TestCase):
572 """A base class for socket tests.
573
574 Subclasses must provide methods newSocket() to return a new socket
575 and bindSock(sock) to bind it to an unused address.
576
577 Creates a socket self.serv and sets self.serv_addr to its address.
578 """
579
580 def setUp(self):
581 self.serv = self.newSocket()
582 self.bindServer()
583
584 def bindServer(self):
585 """Bind server socket and set self.serv_addr to its address."""
586 self.bindSock(self.serv)
587 self.serv_addr = self.serv.getsockname()
588
589 def tearDown(self):
590 self.serv.close()
591 self.serv = None
592
593
594class SocketListeningTestMixin(SocketTestBase):
595 """Mixin to listen on the server socket."""
596
597 def setUp(self):
598 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100599 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000600
601
602class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
603 ThreadableTest):
604 """Mixin to add client socket and allow client/server tests.
605
606 Client socket is self.cli and its address is self.cli_addr. See
607 ThreadableTest for usage information.
608 """
609
610 def __init__(self, *args, **kwargs):
611 super().__init__(*args, **kwargs)
612 ThreadableTest.__init__(self)
613
614 def clientSetUp(self):
615 self.cli = self.newClientSocket()
616 self.bindClient()
617
618 def newClientSocket(self):
619 """Return a new socket for use as client."""
620 return self.newSocket()
621
622 def bindClient(self):
623 """Bind client socket and set self.cli_addr to its address."""
624 self.bindSock(self.cli)
625 self.cli_addr = self.cli.getsockname()
626
627 def clientTearDown(self):
628 self.cli.close()
629 self.cli = None
630 ThreadableTest.clientTearDown(self)
631
632
633class ConnectedStreamTestMixin(SocketListeningTestMixin,
634 ThreadedSocketTestMixin):
635 """Mixin to allow client/server stream tests with connected client.
636
637 Server's socket representing connection to client is self.cli_conn
638 and client's connection to server is self.serv_conn. (Based on
639 SocketConnectedTest.)
640 """
641
642 def setUp(self):
643 super().setUp()
644 # Indicate explicitly we're ready for the client thread to
645 # proceed and then perform the blocking call to accept
646 self.serverExplicitReady()
647 conn, addr = self.serv.accept()
648 self.cli_conn = conn
649
650 def tearDown(self):
651 self.cli_conn.close()
652 self.cli_conn = None
653 super().tearDown()
654
655 def clientSetUp(self):
656 super().clientSetUp()
657 self.cli.connect(self.serv_addr)
658 self.serv_conn = self.cli
659
660 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100661 try:
662 self.serv_conn.close()
663 self.serv_conn = None
664 except AttributeError:
665 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000666 super().clientTearDown()
667
668
669class UnixSocketTestBase(SocketTestBase):
670 """Base class for Unix-domain socket tests."""
671
672 # This class is used for file descriptor passing tests, so we
673 # create the sockets in a private directory so that other users
674 # can't send anything that might be problematic for a privileged
675 # user running the tests.
676
677 def setUp(self):
678 self.dir_path = tempfile.mkdtemp()
679 self.addCleanup(os.rmdir, self.dir_path)
680 super().setUp()
681
682 def bindSock(self, sock):
683 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100684 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000685 self.addCleanup(support.unlink, path)
686
687class UnixStreamBase(UnixSocketTestBase):
688 """Base class for Unix-domain SOCK_STREAM tests."""
689
690 def newSocket(self):
691 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
692
693
694class InetTestBase(SocketTestBase):
695 """Base class for IPv4 socket tests."""
696
697 host = HOST
698
699 def setUp(self):
700 super().setUp()
701 self.port = self.serv_addr[1]
702
703 def bindSock(self, sock):
704 support.bind_port(sock, host=self.host)
705
706class TCPTestBase(InetTestBase):
707 """Base class for TCP-over-IPv4 tests."""
708
709 def newSocket(self):
710 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
711
712class UDPTestBase(InetTestBase):
713 """Base class for UDP-over-IPv4 tests."""
714
715 def newSocket(self):
716 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
717
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700718class UDPLITETestBase(InetTestBase):
719 """Base class for UDPLITE-over-IPv4 tests."""
720
721 def newSocket(self):
722 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
723
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000724class SCTPStreamBase(InetTestBase):
725 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
726
727 def newSocket(self):
728 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
729 socket.IPPROTO_SCTP)
730
731
732class Inet6TestBase(InetTestBase):
733 """Base class for IPv6 socket tests."""
734
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200735 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000736
737class UDP6TestBase(Inet6TestBase):
738 """Base class for UDP-over-IPv6 tests."""
739
740 def newSocket(self):
741 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
742
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700743class UDPLITE6TestBase(Inet6TestBase):
744 """Base class for UDPLITE-over-IPv6 tests."""
745
746 def newSocket(self):
747 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
748
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000749
750# Test-skipping decorators for use with ThreadableTest.
751
752def skipWithClientIf(condition, reason):
753 """Skip decorated test if condition is true, add client_skip decorator.
754
755 If the decorated object is not a class, sets its attribute
756 "client_skip" to a decorator which will return an empty function
757 if the test is to be skipped, or the original function if it is
758 not. This can be used to avoid running the client part of a
759 skipped test when using ThreadableTest.
760 """
761 def client_pass(*args, **kwargs):
762 pass
763 def skipdec(obj):
764 retval = unittest.skip(reason)(obj)
765 if not isinstance(obj, type):
766 retval.client_skip = lambda f: client_pass
767 return retval
768 def noskipdec(obj):
769 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
770 obj.client_skip = lambda f: f
771 return obj
772 return skipdec if condition else noskipdec
773
774
775def requireAttrs(obj, *attributes):
776 """Skip decorated test if obj is missing any of the given attributes.
777
778 Sets client_skip attribute as skipWithClientIf() does.
779 """
780 missing = [name for name in attributes if not hasattr(obj, name)]
781 return skipWithClientIf(
782 missing, "don't have " + ", ".join(name for name in missing))
783
784
785def requireSocket(*args):
786 """Skip decorated test if a socket cannot be created with given arguments.
787
788 When an argument is given as a string, will use the value of that
789 attribute of the socket module, or skip the test if it doesn't
790 exist. Sets client_skip attribute as skipWithClientIf() does.
791 """
792 err = None
793 missing = [obj for obj in args if
794 isinstance(obj, str) and not hasattr(socket, obj)]
795 if missing:
796 err = "don't have " + ", ".join(name for name in missing)
797 else:
798 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
799 for obj in args]
800 try:
801 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200802 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000803 # XXX: check errno?
804 err = str(e)
805 else:
806 s.close()
807 return skipWithClientIf(
808 err is not None,
809 "can't create socket({0}): {1}".format(
810 ", ".join(str(o) for o in args), err))
811
812
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813#######################################################################
814## Begin Tests
815
816class GeneralModuleTests(unittest.TestCase):
817
Ethan Furman7184bac2014-10-14 18:56:53 -0700818 def test_SocketType_is_socketobject(self):
819 import _socket
820 self.assertTrue(socket.SocketType is _socket.socket)
821 s = socket.socket()
822 self.assertIsInstance(s, socket.SocketType)
823 s.close()
824
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000825 def test_repr(self):
826 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200827 with s:
828 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000829 self.assertIn('family=%s' % socket.AF_INET, repr(s))
830 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200831 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200832 self.assertNotIn('raddr', repr(s))
833 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200834 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200835 self.assertIn(str(s.getsockname()), repr(s))
836 self.assertIn('[closed]', repr(s))
837 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000838
Victor Stinnere254e532014-07-26 14:36:55 +0200839 @unittest.skipUnless(_socket is not None, 'need _socket module')
840 def test_csocket_repr(self):
841 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
842 try:
843 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
844 % (s.fileno(), s.family, s.type, s.proto))
845 self.assertEqual(repr(s), expected)
846 finally:
847 s.close()
848 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
849 % (s.family, s.type, s.proto))
850 self.assertEqual(repr(s), expected)
851
Raymond Hettinger027bb632004-05-31 03:09:25 +0000852 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200853 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
854 p = proxy(s)
855 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000856 s = None
857 try:
858 p.fileno()
859 except ReferenceError:
860 pass
861 else:
862 self.fail('Socket proxy still exists')
863
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000865 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300866 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200867 with self.assertRaises(OSError, msg=msg % 'OSError'):
868 raise OSError
869 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200871 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873
Ezio Melotti63e42302011-05-07 19:47:48 +0300874 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000875 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300876 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
877 self.addCleanup(s.close)
878 s.bind(('', 0))
879 sockname = s.getsockname()
880 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300881 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300882 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300883 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400884 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300885 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300886 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300887 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400888 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300889 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300890 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300891 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300892 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300893 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300894 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300895 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400896 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300897 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300898 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300899 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400900 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300901 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300902 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300903 self.assertIn('not NoneType', str(cm.exception))
904 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300905 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300906 self.assertIn('an integer is required', str(cm.exception))
907 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300908 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300909 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300910 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300911 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300912 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300913 self.assertIn('(1 given)', str(cm.exception))
914 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300915 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300916 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300917
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000919 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100921 if socket.has_ipv6:
922 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923 socket.SOCK_STREAM
924 socket.SOCK_DGRAM
925 socket.SOCK_RAW
926 socket.SOCK_RDM
927 socket.SOCK_SEQPACKET
928 socket.SOL_SOCKET
929 socket.SO_REUSEADDR
930
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100931 def testCrucialIpProtoConstants(self):
932 socket.IPPROTO_TCP
933 socket.IPPROTO_UDP
934 if socket.has_ipv6:
935 socket.IPPROTO_IPV6
936
937 @unittest.skipUnless(os.name == "nt", "Windows specific")
938 def testWindowsSpecificConstants(self):
939 socket.IPPROTO_ICLFXBM
940 socket.IPPROTO_ST
941 socket.IPPROTO_CBT
942 socket.IPPROTO_IGP
943 socket.IPPROTO_RDP
944 socket.IPPROTO_PGM
945 socket.IPPROTO_L2TP
946 socket.IPPROTO_SCTP
947
Guido van Rossum654c11e2002-06-13 20:24:17 +0000948 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000949 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000950 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000951 try:
952 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200953 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000954 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600955 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000956 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000957 try:
958 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200959 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000960 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600961 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000962 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000963 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000964 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000965 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000966
Charles-François Natali0cc86852013-09-13 19:53:08 +0200967 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700968 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200969 self.assertEqual(socket.gethostbyname(addr), addr)
970
971 # we don't test support.HOSTv6 because there's a chance it doesn't have
972 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700973 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200974 self.assertIn(host, socket.gethostbyaddr(host)[2])
975
Xiang Zhangd36a7162017-03-07 11:06:09 +0800976 def test_host_resolution_bad_address(self):
977 # These are all malformed IP addresses and expected not to resolve to
978 # any result. But some ISPs, e.g. AWS, may successfully resolve these
979 # IPs.
980 explanation = (
981 "resolving an invalid IP address did not raise OSError; "
982 "can be caused by a broken DNS server"
983 )
984 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
985 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400986 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800987 socket.gethostbyname(addr)
988 with self.assertRaises(OSError, msg=explanation):
989 socket.gethostbyaddr(addr)
990
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000991 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
992 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
993 def test_sethostname(self):
994 oldhn = socket.gethostname()
995 try:
996 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200997 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000998 if e.errno == errno.EPERM:
999 self.skipTest("test should be run as root")
1000 else:
1001 raise
1002 try:
1003 # running test as root!
1004 self.assertEqual(socket.gethostname(), 'new')
1005 # Should work with bytes objects too
1006 socket.sethostname(b'bar')
1007 self.assertEqual(socket.gethostname(), 'bar')
1008 finally:
1009 socket.sethostname(oldhn)
1010
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001011 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
1012 'socket.if_nameindex() not available.')
1013 def testInterfaceNameIndex(self):
1014 interfaces = socket.if_nameindex()
1015 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001016 self.assertIsInstance(index, int)
1017 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001018 # interface indices are non-zero integers
1019 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001020 _index = socket.if_nametoindex(name)
1021 self.assertIsInstance(_index, int)
1022 self.assertEqual(index, _index)
1023 _name = socket.if_indextoname(index)
1024 self.assertIsInstance(_name, str)
1025 self.assertEqual(name, _name)
1026
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001027 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1028 'socket.if_indextoname() not available.')
1029 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001030 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001031 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001032
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001033 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1034 'socket.if_nametoindex() not available.')
1035 def testInvalidInterfaceNameToIndex(self):
1036 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1037 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1038
Serhiy Storchaka43767632013-11-03 21:31:38 +02001039 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1040 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001041 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001042 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001043 try:
1044 # On some versions, this loses a reference
1045 orig = sys.getrefcount(__name__)
1046 socket.getnameinfo(__name__,0)
1047 except TypeError:
1048 if sys.getrefcount(__name__) != orig:
1049 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001050
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001052 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053 try:
1054 # On some versions, this crashes the interpreter.
1055 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001056 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001058
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001059 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001060 # This just checks that htons etc. are their own inverse,
1061 # when looking at the lower 16 or 32 bits.
1062 sizes = {socket.htonl: 32, socket.ntohl: 32,
1063 socket.htons: 16, socket.ntohs: 16}
1064 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001065 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001066 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1067 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001068
Guido van Rossuma2627af2002-09-14 00:58:46 +00001069 swapped = func(mask)
1070 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001071 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001072
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001073 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001074 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001075 import _testcapi
1076 s_good_values = [0, 1, 2, 0xffff]
1077 l_good_values = s_good_values + [0xffffffff]
1078 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1079 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1080 _testcapi.INT_MAX + 1]
1081 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1082 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001083 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001084 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001085 for k in l_good_values:
1086 socket.ntohl(k)
1087 socket.htonl(k)
1088 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001089 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001090 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001091 for k in l_bad_values:
1092 self.assertRaises(OverflowError, socket.ntohl, k)
1093 self.assertRaises(OverflowError, socket.htonl, k)
1094 for k in s_deprecated_values:
1095 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1096 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001097
Barry Warsaw11b91a02004-06-28 00:50:43 +00001098 def testGetServBy(self):
1099 eq = self.assertEqual
1100 # Find one service that exists, then check all the related interfaces.
1101 # I've ordered this by protocols that have both a tcp and udp
1102 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001103 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001104 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001105 # avoid the 'echo' service on this platform, as there is an
1106 # assumption breaking non-standard port/protocol entry
1107 services = ('daytime', 'qotd', 'domain')
1108 else:
1109 services = ('echo', 'daytime', 'domain')
1110 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001111 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001112 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001113 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001114 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001115 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001116 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001117 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001118 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001119 # Issue #26936: Android getservbyname() was broken before API 23.
1120 if (not hasattr(sys, 'getandroidapilevel') or
1121 sys.getandroidapilevel() >= 23):
1122 port2 = socket.getservbyname(service)
1123 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001124 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001125 try:
1126 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001127 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001128 udpport = None
1129 else:
1130 eq(udpport, port)
1131 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001132 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001133 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001134 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001135 eq(socket.getservbyport(port, 'tcp'), service)
1136 if udpport is not None:
1137 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001138 # Make sure getservbyport does not accept out of range ports.
1139 self.assertRaises(OverflowError, socket.getservbyport, -1)
1140 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001141
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001142 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001143 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001144 # The default timeout should initially be None
1145 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001146 with socket.socket() as s:
1147 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001148
1149 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001150 with socket_setdefaulttimeout(10):
1151 self.assertEqual(socket.getdefaulttimeout(), 10)
1152 with socket.socket() as sock:
1153 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001154
Victor Stinner304315d2018-11-30 13:22:44 +01001155 # Reset the default timeout to None, and see if it propagates
1156 socket.setdefaulttimeout(None)
1157 self.assertEqual(socket.getdefaulttimeout(), None)
1158 with socket.socket() as sock:
1159 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001160
1161 # Check that setting it to an invalid value raises ValueError
1162 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1163
1164 # Check that setting it to an invalid type raises TypeError
1165 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1166
Serhiy Storchaka43767632013-11-03 21:31:38 +02001167 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1168 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001169 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001170 # Test that issue1008086 and issue767150 are fixed.
1171 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001172 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1173 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001174
Serhiy Storchaka43767632013-11-03 21:31:38 +02001175 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1176 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001177 def testIPv4toString(self):
1178 from socket import inet_aton as f, inet_pton, AF_INET
1179 g = lambda a: inet_pton(AF_INET, a)
1180
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001181 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001182 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001183 )
1184
Ezio Melottib3aedd42010-11-20 19:04:17 +00001185 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1186 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1187 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1188 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1189 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001190 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001191 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001192 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001193 assertInvalid(f, '300.0.0.0')
1194 assertInvalid(f, 'a.0.0.0')
1195 assertInvalid(f, '1.2.3.4.5')
1196 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001197
Ezio Melottib3aedd42010-11-20 19:04:17 +00001198 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1199 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1200 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1201 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001202 assertInvalid(g, '0.0.0.')
1203 assertInvalid(g, '300.0.0.0')
1204 assertInvalid(g, 'a.0.0.0')
1205 assertInvalid(g, '1.2.3.4.5')
1206 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001207
Serhiy Storchaka43767632013-11-03 21:31:38 +02001208 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1209 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001210 def testIPv6toString(self):
1211 try:
1212 from socket import inet_pton, AF_INET6, has_ipv6
1213 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001214 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001215 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001216 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001217
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001218 if sys.platform == "win32":
1219 try:
1220 inet_pton(AF_INET6, '::')
1221 except OSError as e:
1222 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001223 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001224
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001225 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001226 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001227 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001228 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001229
Ezio Melottib3aedd42010-11-20 19:04:17 +00001230 self.assertEqual(b'\x00' * 16, f('::'))
1231 self.assertEqual(b'\x00' * 16, f('0::0'))
1232 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1233 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001234 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 +00001235 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1236 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001237 self.assertEqual(
1238 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1239 f('ad42:abc::127:0:254:2')
1240 )
1241 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1242 assertInvalid('0x20::')
1243 assertInvalid(':::')
1244 assertInvalid('::0::')
1245 assertInvalid('1::abc::')
1246 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001247 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001248 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001249 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001250 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001251 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001252 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001253
1254 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1255 f('::254.42.23.64')
1256 )
1257 self.assertEqual(
1258 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1259 f('42::a29b:254.42.23.64')
1260 )
1261 self.assertEqual(
1262 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1263 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1264 )
1265 assertInvalid('255.254.253.252')
1266 assertInvalid('1::260.2.3.0')
1267 assertInvalid('1::0.be.e.0')
1268 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1269 assertInvalid('::1.2.3.4:0')
1270 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001271
Serhiy Storchaka43767632013-11-03 21:31:38 +02001272 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1273 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001274 def testStringToIPv4(self):
1275 from socket import inet_ntoa as f, inet_ntop, AF_INET
1276 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001277 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001278 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001279 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001280
Ezio Melottib3aedd42010-11-20 19:04:17 +00001281 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1282 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1283 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1284 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001285 assertInvalid(f, b'\x00' * 3)
1286 assertInvalid(f, b'\x00' * 5)
1287 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001288 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001289
Ezio Melottib3aedd42010-11-20 19:04:17 +00001290 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1291 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1292 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001293 assertInvalid(g, b'\x00' * 3)
1294 assertInvalid(g, b'\x00' * 5)
1295 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001296 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001297
Serhiy Storchaka43767632013-11-03 21:31:38 +02001298 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1299 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001300 def testStringToIPv6(self):
1301 try:
1302 from socket import inet_ntop, AF_INET6, has_ipv6
1303 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001304 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001305 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001306 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001307
1308 if sys.platform == "win32":
1309 try:
1310 inet_ntop(AF_INET6, b'\x00' * 16)
1311 except OSError as e:
1312 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001313 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001314
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001315 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001316 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001317 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001318 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001319
Ezio Melottib3aedd42010-11-20 19:04:17 +00001320 self.assertEqual('::', f(b'\x00' * 16))
1321 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1322 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001323 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001324 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 +00001325 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001326 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001327
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001328 assertInvalid(b'\x12' * 15)
1329 assertInvalid(b'\x12' * 17)
1330 assertInvalid(b'\x12' * 4)
1331
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001332 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001333
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001334 def testSockName(self):
1335 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001336 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001337 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001338 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001339 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001340 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001341 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1342 # it reasonable to get the host's addr in addition to 0.0.0.0.
1343 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001344 try:
1345 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001346 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001347 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001348 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001349 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001350 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001351
1352 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001353 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001354 # We know a socket should start without reuse==0
1355 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001356 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001357 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001358 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001359
1360 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001361 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001362 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001363 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001364 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1365 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001366 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001367
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001368 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001369 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001370 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1371 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001372 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001373
Martin Panter50ab1a32016-04-11 00:38:12 +00001374 def testCloseException(self):
1375 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001376 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001377 socket.socket(fileno=sock.fileno()).close()
1378 try:
1379 sock.close()
1380 except OSError as err:
1381 # Winsock apparently raises ENOTSOCK
1382 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1383 else:
1384 self.fail("close() should raise EBADF/ENOTSOCK")
1385
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001386 def testNewAttributes(self):
1387 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001388
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001389 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1390 self.assertEqual(sock.family, socket.AF_INET)
1391 if hasattr(socket, 'SOCK_CLOEXEC'):
1392 self.assertIn(sock.type,
1393 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1394 socket.SOCK_STREAM))
1395 else:
1396 self.assertEqual(sock.type, socket.SOCK_STREAM)
1397 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001398
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001399 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001400 sock = socket.socket()
1401 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001402 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001403 big_port = port + 65536
1404 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001405 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1406 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1407 # Since find_unused_port() is inherently subject to race conditions, we
1408 # call it a couple times if necessary.
1409 for i in itertools.count():
1410 port = support.find_unused_port()
1411 try:
1412 sock.bind((HOST, port))
1413 except OSError as e:
1414 if e.errno != errno.EADDRINUSE or i == 5:
1415 raise
1416 else:
1417 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001418
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001419 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001420 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001421 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1422 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1423 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1424 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001425 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1426 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001427 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001428 self.assertRaises(ValueError, s.ioctl, -1, None)
1429 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001430
Steve Dowerea93ac02016-06-17 12:52:18 -07001431 @unittest.skipUnless(os.name == "nt", "Windows specific")
1432 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1433 'Loopback fast path support required for this test')
1434 def test_sio_loopback_fast_path(self):
1435 s = socket.socket()
1436 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001437 try:
1438 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1439 except OSError as exc:
1440 WSAEOPNOTSUPP = 10045
1441 if exc.winerror == WSAEOPNOTSUPP:
1442 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1443 "doesn't implemented in this Windows version")
1444 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001445 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1446
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001447 def testGetaddrinfo(self):
1448 try:
1449 socket.getaddrinfo('localhost', 80)
1450 except socket.gaierror as err:
1451 if err.errno == socket.EAI_SERVICE:
1452 # see http://bugs.python.org/issue1282647
1453 self.skipTest("buggy libc version")
1454 raise
1455 # len of every sequence is supposed to be == 5
1456 for info in socket.getaddrinfo(HOST, None):
1457 self.assertEqual(len(info), 5)
1458 # host can be a domain name, a string representation of an
1459 # IPv4/v6 address or None
1460 socket.getaddrinfo('localhost', 80)
1461 socket.getaddrinfo('127.0.0.1', 80)
1462 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001463 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001464 socket.getaddrinfo('::1', 80)
1465 # port can be a string service name such as "http", a numeric
1466 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001467 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1468 if (not hasattr(sys, 'getandroidapilevel') or
1469 sys.getandroidapilevel() >= 23):
1470 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001471 socket.getaddrinfo(HOST, 80)
1472 socket.getaddrinfo(HOST, None)
1473 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001474 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1475 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001476 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001477 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1478 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001479 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001480 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1481 for _, socktype, _, _, _ in infos:
1482 self.assertEqual(socktype, socket.SOCK_STREAM)
1483 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001484 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001485 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1486 # a server willing to support both IPv4 and IPv6 will
1487 # usually do this
1488 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1489 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001490 # test keyword arguments
1491 a = socket.getaddrinfo(HOST, None)
1492 b = socket.getaddrinfo(host=HOST, port=None)
1493 self.assertEqual(a, b)
1494 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1495 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1496 self.assertEqual(a, b)
1497 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1498 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1499 self.assertEqual(a, b)
1500 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1501 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1502 self.assertEqual(a, b)
1503 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1504 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1505 self.assertEqual(a, b)
1506 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1507 socket.AI_PASSIVE)
1508 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1509 type=socket.SOCK_STREAM, proto=0,
1510 flags=socket.AI_PASSIVE)
1511 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001512 # Issue #6697.
1513 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001514
Ned Deilyb24f4812014-02-13 22:50:42 -08001515 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001516 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001517 try:
1518 # The arguments here are undefined and the call may succeed
1519 # or fail. All we care here is that it doesn't segfault.
1520 socket.getaddrinfo("localhost", None, 0, 0, 0,
1521 socket.AI_NUMERICSERV)
1522 except socket.gaierror:
1523 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001524
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001525 def test_getnameinfo(self):
1526 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001527 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001528
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001529 @unittest.skipUnless(support.is_resource_enabled('network'),
1530 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001531 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001532 # Check for internet access before running test
1533 # (issue #12804, issue #25138).
1534 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001535 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001536
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001537 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001538 domain = 'испытание.pythontest.net'
1539 socket.gethostbyname(domain)
1540 socket.gethostbyname_ex(domain)
1541 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001542 # 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 +00001543 # have a reverse entry yet
1544 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001545
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001546 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001547 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001548 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1549 self.skipTest("signal.alarm and socket.socketpair required for this test")
1550 # Our signal handlers clobber the C errno by calling a math function
1551 # with an invalid domain value.
1552 def ok_handler(*args):
1553 self.assertRaises(ValueError, math.acosh, 0)
1554 def raising_handler(*args):
1555 self.assertRaises(ValueError, math.acosh, 0)
1556 1 // 0
1557 c, s = socket.socketpair()
1558 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1559 try:
1560 if with_timeout:
1561 # Just above the one second minimum for signal.alarm
1562 c.settimeout(1.5)
1563 with self.assertRaises(ZeroDivisionError):
1564 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001565 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001566 if with_timeout:
1567 signal.signal(signal.SIGALRM, ok_handler)
1568 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001569 self.assertRaises(socket.timeout, c.sendall,
1570 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001571 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001572 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001573 signal.signal(signal.SIGALRM, old_alarm)
1574 c.close()
1575 s.close()
1576
1577 def test_sendall_interrupted(self):
1578 self.check_sendall_interrupted(False)
1579
1580 def test_sendall_interrupted_with_timeout(self):
1581 self.check_sendall_interrupted(True)
1582
Antoine Pitroue033e062010-10-29 10:38:18 +00001583 def test_dealloc_warn(self):
1584 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1585 r = repr(sock)
1586 with self.assertWarns(ResourceWarning) as cm:
1587 sock = None
1588 support.gc_collect()
1589 self.assertIn(r, str(cm.warning.args[0]))
1590 # An open socket file object gets dereferenced after the socket
1591 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1592 f = sock.makefile('rb')
1593 r = repr(sock)
1594 sock = None
1595 support.gc_collect()
1596 with self.assertWarns(ResourceWarning):
1597 f = None
1598 support.gc_collect()
1599
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001600 def test_name_closed_socketio(self):
1601 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1602 fp = sock.makefile("rb")
1603 fp.close()
1604 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1605
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001606 def test_unusable_closed_socketio(self):
1607 with socket.socket() as sock:
1608 fp = sock.makefile("rb", buffering=0)
1609 self.assertTrue(fp.readable())
1610 self.assertFalse(fp.writable())
1611 self.assertFalse(fp.seekable())
1612 fp.close()
1613 self.assertRaises(ValueError, fp.readable)
1614 self.assertRaises(ValueError, fp.writable)
1615 self.assertRaises(ValueError, fp.seekable)
1616
Christian Heimesd0e31b92018-01-27 09:54:13 +01001617 def test_socket_close(self):
1618 sock = socket.socket()
1619 try:
1620 sock.bind((HOST, 0))
1621 socket.close(sock.fileno())
1622 with self.assertRaises(OSError):
1623 sock.listen(1)
1624 finally:
1625 with self.assertRaises(OSError):
1626 # sock.close() fails with EBADF
1627 sock.close()
1628 with self.assertRaises(TypeError):
1629 socket.close(None)
1630 with self.assertRaises(OSError):
1631 socket.close(-1)
1632
Berker Peksag3fe64d02016-02-18 17:34:00 +02001633 def test_makefile_mode(self):
1634 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1635 with self.subTest(mode=mode):
1636 with socket.socket() as sock:
1637 with sock.makefile(mode) as fp:
1638 self.assertEqual(fp.mode, mode)
1639
1640 def test_makefile_invalid_mode(self):
1641 for mode in 'rt', 'x', '+', 'a':
1642 with self.subTest(mode=mode):
1643 with socket.socket() as sock:
1644 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1645 sock.makefile(mode)
1646
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001647 def test_pickle(self):
1648 sock = socket.socket()
1649 with sock:
1650 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1651 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001652 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1653 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1654 self.assertEqual(family, socket.AF_INET)
1655 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1656 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001657
Serhiy Storchaka78980432013-01-15 01:12:17 +02001658 def test_listen_backlog(self):
1659 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001660 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1661 srv.bind((HOST, 0))
1662 srv.listen(backlog)
1663
1664 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001665 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001666 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001667
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001668 @support.cpython_only
1669 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001670 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001671 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001672 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1673 srv.bind((HOST, 0))
1674 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001675
Charles-François Natali42663332012-01-02 15:57:30 +01001676 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001677 def test_flowinfo(self):
1678 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001679 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001680 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001681 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001682
Коренберг Марк7766b962018-02-13 00:47:42 +05001683 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1684 def test_getaddrinfo_ipv6_basic(self):
1685 ((*_, sockaddr),) = socket.getaddrinfo(
1686 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1687 1234, socket.AF_INET6,
1688 socket.SOCK_DGRAM,
1689 socket.IPPROTO_UDP
1690 )
1691 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1692
1693 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001694 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001695 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001696 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1697 # Just pick up any network interface (Linux, Mac OS X)
1698 (ifindex, test_interface) = socket.if_nameindex()[0]
1699 ((*_, sockaddr),) = socket.getaddrinfo(
1700 'ff02::1de:c0:face:8D%' + test_interface,
1701 1234, socket.AF_INET6,
1702 socket.SOCK_DGRAM,
1703 socket.IPPROTO_UDP
1704 )
1705 # Note missing interface name part in IPv6 address
1706 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1707
1708 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1709 @unittest.skipUnless(
1710 sys.platform == 'win32',
1711 'Numeric scope id does not work or undocumented')
1712 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1713 # Also works on Linux and Mac OS X, but is not documented (?)
1714 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1715 ifindex = 42
1716 ((*_, sockaddr),) = socket.getaddrinfo(
1717 'ff02::1de:c0:face:8D%' + str(ifindex),
1718 1234, socket.AF_INET6,
1719 socket.SOCK_DGRAM,
1720 socket.IPPROTO_UDP
1721 )
1722 # Note missing interface name part in IPv6 address
1723 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1724
1725 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001726 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001727 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001728 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1729 # Just pick up any network interface.
1730 (ifindex, test_interface) = socket.if_nameindex()[0]
1731 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1732 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1733 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1734
1735 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001736 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001737 'Numeric scope id does not work or undocumented')
1738 def test_getnameinfo_ipv6_scopeid_numeric(self):
1739 # Also works on Linux (undocumented), but does not work on Mac OS X
1740 # Windows and Linux allow nonexistent interface numbers here.
1741 ifindex = 42
1742 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1743 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1744 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1745
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001746 def test_str_for_enums(self):
1747 # Make sure that the AF_* and SOCK_* constants have enum-like string
1748 # reprs.
1749 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1750 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001751 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001752
Yury Selivanov98181422017-12-18 20:02:54 -05001753 def test_socket_consistent_sock_type(self):
1754 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1755 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1756 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1757
1758 with socket.socket(socket.AF_INET, sock_type) as s:
1759 self.assertEqual(s.type, socket.SOCK_STREAM)
1760 s.settimeout(1)
1761 self.assertEqual(s.type, socket.SOCK_STREAM)
1762 s.settimeout(0)
1763 self.assertEqual(s.type, socket.SOCK_STREAM)
1764 s.setblocking(True)
1765 self.assertEqual(s.type, socket.SOCK_STREAM)
1766 s.setblocking(False)
1767 self.assertEqual(s.type, socket.SOCK_STREAM)
1768
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001769 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001770 # Test that when created with a family that's not one of the known
1771 # AF_*/SOCK_* constants, socket.family just returns the number.
1772 #
1773 # To do this we fool socket.socket into believing it already has an
1774 # open fd because on this path it doesn't actually verify the family and
1775 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001776 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1777 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001778 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1779
1780 unknown_type = max(
1781 kind
1782 for name, kind in socket.SocketKind.__members__.items()
1783 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1784 ) + 1
1785
1786 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001787 family=unknown_family, type=unknown_type, proto=23,
1788 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001789 self.assertEqual(s.family, unknown_family)
1790 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001791 # some OS like macOS ignore proto
1792 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001793
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001794 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1795 def test__sendfile_use_sendfile(self):
1796 class File:
1797 def __init__(self, fd):
1798 self.fd = fd
1799
1800 def fileno(self):
1801 return self.fd
1802 with socket.socket() as sock:
1803 fd = os.open(os.curdir, os.O_RDONLY)
1804 os.close(fd)
1805 with self.assertRaises(socket._GiveupOnSendfile):
1806 sock._sendfile_use_sendfile(File(fd))
1807 with self.assertRaises(OverflowError):
1808 sock._sendfile_use_sendfile(File(2**1000))
1809 with self.assertRaises(TypeError):
1810 sock._sendfile_use_sendfile(File(None))
1811
Christian Heimesb6e43af2018-01-29 22:37:58 +01001812 def _test_socket_fileno(self, s, family, stype):
1813 self.assertEqual(s.family, family)
1814 self.assertEqual(s.type, stype)
1815
1816 fd = s.fileno()
1817 s2 = socket.socket(fileno=fd)
1818 self.addCleanup(s2.close)
1819 # detach old fd to avoid double close
1820 s.detach()
1821 self.assertEqual(s2.family, family)
1822 self.assertEqual(s2.type, stype)
1823 self.assertEqual(s2.fileno(), fd)
1824
1825 def test_socket_fileno(self):
1826 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1827 self.addCleanup(s.close)
1828 s.bind((support.HOST, 0))
1829 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1830
1831 if hasattr(socket, "SOCK_DGRAM"):
1832 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1833 self.addCleanup(s.close)
1834 s.bind((support.HOST, 0))
1835 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1836
1837 if support.IPV6_ENABLED:
1838 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1839 self.addCleanup(s.close)
1840 s.bind((support.HOSTv6, 0, 0, 0))
1841 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1842
1843 if hasattr(socket, "AF_UNIX"):
1844 tmpdir = tempfile.mkdtemp()
1845 self.addCleanup(shutil.rmtree, tmpdir)
1846 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1847 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001848 try:
1849 s.bind(os.path.join(tmpdir, 'socket'))
1850 except PermissionError:
1851 pass
1852 else:
1853 self._test_socket_fileno(s, socket.AF_UNIX,
1854 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001855
Dima Tisneke9912702018-12-17 22:07:55 +09001856 def test_socket_fileno_rejects_float(self):
1857 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1858 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1859
1860 def test_socket_fileno_rejects_other_types(self):
1861 with self.assertRaisesRegex(TypeError, "integer is required"):
1862 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1863
1864 def test_socket_fileno_rejects_invalid_socket(self):
1865 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1866 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1867
1868 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1869 def test_socket_fileno_rejects_negative(self):
1870 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1871 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1872
1873 def test_socket_fileno_requires_valid_fd(self):
1874 WSAENOTSOCK = 10038
1875 with self.assertRaises(OSError) as cm:
1876 socket.socket(fileno=support.make_bad_fd())
1877 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1878
1879 with self.assertRaises(OSError) as cm:
1880 socket.socket(
1881 socket.AF_INET,
1882 socket.SOCK_STREAM,
1883 fileno=support.make_bad_fd())
1884 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1885
1886 def test_socket_fileno_requires_socket_fd(self):
1887 with tempfile.NamedTemporaryFile() as afile:
1888 with self.assertRaises(OSError):
1889 socket.socket(fileno=afile.fileno())
1890
1891 with self.assertRaises(OSError) as cm:
1892 socket.socket(
1893 socket.AF_INET,
1894 socket.SOCK_STREAM,
1895 fileno=afile.fileno())
1896 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1897
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001898
Charles-François Natali47413c12011-10-06 19:47:44 +02001899@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1900class BasicCANTest(unittest.TestCase):
1901
1902 def testCrucialConstants(self):
1903 socket.AF_CAN
1904 socket.PF_CAN
1905 socket.CAN_RAW
1906
Charles-François Natali773e42d2013-02-05 19:42:01 +01001907 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1908 'socket.CAN_BCM required for this test.')
1909 def testBCMConstants(self):
1910 socket.CAN_BCM
1911
1912 # opcodes
1913 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1914 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1915 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1916 socket.CAN_BCM_TX_SEND # send one CAN frame
1917 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1918 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1919 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1920 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1921 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1922 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1923 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1924 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1925
karl ding31c4fd22019-07-31 01:47:16 -07001926 # flags
1927 socket.CAN_BCM_SETTIMER
1928 socket.CAN_BCM_STARTTIMER
1929 socket.CAN_BCM_TX_COUNTEVT
1930 socket.CAN_BCM_TX_ANNOUNCE
1931 socket.CAN_BCM_TX_CP_CAN_ID
1932 socket.CAN_BCM_RX_FILTER_ID
1933 socket.CAN_BCM_RX_CHECK_DLC
1934 socket.CAN_BCM_RX_NO_AUTOTIMER
1935 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1936 socket.CAN_BCM_TX_RESET_MULTI_IDX
1937 socket.CAN_BCM_RX_RTR_FRAME
1938
Charles-François Natali47413c12011-10-06 19:47:44 +02001939 def testCreateSocket(self):
1940 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1941 pass
1942
Charles-François Natali773e42d2013-02-05 19:42:01 +01001943 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1944 'socket.CAN_BCM required for this test.')
1945 def testCreateBCMSocket(self):
1946 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1947 pass
1948
Charles-François Natali47413c12011-10-06 19:47:44 +02001949 def testBindAny(self):
1950 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
bggardner954900a2019-09-12 06:02:48 -04001951 address = ('', )
1952 s.bind(address)
1953 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001954
1955 def testTooLongInterfaceName(self):
1956 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1957 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001958 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001959 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001960
1961 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1962 'socket.CAN_RAW_LOOPBACK required for this test.')
1963 def testLoopback(self):
1964 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1965 for loopback in (0, 1):
1966 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1967 loopback)
1968 self.assertEqual(loopback,
1969 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1970
1971 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1972 'socket.CAN_RAW_FILTER required for this test.')
1973 def testFilter(self):
1974 can_id, can_mask = 0x200, 0x700
1975 can_filter = struct.pack("=II", can_id, can_mask)
1976 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1977 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1978 self.assertEqual(can_filter,
1979 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001980 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001981
1982
1983@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001984class CANTest(ThreadedCANSocketTest):
1985
Charles-François Natali47413c12011-10-06 19:47:44 +02001986 def __init__(self, methodName='runTest'):
1987 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1988
1989 @classmethod
1990 def build_can_frame(cls, can_id, data):
1991 """Build a CAN frame."""
1992 can_dlc = len(data)
1993 data = data.ljust(8, b'\x00')
1994 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1995
1996 @classmethod
1997 def dissect_can_frame(cls, frame):
1998 """Dissect a CAN frame."""
1999 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
2000 return (can_id, can_dlc, data[:can_dlc])
2001
2002 def testSendFrame(self):
2003 cf, addr = self.s.recvfrom(self.bufsize)
2004 self.assertEqual(self.cf, cf)
2005 self.assertEqual(addr[0], self.interface)
2006 self.assertEqual(addr[1], socket.AF_CAN)
2007
2008 def _testSendFrame(self):
2009 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2010 self.cli.send(self.cf)
2011
2012 def testSendMaxFrame(self):
2013 cf, addr = self.s.recvfrom(self.bufsize)
2014 self.assertEqual(self.cf, cf)
2015
2016 def _testSendMaxFrame(self):
2017 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2018 self.cli.send(self.cf)
2019
2020 def testSendMultiFrames(self):
2021 cf, addr = self.s.recvfrom(self.bufsize)
2022 self.assertEqual(self.cf1, cf)
2023
2024 cf, addr = self.s.recvfrom(self.bufsize)
2025 self.assertEqual(self.cf2, cf)
2026
2027 def _testSendMultiFrames(self):
2028 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2029 self.cli.send(self.cf1)
2030
2031 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2032 self.cli.send(self.cf2)
2033
Charles-François Natali773e42d2013-02-05 19:42:01 +01002034 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2035 'socket.CAN_BCM required for this test.')
2036 def _testBCM(self):
2037 cf, addr = self.cli.recvfrom(self.bufsize)
2038 self.assertEqual(self.cf, cf)
2039 can_id, can_dlc, data = self.dissect_can_frame(cf)
2040 self.assertEqual(self.can_id, can_id)
2041 self.assertEqual(self.data, data)
2042
2043 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2044 'socket.CAN_BCM required for this test.')
2045 def testBCM(self):
2046 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2047 self.addCleanup(bcm.close)
2048 bcm.connect((self.interface,))
2049 self.can_id = 0x123
2050 self.data = bytes([0xc0, 0xff, 0xee])
2051 self.cf = self.build_can_frame(self.can_id, self.data)
2052 opcode = socket.CAN_BCM_TX_SEND
2053 flags = 0
2054 count = 0
2055 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2056 bcm_can_id = 0x0222
2057 nframes = 1
2058 assert len(self.cf) == 16
2059 header = struct.pack(self.bcm_cmd_msg_fmt,
2060 opcode,
2061 flags,
2062 count,
2063 ival1_seconds,
2064 ival1_usec,
2065 ival2_seconds,
2066 ival2_usec,
2067 bcm_can_id,
2068 nframes,
2069 )
2070 header_plus_frame = header + self.cf
2071 bytes_sent = bcm.send(header_plus_frame)
2072 self.assertEqual(bytes_sent, len(header_plus_frame))
2073
Charles-François Natali47413c12011-10-06 19:47:44 +02002074
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002075@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2076class ISOTPTest(unittest.TestCase):
2077
2078 def __init__(self, *args, **kwargs):
2079 super().__init__(*args, **kwargs)
2080 self.interface = "vcan0"
2081
2082 def testCrucialConstants(self):
2083 socket.AF_CAN
2084 socket.PF_CAN
2085 socket.CAN_ISOTP
2086 socket.SOCK_DGRAM
2087
2088 def testCreateSocket(self):
2089 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2090 pass
2091
2092 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2093 'socket.CAN_ISOTP required for this test.')
2094 def testCreateISOTPSocket(self):
2095 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2096 pass
2097
2098 def testTooLongInterfaceName(self):
2099 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2100 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2101 with self.assertRaisesRegex(OSError, 'interface name too long'):
2102 s.bind(('x' * 1024, 1, 2))
2103
2104 def testBind(self):
2105 try:
2106 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2107 addr = self.interface, 0x123, 0x456
2108 s.bind(addr)
2109 self.assertEqual(s.getsockname(), addr)
2110 except OSError as e:
2111 if e.errno == errno.ENODEV:
2112 self.skipTest('network interface `%s` does not exist' %
2113 self.interface)
2114 else:
2115 raise
2116
2117
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002118@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2119class BasicRDSTest(unittest.TestCase):
2120
2121 def testCrucialConstants(self):
2122 socket.AF_RDS
2123 socket.PF_RDS
2124
2125 def testCreateSocket(self):
2126 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2127 pass
2128
2129 def testSocketBufferSize(self):
2130 bufsize = 16384
2131 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2132 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2133 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2134
2135
2136@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002137class RDSTest(ThreadedRDSSocketTest):
2138
2139 def __init__(self, methodName='runTest'):
2140 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2141
Charles-François Natali240c55f2011-11-10 20:33:36 +01002142 def setUp(self):
2143 super().setUp()
2144 self.evt = threading.Event()
2145
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002146 def testSendAndRecv(self):
2147 data, addr = self.serv.recvfrom(self.bufsize)
2148 self.assertEqual(self.data, data)
2149 self.assertEqual(self.cli_addr, addr)
2150
2151 def _testSendAndRecv(self):
2152 self.data = b'spam'
2153 self.cli.sendto(self.data, 0, (HOST, self.port))
2154
2155 def testPeek(self):
2156 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2157 self.assertEqual(self.data, data)
2158 data, addr = self.serv.recvfrom(self.bufsize)
2159 self.assertEqual(self.data, data)
2160
2161 def _testPeek(self):
2162 self.data = b'spam'
2163 self.cli.sendto(self.data, 0, (HOST, self.port))
2164
2165 @requireAttrs(socket.socket, 'recvmsg')
2166 def testSendAndRecvMsg(self):
2167 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2168 self.assertEqual(self.data, data)
2169
2170 @requireAttrs(socket.socket, 'sendmsg')
2171 def _testSendAndRecvMsg(self):
2172 self.data = b'hello ' * 10
2173 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2174
2175 def testSendAndRecvMulti(self):
2176 data, addr = self.serv.recvfrom(self.bufsize)
2177 self.assertEqual(self.data1, data)
2178
2179 data, addr = self.serv.recvfrom(self.bufsize)
2180 self.assertEqual(self.data2, data)
2181
2182 def _testSendAndRecvMulti(self):
2183 self.data1 = b'bacon'
2184 self.cli.sendto(self.data1, 0, (HOST, self.port))
2185
2186 self.data2 = b'egg'
2187 self.cli.sendto(self.data2, 0, (HOST, self.port))
2188
2189 def testSelect(self):
2190 r, w, x = select.select([self.serv], [], [], 3.0)
2191 self.assertIn(self.serv, r)
2192 data, addr = self.serv.recvfrom(self.bufsize)
2193 self.assertEqual(self.data, data)
2194
2195 def _testSelect(self):
2196 self.data = b'select'
2197 self.cli.sendto(self.data, 0, (HOST, self.port))
2198
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002199@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2200 'QIPCRTR sockets required for this test.')
2201class BasicQIPCRTRTest(unittest.TestCase):
2202
2203 def testCrucialConstants(self):
2204 socket.AF_QIPCRTR
2205
2206 def testCreateSocket(self):
2207 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2208 pass
2209
2210 def testUnbound(self):
2211 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2212 self.assertEqual(s.getsockname()[1], 0)
2213
2214 def testBindSock(self):
2215 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2216 support.bind_port(s, host=s.getsockname()[0])
2217 self.assertNotEqual(s.getsockname()[1], 0)
2218
2219 def testInvalidBindSock(self):
2220 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2221 self.assertRaises(OSError, support.bind_port, s, host=-2)
2222
2223 def testAutoBindSock(self):
2224 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2225 s.connect((123, 123))
2226 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002227
caaveryeffc12f2017-09-06 18:18:10 -04002228@unittest.skipIf(fcntl is None, "need fcntl")
2229@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2230 'VSOCK sockets required for this test.')
2231class BasicVSOCKTest(unittest.TestCase):
2232
2233 def testCrucialConstants(self):
2234 socket.AF_VSOCK
2235
2236 def testVSOCKConstants(self):
2237 socket.SO_VM_SOCKETS_BUFFER_SIZE
2238 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2239 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2240 socket.VMADDR_CID_ANY
2241 socket.VMADDR_PORT_ANY
2242 socket.VMADDR_CID_HOST
2243 socket.VM_SOCKETS_INVALID_VERSION
2244 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2245
2246 def testCreateSocket(self):
2247 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2248 pass
2249
2250 def testSocketBufferSize(self):
2251 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2252 orig_max = s.getsockopt(socket.AF_VSOCK,
2253 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2254 orig = s.getsockopt(socket.AF_VSOCK,
2255 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2256 orig_min = s.getsockopt(socket.AF_VSOCK,
2257 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2258
2259 s.setsockopt(socket.AF_VSOCK,
2260 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2261 s.setsockopt(socket.AF_VSOCK,
2262 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2263 s.setsockopt(socket.AF_VSOCK,
2264 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2265
2266 self.assertEqual(orig_max * 2,
2267 s.getsockopt(socket.AF_VSOCK,
2268 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2269 self.assertEqual(orig * 2,
2270 s.getsockopt(socket.AF_VSOCK,
2271 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2272 self.assertEqual(orig_min * 2,
2273 s.getsockopt(socket.AF_VSOCK,
2274 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2275
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002276
Greg Bowser8fbece12019-08-02 16:29:52 -04002277@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2278 'Bluetooth sockets required for this test.')
2279class BasicBluetoothTest(unittest.TestCase):
2280
2281 def testBluetoothConstants(self):
2282 socket.BDADDR_ANY
2283 socket.BDADDR_LOCAL
2284 socket.AF_BLUETOOTH
2285 socket.BTPROTO_RFCOMM
2286
2287 if sys.platform != "win32":
2288 socket.BTPROTO_HCI
2289 socket.SOL_HCI
2290 socket.BTPROTO_L2CAP
2291
2292 if not sys.platform.startswith("freebsd"):
2293 socket.BTPROTO_SCO
2294
2295 def testCreateRfcommSocket(self):
2296 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2297 pass
2298
2299 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2300 def testCreateL2capSocket(self):
2301 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2302 pass
2303
2304 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2305 def testCreateHciSocket(self):
2306 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2307 pass
2308
2309 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2310 "windows and freebsd do not support SCO sockets")
2311 def testCreateScoSocket(self):
2312 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2313 pass
2314
2315
Guido van Rossum24e4af82002-06-12 19:18:08 +00002316class BasicTCPTest(SocketConnectedTest):
2317
2318 def __init__(self, methodName='runTest'):
2319 SocketConnectedTest.__init__(self, methodName=methodName)
2320
2321 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002322 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002323 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002324 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002325
2326 def _testRecv(self):
2327 self.serv_conn.send(MSG)
2328
2329 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002330 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002331 seg1 = self.cli_conn.recv(len(MSG) - 3)
2332 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002333 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002334 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002335
2336 def _testOverFlowRecv(self):
2337 self.serv_conn.send(MSG)
2338
2339 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002340 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002341 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002342 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002343
2344 def _testRecvFrom(self):
2345 self.serv_conn.send(MSG)
2346
2347 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002348 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002349 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2350 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002351 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002352 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002353
2354 def _testOverFlowRecvFrom(self):
2355 self.serv_conn.send(MSG)
2356
2357 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002358 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002359 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002360 while 1:
2361 read = self.cli_conn.recv(1024)
2362 if not read:
2363 break
Guido van Rossume531e292002-08-08 20:28:34 +00002364 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002365 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002366
2367 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002368 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002369 self.serv_conn.sendall(big_chunk)
2370
2371 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002372 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002373 fd = self.cli_conn.fileno()
2374 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002375 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002376 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002377 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002378 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002379
2380 def _testFromFd(self):
2381 self.serv_conn.send(MSG)
2382
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002383 def testDup(self):
2384 # Testing dup()
2385 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002386 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002387 msg = sock.recv(1024)
2388 self.assertEqual(msg, MSG)
2389
2390 def _testDup(self):
2391 self.serv_conn.send(MSG)
2392
Guido van Rossum24e4af82002-06-12 19:18:08 +00002393 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002394 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002395 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002396 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002397 # wait for _testShutdown to finish: on OS X, when the server
2398 # closes the connection the client also becomes disconnected,
2399 # and the client's shutdown call will fail. (Issue #4397.)
2400 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002401
2402 def _testShutdown(self):
2403 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002404 self.serv_conn.shutdown(2)
2405
2406 testShutdown_overflow = support.cpython_only(testShutdown)
2407
2408 @support.cpython_only
2409 def _testShutdown_overflow(self):
2410 import _testcapi
2411 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002412 # Issue 15989
2413 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2414 _testcapi.INT_MAX + 1)
2415 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2416 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002417 self.serv_conn.shutdown(2)
2418
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002419 def testDetach(self):
2420 # Testing detach()
2421 fileno = self.cli_conn.fileno()
2422 f = self.cli_conn.detach()
2423 self.assertEqual(f, fileno)
2424 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002425 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002426 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002427 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002428 # ...but we can create another socket using the (still open)
2429 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002430 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002431 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002432 msg = sock.recv(1024)
2433 self.assertEqual(msg, MSG)
2434
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002435 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002436 self.serv_conn.send(MSG)
2437
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002438
Guido van Rossum24e4af82002-06-12 19:18:08 +00002439class BasicUDPTest(ThreadedUDPSocketTest):
2440
2441 def __init__(self, methodName='runTest'):
2442 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2443
2444 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002445 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002446 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002447 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002448
2449 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002450 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002451
Guido van Rossum1c938012002-06-12 21:17:20 +00002452 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002453 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002454 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002455 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002456
Guido van Rossum1c938012002-06-12 21:17:20 +00002457 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002458 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002459
Guido van Rossumd8faa362007-04-27 19:54:29 +00002460 def testRecvFromNegative(self):
2461 # Negative lengths passed to recvfrom should give ValueError.
2462 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2463
2464 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002465 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002466
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002467
2468@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2469 'UDPLITE sockets required for this test.')
2470class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2471
2472 def __init__(self, methodName='runTest'):
2473 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2474
2475 def testSendtoAndRecv(self):
2476 # Testing sendto() and Recv() over UDPLITE
2477 msg = self.serv.recv(len(MSG))
2478 self.assertEqual(msg, MSG)
2479
2480 def _testSendtoAndRecv(self):
2481 self.cli.sendto(MSG, 0, (HOST, self.port))
2482
2483 def testRecvFrom(self):
2484 # Testing recvfrom() over UDPLITE
2485 msg, addr = self.serv.recvfrom(len(MSG))
2486 self.assertEqual(msg, MSG)
2487
2488 def _testRecvFrom(self):
2489 self.cli.sendto(MSG, 0, (HOST, self.port))
2490
2491 def testRecvFromNegative(self):
2492 # Negative lengths passed to recvfrom should give ValueError.
2493 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2494
2495 def _testRecvFromNegative(self):
2496 self.cli.sendto(MSG, 0, (HOST, self.port))
2497
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002498# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2499# same test code is used with different families and types of socket
2500# (e.g. stream, datagram), and tests using recvmsg() are repeated
2501# using recvmsg_into().
2502#
2503# The generic test classes such as SendmsgTests and
2504# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2505# supplied with sockets cli_sock and serv_sock representing the
2506# client's and the server's end of the connection respectively, and
2507# attributes cli_addr and serv_addr holding their (numeric where
2508# appropriate) addresses.
2509#
2510# The final concrete test classes combine these with subclasses of
2511# SocketTestBase which set up client and server sockets of a specific
2512# type, and with subclasses of SendrecvmsgBase such as
2513# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2514# sockets to cli_sock and serv_sock and override the methods and
2515# attributes of SendrecvmsgBase to fill in destination addresses if
2516# needed when sending, check for specific flags in msg_flags, etc.
2517#
2518# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2519# recvmsg_into().
2520
2521# XXX: like the other datagram (UDP) tests in this module, the code
2522# here assumes that datagram delivery on the local machine will be
2523# reliable.
2524
2525class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2526 # Base class for sendmsg()/recvmsg() tests.
2527
2528 # Time in seconds to wait before considering a test failed, or
2529 # None for no timeout. Not all tests actually set a timeout.
2530 fail_timeout = 3.0
2531
2532 def setUp(self):
2533 self.misc_event = threading.Event()
2534 super().setUp()
2535
2536 def sendToServer(self, msg):
2537 # Send msg to the server.
2538 return self.cli_sock.send(msg)
2539
2540 # Tuple of alternative default arguments for sendmsg() when called
2541 # via sendmsgToServer() (e.g. to include a destination address).
2542 sendmsg_to_server_defaults = ()
2543
2544 def sendmsgToServer(self, *args):
2545 # Call sendmsg() on self.cli_sock with the given arguments,
2546 # filling in any arguments which are not supplied with the
2547 # corresponding items of self.sendmsg_to_server_defaults, if
2548 # any.
2549 return self.cli_sock.sendmsg(
2550 *(args + self.sendmsg_to_server_defaults[len(args):]))
2551
2552 def doRecvmsg(self, sock, bufsize, *args):
2553 # Call recvmsg() on sock with given arguments and return its
2554 # result. Should be used for tests which can use either
2555 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2556 # this method with one which emulates it using recvmsg_into(),
2557 # thus allowing the same test to be used for both methods.
2558 result = sock.recvmsg(bufsize, *args)
2559 self.registerRecvmsgResult(result)
2560 return result
2561
2562 def registerRecvmsgResult(self, result):
2563 # Called by doRecvmsg() with the return value of recvmsg() or
2564 # recvmsg_into(). Can be overridden to arrange cleanup based
2565 # on the returned ancillary data, for instance.
2566 pass
2567
2568 def checkRecvmsgAddress(self, addr1, addr2):
2569 # Called to compare the received address with the address of
2570 # the peer.
2571 self.assertEqual(addr1, addr2)
2572
2573 # Flags that are normally unset in msg_flags
2574 msg_flags_common_unset = 0
2575 for name in ("MSG_CTRUNC", "MSG_OOB"):
2576 msg_flags_common_unset |= getattr(socket, name, 0)
2577
2578 # Flags that are normally set
2579 msg_flags_common_set = 0
2580
2581 # Flags set when a complete record has been received (e.g. MSG_EOR
2582 # for SCTP)
2583 msg_flags_eor_indicator = 0
2584
2585 # Flags set when a complete record has not been received
2586 # (e.g. MSG_TRUNC for datagram sockets)
2587 msg_flags_non_eor_indicator = 0
2588
2589 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2590 # Method to check the value of msg_flags returned by recvmsg[_into]().
2591 #
2592 # Checks that all bits in msg_flags_common_set attribute are
2593 # set in "flags" and all bits in msg_flags_common_unset are
2594 # unset.
2595 #
2596 # The "eor" argument specifies whether the flags should
2597 # indicate that a full record (or datagram) has been received.
2598 # If "eor" is None, no checks are done; otherwise, checks
2599 # that:
2600 #
2601 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2602 # set and all bits in msg_flags_non_eor_indicator are unset
2603 #
2604 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2605 # are set and all bits in msg_flags_eor_indicator are unset
2606 #
2607 # If "checkset" and/or "checkunset" are supplied, they require
2608 # the given bits to be set or unset respectively, overriding
2609 # what the attributes require for those bits.
2610 #
2611 # If any bits are set in "ignore", they will not be checked,
2612 # regardless of the other inputs.
2613 #
2614 # Will raise Exception if the inputs require a bit to be both
2615 # set and unset, and it is not ignored.
2616
2617 defaultset = self.msg_flags_common_set
2618 defaultunset = self.msg_flags_common_unset
2619
2620 if eor:
2621 defaultset |= self.msg_flags_eor_indicator
2622 defaultunset |= self.msg_flags_non_eor_indicator
2623 elif eor is not None:
2624 defaultset |= self.msg_flags_non_eor_indicator
2625 defaultunset |= self.msg_flags_eor_indicator
2626
2627 # Function arguments override defaults
2628 defaultset &= ~checkunset
2629 defaultunset &= ~checkset
2630
2631 # Merge arguments with remaining defaults, and check for conflicts
2632 checkset |= defaultset
2633 checkunset |= defaultunset
2634 inboth = checkset & checkunset & ~ignore
2635 if inboth:
2636 raise Exception("contradictory set, unset requirements for flags "
2637 "{0:#x}".format(inboth))
2638
2639 # Compare with given msg_flags value
2640 mask = (checkset | checkunset) & ~ignore
2641 self.assertEqual(flags & mask, checkset & mask)
2642
2643
2644class RecvmsgIntoMixin(SendrecvmsgBase):
2645 # Mixin to implement doRecvmsg() using recvmsg_into().
2646
2647 def doRecvmsg(self, sock, bufsize, *args):
2648 buf = bytearray(bufsize)
2649 result = sock.recvmsg_into([buf], *args)
2650 self.registerRecvmsgResult(result)
2651 self.assertGreaterEqual(result[0], 0)
2652 self.assertLessEqual(result[0], bufsize)
2653 return (bytes(buf[:result[0]]),) + result[1:]
2654
2655
2656class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2657 # Defines flags to be checked in msg_flags for datagram sockets.
2658
2659 @property
2660 def msg_flags_non_eor_indicator(self):
2661 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2662
2663
2664class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2665 # Defines flags to be checked in msg_flags for SCTP sockets.
2666
2667 @property
2668 def msg_flags_eor_indicator(self):
2669 return super().msg_flags_eor_indicator | socket.MSG_EOR
2670
2671
2672class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2673 # Base class for tests on connectionless-mode sockets. Users must
2674 # supply sockets on attributes cli and serv to be mapped to
2675 # cli_sock and serv_sock respectively.
2676
2677 @property
2678 def serv_sock(self):
2679 return self.serv
2680
2681 @property
2682 def cli_sock(self):
2683 return self.cli
2684
2685 @property
2686 def sendmsg_to_server_defaults(self):
2687 return ([], [], 0, self.serv_addr)
2688
2689 def sendToServer(self, msg):
2690 return self.cli_sock.sendto(msg, self.serv_addr)
2691
2692
2693class SendrecvmsgConnectedBase(SendrecvmsgBase):
2694 # Base class for tests on connected sockets. Users must supply
2695 # sockets on attributes serv_conn and cli_conn (representing the
2696 # connections *to* the server and the client), to be mapped to
2697 # cli_sock and serv_sock respectively.
2698
2699 @property
2700 def serv_sock(self):
2701 return self.cli_conn
2702
2703 @property
2704 def cli_sock(self):
2705 return self.serv_conn
2706
2707 def checkRecvmsgAddress(self, addr1, addr2):
2708 # Address is currently "unspecified" for a connected socket,
2709 # so we don't examine it
2710 pass
2711
2712
2713class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2714 # Base class to set a timeout on server's socket.
2715
2716 def setUp(self):
2717 super().setUp()
2718 self.serv_sock.settimeout(self.fail_timeout)
2719
2720
2721class SendmsgTests(SendrecvmsgServerTimeoutBase):
2722 # Tests for sendmsg() which can use any socket type and do not
2723 # involve recvmsg() or recvmsg_into().
2724
2725 def testSendmsg(self):
2726 # Send a simple message with sendmsg().
2727 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2728
2729 def _testSendmsg(self):
2730 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2731
2732 def testSendmsgDataGenerator(self):
2733 # Send from buffer obtained from a generator (not a sequence).
2734 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2735
2736 def _testSendmsgDataGenerator(self):
2737 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2738 len(MSG))
2739
2740 def testSendmsgAncillaryGenerator(self):
2741 # Gather (empty) ancillary data from a generator.
2742 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2743
2744 def _testSendmsgAncillaryGenerator(self):
2745 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2746 len(MSG))
2747
2748 def testSendmsgArray(self):
2749 # Send data from an array instead of the usual bytes object.
2750 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2751
2752 def _testSendmsgArray(self):
2753 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2754 len(MSG))
2755
2756 def testSendmsgGather(self):
2757 # Send message data from more than one buffer (gather write).
2758 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2759
2760 def _testSendmsgGather(self):
2761 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2762
2763 def testSendmsgBadArgs(self):
2764 # Check that sendmsg() rejects invalid arguments.
2765 self.assertEqual(self.serv_sock.recv(1000), b"done")
2766
2767 def _testSendmsgBadArgs(self):
2768 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2769 self.assertRaises(TypeError, self.sendmsgToServer,
2770 b"not in an iterable")
2771 self.assertRaises(TypeError, self.sendmsgToServer,
2772 object())
2773 self.assertRaises(TypeError, self.sendmsgToServer,
2774 [object()])
2775 self.assertRaises(TypeError, self.sendmsgToServer,
2776 [MSG, object()])
2777 self.assertRaises(TypeError, self.sendmsgToServer,
2778 [MSG], object())
2779 self.assertRaises(TypeError, self.sendmsgToServer,
2780 [MSG], [], object())
2781 self.assertRaises(TypeError, self.sendmsgToServer,
2782 [MSG], [], 0, object())
2783 self.sendToServer(b"done")
2784
2785 def testSendmsgBadCmsg(self):
2786 # Check that invalid ancillary data items are rejected.
2787 self.assertEqual(self.serv_sock.recv(1000), b"done")
2788
2789 def _testSendmsgBadCmsg(self):
2790 self.assertRaises(TypeError, self.sendmsgToServer,
2791 [MSG], [object()])
2792 self.assertRaises(TypeError, self.sendmsgToServer,
2793 [MSG], [(object(), 0, b"data")])
2794 self.assertRaises(TypeError, self.sendmsgToServer,
2795 [MSG], [(0, object(), b"data")])
2796 self.assertRaises(TypeError, self.sendmsgToServer,
2797 [MSG], [(0, 0, object())])
2798 self.assertRaises(TypeError, self.sendmsgToServer,
2799 [MSG], [(0, 0)])
2800 self.assertRaises(TypeError, self.sendmsgToServer,
2801 [MSG], [(0, 0, b"data", 42)])
2802 self.sendToServer(b"done")
2803
2804 @requireAttrs(socket, "CMSG_SPACE")
2805 def testSendmsgBadMultiCmsg(self):
2806 # Check that invalid ancillary data items are rejected when
2807 # more than one item is present.
2808 self.assertEqual(self.serv_sock.recv(1000), b"done")
2809
2810 @testSendmsgBadMultiCmsg.client_skip
2811 def _testSendmsgBadMultiCmsg(self):
2812 self.assertRaises(TypeError, self.sendmsgToServer,
2813 [MSG], [0, 0, b""])
2814 self.assertRaises(TypeError, self.sendmsgToServer,
2815 [MSG], [(0, 0, b""), object()])
2816 self.sendToServer(b"done")
2817
2818 def testSendmsgExcessCmsgReject(self):
2819 # Check that sendmsg() rejects excess ancillary data items
2820 # when the number that can be sent is limited.
2821 self.assertEqual(self.serv_sock.recv(1000), b"done")
2822
2823 def _testSendmsgExcessCmsgReject(self):
2824 if not hasattr(socket, "CMSG_SPACE"):
2825 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002826 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002827 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2828 self.assertIsNone(cm.exception.errno)
2829 self.sendToServer(b"done")
2830
2831 def testSendmsgAfterClose(self):
2832 # Check that sendmsg() fails on a closed socket.
2833 pass
2834
2835 def _testSendmsgAfterClose(self):
2836 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002837 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002838
2839
2840class SendmsgStreamTests(SendmsgTests):
2841 # Tests for sendmsg() which require a stream socket and do not
2842 # involve recvmsg() or recvmsg_into().
2843
2844 def testSendmsgExplicitNoneAddr(self):
2845 # Check that peer address can be specified as None.
2846 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2847
2848 def _testSendmsgExplicitNoneAddr(self):
2849 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2850
2851 def testSendmsgTimeout(self):
2852 # Check that timeout works with sendmsg().
2853 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2854 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2855
2856 def _testSendmsgTimeout(self):
2857 try:
2858 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002859 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002860 while True:
2861 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002862 except socket.timeout:
2863 pass
2864 except OSError as exc:
2865 if exc.errno != errno.ENOMEM:
2866 raise
2867 # bpo-33937 the test randomly fails on Travis CI with
2868 # "OSError: [Errno 12] Cannot allocate memory"
2869 else:
2870 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002871 finally:
2872 self.misc_event.set()
2873
2874 # XXX: would be nice to have more tests for sendmsg flags argument.
2875
2876 # Linux supports MSG_DONTWAIT when sending, but in general, it
2877 # only works when receiving. Could add other platforms if they
2878 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002879 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002880 "MSG_DONTWAIT not known to work on this platform when "
2881 "sending")
2882 def testSendmsgDontWait(self):
2883 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2884 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2885 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2886
2887 @testSendmsgDontWait.client_skip
2888 def _testSendmsgDontWait(self):
2889 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002890 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002891 while True:
2892 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002893 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2894 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002895 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002896 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002897 finally:
2898 self.misc_event.set()
2899
2900
2901class SendmsgConnectionlessTests(SendmsgTests):
2902 # Tests for sendmsg() which require a connectionless-mode
2903 # (e.g. datagram) socket, and do not involve recvmsg() or
2904 # recvmsg_into().
2905
2906 def testSendmsgNoDestAddr(self):
2907 # Check that sendmsg() fails when no destination address is
2908 # given for unconnected socket.
2909 pass
2910
2911 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002912 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002913 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002914 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002915 [MSG], [], 0, None)
2916
2917
2918class RecvmsgGenericTests(SendrecvmsgBase):
2919 # Tests for recvmsg() which can also be emulated using
2920 # recvmsg_into(), and can use any socket type.
2921
2922 def testRecvmsg(self):
2923 # Receive a simple message with recvmsg[_into]().
2924 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2925 self.assertEqual(msg, MSG)
2926 self.checkRecvmsgAddress(addr, self.cli_addr)
2927 self.assertEqual(ancdata, [])
2928 self.checkFlags(flags, eor=True)
2929
2930 def _testRecvmsg(self):
2931 self.sendToServer(MSG)
2932
2933 def testRecvmsgExplicitDefaults(self):
2934 # Test recvmsg[_into]() with default arguments provided explicitly.
2935 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2936 len(MSG), 0, 0)
2937 self.assertEqual(msg, MSG)
2938 self.checkRecvmsgAddress(addr, self.cli_addr)
2939 self.assertEqual(ancdata, [])
2940 self.checkFlags(flags, eor=True)
2941
2942 def _testRecvmsgExplicitDefaults(self):
2943 self.sendToServer(MSG)
2944
2945 def testRecvmsgShorter(self):
2946 # Receive a message smaller than buffer.
2947 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2948 len(MSG) + 42)
2949 self.assertEqual(msg, MSG)
2950 self.checkRecvmsgAddress(addr, self.cli_addr)
2951 self.assertEqual(ancdata, [])
2952 self.checkFlags(flags, eor=True)
2953
2954 def _testRecvmsgShorter(self):
2955 self.sendToServer(MSG)
2956
2957 def testRecvmsgTrunc(self):
2958 # Receive part of message, check for truncation indicators.
2959 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2960 len(MSG) - 3)
2961 self.assertEqual(msg, MSG[:-3])
2962 self.checkRecvmsgAddress(addr, self.cli_addr)
2963 self.assertEqual(ancdata, [])
2964 self.checkFlags(flags, eor=False)
2965
2966 def _testRecvmsgTrunc(self):
2967 self.sendToServer(MSG)
2968
2969 def testRecvmsgShortAncillaryBuf(self):
2970 # Test ancillary data buffer too small to hold any ancillary data.
2971 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2972 len(MSG), 1)
2973 self.assertEqual(msg, MSG)
2974 self.checkRecvmsgAddress(addr, self.cli_addr)
2975 self.assertEqual(ancdata, [])
2976 self.checkFlags(flags, eor=True)
2977
2978 def _testRecvmsgShortAncillaryBuf(self):
2979 self.sendToServer(MSG)
2980
2981 def testRecvmsgLongAncillaryBuf(self):
2982 # Test large ancillary data buffer.
2983 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2984 len(MSG), 10240)
2985 self.assertEqual(msg, MSG)
2986 self.checkRecvmsgAddress(addr, self.cli_addr)
2987 self.assertEqual(ancdata, [])
2988 self.checkFlags(flags, eor=True)
2989
2990 def _testRecvmsgLongAncillaryBuf(self):
2991 self.sendToServer(MSG)
2992
2993 def testRecvmsgAfterClose(self):
2994 # Check that recvmsg[_into]() fails on a closed socket.
2995 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002996 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002997
2998 def _testRecvmsgAfterClose(self):
2999 pass
3000
3001 def testRecvmsgTimeout(self):
3002 # Check that timeout works.
3003 try:
3004 self.serv_sock.settimeout(0.03)
3005 self.assertRaises(socket.timeout,
3006 self.doRecvmsg, self.serv_sock, len(MSG))
3007 finally:
3008 self.misc_event.set()
3009
3010 def _testRecvmsgTimeout(self):
3011 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3012
3013 @requireAttrs(socket, "MSG_PEEK")
3014 def testRecvmsgPeek(self):
3015 # Check that MSG_PEEK in flags enables examination of pending
3016 # data without consuming it.
3017
3018 # Receive part of data with MSG_PEEK.
3019 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3020 len(MSG) - 3, 0,
3021 socket.MSG_PEEK)
3022 self.assertEqual(msg, MSG[:-3])
3023 self.checkRecvmsgAddress(addr, self.cli_addr)
3024 self.assertEqual(ancdata, [])
3025 # Ignoring MSG_TRUNC here (so this test is the same for stream
3026 # and datagram sockets). Some wording in POSIX seems to
3027 # suggest that it needn't be set when peeking, but that may
3028 # just be a slip.
3029 self.checkFlags(flags, eor=False,
3030 ignore=getattr(socket, "MSG_TRUNC", 0))
3031
3032 # Receive all data with MSG_PEEK.
3033 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3034 len(MSG), 0,
3035 socket.MSG_PEEK)
3036 self.assertEqual(msg, MSG)
3037 self.checkRecvmsgAddress(addr, self.cli_addr)
3038 self.assertEqual(ancdata, [])
3039 self.checkFlags(flags, eor=True)
3040
3041 # Check that the same data can still be received normally.
3042 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3043 self.assertEqual(msg, MSG)
3044 self.checkRecvmsgAddress(addr, self.cli_addr)
3045 self.assertEqual(ancdata, [])
3046 self.checkFlags(flags, eor=True)
3047
3048 @testRecvmsgPeek.client_skip
3049 def _testRecvmsgPeek(self):
3050 self.sendToServer(MSG)
3051
3052 @requireAttrs(socket.socket, "sendmsg")
3053 def testRecvmsgFromSendmsg(self):
3054 # Test receiving with recvmsg[_into]() when message is sent
3055 # using sendmsg().
3056 self.serv_sock.settimeout(self.fail_timeout)
3057 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3058 self.assertEqual(msg, MSG)
3059 self.checkRecvmsgAddress(addr, self.cli_addr)
3060 self.assertEqual(ancdata, [])
3061 self.checkFlags(flags, eor=True)
3062
3063 @testRecvmsgFromSendmsg.client_skip
3064 def _testRecvmsgFromSendmsg(self):
3065 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3066
3067
3068class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3069 # Tests which require a stream socket and can use either recvmsg()
3070 # or recvmsg_into().
3071
3072 def testRecvmsgEOF(self):
3073 # Receive end-of-stream indicator (b"", peer socket closed).
3074 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3075 self.assertEqual(msg, b"")
3076 self.checkRecvmsgAddress(addr, self.cli_addr)
3077 self.assertEqual(ancdata, [])
3078 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3079
3080 def _testRecvmsgEOF(self):
3081 self.cli_sock.close()
3082
3083 def testRecvmsgOverflow(self):
3084 # Receive a message in more than one chunk.
3085 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3086 len(MSG) - 3)
3087 self.checkRecvmsgAddress(addr, self.cli_addr)
3088 self.assertEqual(ancdata, [])
3089 self.checkFlags(flags, eor=False)
3090
3091 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3092 self.checkRecvmsgAddress(addr, self.cli_addr)
3093 self.assertEqual(ancdata, [])
3094 self.checkFlags(flags, eor=True)
3095
3096 msg = seg1 + seg2
3097 self.assertEqual(msg, MSG)
3098
3099 def _testRecvmsgOverflow(self):
3100 self.sendToServer(MSG)
3101
3102
3103class RecvmsgTests(RecvmsgGenericTests):
3104 # Tests for recvmsg() which can use any socket type.
3105
3106 def testRecvmsgBadArgs(self):
3107 # Check that recvmsg() rejects invalid arguments.
3108 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3109 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3110 -1, 0, 0)
3111 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3112 len(MSG), -1, 0)
3113 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3114 [bytearray(10)], 0, 0)
3115 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3116 object(), 0, 0)
3117 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3118 len(MSG), object(), 0)
3119 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3120 len(MSG), 0, object())
3121
3122 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3123 self.assertEqual(msg, MSG)
3124 self.checkRecvmsgAddress(addr, self.cli_addr)
3125 self.assertEqual(ancdata, [])
3126 self.checkFlags(flags, eor=True)
3127
3128 def _testRecvmsgBadArgs(self):
3129 self.sendToServer(MSG)
3130
3131
3132class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3133 # Tests for recvmsg_into() which can use any socket type.
3134
3135 def testRecvmsgIntoBadArgs(self):
3136 # Check that recvmsg_into() rejects invalid arguments.
3137 buf = bytearray(len(MSG))
3138 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3139 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3140 len(MSG), 0, 0)
3141 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3142 buf, 0, 0)
3143 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3144 [object()], 0, 0)
3145 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3146 [b"I'm not writable"], 0, 0)
3147 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3148 [buf, object()], 0, 0)
3149 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3150 [buf], -1, 0)
3151 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3152 [buf], object(), 0)
3153 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3154 [buf], 0, object())
3155
3156 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3157 self.assertEqual(nbytes, len(MSG))
3158 self.assertEqual(buf, bytearray(MSG))
3159 self.checkRecvmsgAddress(addr, self.cli_addr)
3160 self.assertEqual(ancdata, [])
3161 self.checkFlags(flags, eor=True)
3162
3163 def _testRecvmsgIntoBadArgs(self):
3164 self.sendToServer(MSG)
3165
3166 def testRecvmsgIntoGenerator(self):
3167 # Receive into buffer obtained from a generator (not a sequence).
3168 buf = bytearray(len(MSG))
3169 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3170 (o for o in [buf]))
3171 self.assertEqual(nbytes, len(MSG))
3172 self.assertEqual(buf, bytearray(MSG))
3173 self.checkRecvmsgAddress(addr, self.cli_addr)
3174 self.assertEqual(ancdata, [])
3175 self.checkFlags(flags, eor=True)
3176
3177 def _testRecvmsgIntoGenerator(self):
3178 self.sendToServer(MSG)
3179
3180 def testRecvmsgIntoArray(self):
3181 # Receive into an array rather than the usual bytearray.
3182 buf = array.array("B", [0] * len(MSG))
3183 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3184 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003185 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003186 self.checkRecvmsgAddress(addr, self.cli_addr)
3187 self.assertEqual(ancdata, [])
3188 self.checkFlags(flags, eor=True)
3189
3190 def _testRecvmsgIntoArray(self):
3191 self.sendToServer(MSG)
3192
3193 def testRecvmsgIntoScatter(self):
3194 # Receive into multiple buffers (scatter write).
3195 b1 = bytearray(b"----")
3196 b2 = bytearray(b"0123456789")
3197 b3 = bytearray(b"--------------")
3198 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3199 [b1, memoryview(b2)[2:9], b3])
3200 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3201 self.assertEqual(b1, bytearray(b"Mary"))
3202 self.assertEqual(b2, bytearray(b"01 had a 9"))
3203 self.assertEqual(b3, bytearray(b"little lamb---"))
3204 self.checkRecvmsgAddress(addr, self.cli_addr)
3205 self.assertEqual(ancdata, [])
3206 self.checkFlags(flags, eor=True)
3207
3208 def _testRecvmsgIntoScatter(self):
3209 self.sendToServer(b"Mary had a little lamb")
3210
3211
3212class CmsgMacroTests(unittest.TestCase):
3213 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3214 # assumptions used by sendmsg() and recvmsg[_into](), which share
3215 # code with these functions.
3216
3217 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003218 try:
3219 import _testcapi
3220 except ImportError:
3221 socklen_t_limit = 0x7fffffff
3222 else:
3223 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003224
3225 @requireAttrs(socket, "CMSG_LEN")
3226 def testCMSG_LEN(self):
3227 # Test CMSG_LEN() with various valid and invalid values,
3228 # checking the assumptions used by recvmsg() and sendmsg().
3229 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3230 values = list(range(257)) + list(range(toobig - 257, toobig))
3231
3232 # struct cmsghdr has at least three members, two of which are ints
3233 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3234 for n in values:
3235 ret = socket.CMSG_LEN(n)
3236 # This is how recvmsg() calculates the data size
3237 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3238 self.assertLessEqual(ret, self.socklen_t_limit)
3239
3240 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3241 # sendmsg() shares code with these functions, and requires
3242 # that it reject values over the limit.
3243 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3244 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3245
3246 @requireAttrs(socket, "CMSG_SPACE")
3247 def testCMSG_SPACE(self):
3248 # Test CMSG_SPACE() with various valid and invalid values,
3249 # checking the assumptions used by sendmsg().
3250 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3251 values = list(range(257)) + list(range(toobig - 257, toobig))
3252
3253 last = socket.CMSG_SPACE(0)
3254 # struct cmsghdr has at least three members, two of which are ints
3255 self.assertGreater(last, array.array("i").itemsize * 2)
3256 for n in values:
3257 ret = socket.CMSG_SPACE(n)
3258 self.assertGreaterEqual(ret, last)
3259 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3260 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3261 self.assertLessEqual(ret, self.socklen_t_limit)
3262 last = ret
3263
3264 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3265 # sendmsg() shares code with these functions, and requires
3266 # that it reject values over the limit.
3267 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3268 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3269
3270
3271class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3272 # Tests for file descriptor passing on Unix-domain sockets.
3273
3274 # Invalid file descriptor value that's unlikely to evaluate to a
3275 # real FD even if one of its bytes is replaced with a different
3276 # value (which shouldn't actually happen).
3277 badfd = -0x5555
3278
3279 def newFDs(self, n):
3280 # Return a list of n file descriptors for newly-created files
3281 # containing their list indices as ASCII numbers.
3282 fds = []
3283 for i in range(n):
3284 fd, path = tempfile.mkstemp()
3285 self.addCleanup(os.unlink, path)
3286 self.addCleanup(os.close, fd)
3287 os.write(fd, str(i).encode())
3288 fds.append(fd)
3289 return fds
3290
3291 def checkFDs(self, fds):
3292 # Check that the file descriptors in the given list contain
3293 # their correct list indices as ASCII numbers.
3294 for n, fd in enumerate(fds):
3295 os.lseek(fd, 0, os.SEEK_SET)
3296 self.assertEqual(os.read(fd, 1024), str(n).encode())
3297
3298 def registerRecvmsgResult(self, result):
3299 self.addCleanup(self.closeRecvmsgFDs, result)
3300
3301 def closeRecvmsgFDs(self, recvmsg_result):
3302 # Close all file descriptors specified in the ancillary data
3303 # of the given return value from recvmsg() or recvmsg_into().
3304 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3305 if (cmsg_level == socket.SOL_SOCKET and
3306 cmsg_type == socket.SCM_RIGHTS):
3307 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003308 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003309 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3310 for fd in fds:
3311 os.close(fd)
3312
3313 def createAndSendFDs(self, n):
3314 # Send n new file descriptors created by newFDs() to the
3315 # server, with the constant MSG as the non-ancillary data.
3316 self.assertEqual(
3317 self.sendmsgToServer([MSG],
3318 [(socket.SOL_SOCKET,
3319 socket.SCM_RIGHTS,
3320 array.array("i", self.newFDs(n)))]),
3321 len(MSG))
3322
3323 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3324 # Check that constant MSG was received with numfds file
3325 # descriptors in a maximum of maxcmsgs control messages (which
3326 # must contain only complete integers). By default, check
3327 # that MSG_CTRUNC is unset, but ignore any flags in
3328 # ignoreflags.
3329 msg, ancdata, flags, addr = result
3330 self.assertEqual(msg, MSG)
3331 self.checkRecvmsgAddress(addr, self.cli_addr)
3332 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3333 ignore=ignoreflags)
3334
3335 self.assertIsInstance(ancdata, list)
3336 self.assertLessEqual(len(ancdata), maxcmsgs)
3337 fds = array.array("i")
3338 for item in ancdata:
3339 self.assertIsInstance(item, tuple)
3340 cmsg_level, cmsg_type, cmsg_data = item
3341 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3342 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3343 self.assertIsInstance(cmsg_data, bytes)
3344 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003345 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003346
3347 self.assertEqual(len(fds), numfds)
3348 self.checkFDs(fds)
3349
3350 def testFDPassSimple(self):
3351 # Pass a single FD (array read from bytes object).
3352 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3353 len(MSG), 10240))
3354
3355 def _testFDPassSimple(self):
3356 self.assertEqual(
3357 self.sendmsgToServer(
3358 [MSG],
3359 [(socket.SOL_SOCKET,
3360 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003361 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003362 len(MSG))
3363
3364 def testMultipleFDPass(self):
3365 # Pass multiple FDs in a single array.
3366 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3367 len(MSG), 10240))
3368
3369 def _testMultipleFDPass(self):
3370 self.createAndSendFDs(4)
3371
3372 @requireAttrs(socket, "CMSG_SPACE")
3373 def testFDPassCMSG_SPACE(self):
3374 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3375 self.checkRecvmsgFDs(
3376 4, self.doRecvmsg(self.serv_sock, len(MSG),
3377 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3378
3379 @testFDPassCMSG_SPACE.client_skip
3380 def _testFDPassCMSG_SPACE(self):
3381 self.createAndSendFDs(4)
3382
3383 def testFDPassCMSG_LEN(self):
3384 # Test using CMSG_LEN() to calculate ancillary buffer size.
3385 self.checkRecvmsgFDs(1,
3386 self.doRecvmsg(self.serv_sock, len(MSG),
3387 socket.CMSG_LEN(4 * SIZEOF_INT)),
3388 # RFC 3542 says implementations may set
3389 # MSG_CTRUNC if there isn't enough space
3390 # for trailing padding.
3391 ignoreflags=socket.MSG_CTRUNC)
3392
3393 def _testFDPassCMSG_LEN(self):
3394 self.createAndSendFDs(1)
3395
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003396 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003397 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003398 @requireAttrs(socket, "CMSG_SPACE")
3399 def testFDPassSeparate(self):
3400 # Pass two FDs in two separate arrays. Arrays may be combined
3401 # into a single control message by the OS.
3402 self.checkRecvmsgFDs(2,
3403 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3404 maxcmsgs=2)
3405
3406 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003407 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003408 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003409 def _testFDPassSeparate(self):
3410 fd0, fd1 = self.newFDs(2)
3411 self.assertEqual(
3412 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3413 socket.SCM_RIGHTS,
3414 array.array("i", [fd0])),
3415 (socket.SOL_SOCKET,
3416 socket.SCM_RIGHTS,
3417 array.array("i", [fd1]))]),
3418 len(MSG))
3419
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003420 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003421 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003422 @requireAttrs(socket, "CMSG_SPACE")
3423 def testFDPassSeparateMinSpace(self):
3424 # Pass two FDs in two separate arrays, receiving them into the
3425 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003426 num_fds = 2
3427 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428 self.doRecvmsg(self.serv_sock, len(MSG),
3429 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003430 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003431 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3432
3433 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003434 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003435 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003436 def _testFDPassSeparateMinSpace(self):
3437 fd0, fd1 = self.newFDs(2)
3438 self.assertEqual(
3439 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3440 socket.SCM_RIGHTS,
3441 array.array("i", [fd0])),
3442 (socket.SOL_SOCKET,
3443 socket.SCM_RIGHTS,
3444 array.array("i", [fd1]))]),
3445 len(MSG))
3446
3447 def sendAncillaryIfPossible(self, msg, ancdata):
3448 # Try to send msg and ancdata to server, but if the system
3449 # call fails, just send msg with no ancillary data.
3450 try:
3451 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003452 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003453 # Check that it was the system call that failed
3454 self.assertIsInstance(e.errno, int)
3455 nbytes = self.sendmsgToServer([msg])
3456 self.assertEqual(nbytes, len(msg))
3457
Brett Cannon3bbad122015-12-28 17:21:44 -08003458 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003459 def testFDPassEmpty(self):
3460 # Try to pass an empty FD array. Can receive either no array
3461 # or an empty array.
3462 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3463 len(MSG), 10240),
3464 ignoreflags=socket.MSG_CTRUNC)
3465
3466 def _testFDPassEmpty(self):
3467 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3468 socket.SCM_RIGHTS,
3469 b"")])
3470
3471 def testFDPassPartialInt(self):
3472 # Try to pass a truncated FD array.
3473 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3474 len(MSG), 10240)
3475 self.assertEqual(msg, MSG)
3476 self.checkRecvmsgAddress(addr, self.cli_addr)
3477 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3478 self.assertLessEqual(len(ancdata), 1)
3479 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3480 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3481 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3482 self.assertLess(len(cmsg_data), SIZEOF_INT)
3483
3484 def _testFDPassPartialInt(self):
3485 self.sendAncillaryIfPossible(
3486 MSG,
3487 [(socket.SOL_SOCKET,
3488 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003489 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003490
3491 @requireAttrs(socket, "CMSG_SPACE")
3492 def testFDPassPartialIntInMiddle(self):
3493 # Try to pass two FD arrays, the first of which is truncated.
3494 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3495 len(MSG), 10240)
3496 self.assertEqual(msg, MSG)
3497 self.checkRecvmsgAddress(addr, self.cli_addr)
3498 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3499 self.assertLessEqual(len(ancdata), 2)
3500 fds = array.array("i")
3501 # Arrays may have been combined in a single control message
3502 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3503 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3504 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003505 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003506 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3507 self.assertLessEqual(len(fds), 2)
3508 self.checkFDs(fds)
3509
3510 @testFDPassPartialIntInMiddle.client_skip
3511 def _testFDPassPartialIntInMiddle(self):
3512 fd0, fd1 = self.newFDs(2)
3513 self.sendAncillaryIfPossible(
3514 MSG,
3515 [(socket.SOL_SOCKET,
3516 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003517 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003518 (socket.SOL_SOCKET,
3519 socket.SCM_RIGHTS,
3520 array.array("i", [fd1]))])
3521
3522 def checkTruncatedHeader(self, result, ignoreflags=0):
3523 # Check that no ancillary data items are returned when data is
3524 # truncated inside the cmsghdr structure.
3525 msg, ancdata, flags, addr = result
3526 self.assertEqual(msg, MSG)
3527 self.checkRecvmsgAddress(addr, self.cli_addr)
3528 self.assertEqual(ancdata, [])
3529 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3530 ignore=ignoreflags)
3531
3532 def testCmsgTruncNoBufSize(self):
3533 # Check that no ancillary data is received when no buffer size
3534 # is specified.
3535 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3536 # BSD seems to set MSG_CTRUNC only
3537 # if an item has been partially
3538 # received.
3539 ignoreflags=socket.MSG_CTRUNC)
3540
3541 def _testCmsgTruncNoBufSize(self):
3542 self.createAndSendFDs(1)
3543
3544 def testCmsgTrunc0(self):
3545 # Check that no ancillary data is received when buffer size is 0.
3546 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3547 ignoreflags=socket.MSG_CTRUNC)
3548
3549 def _testCmsgTrunc0(self):
3550 self.createAndSendFDs(1)
3551
3552 # Check that no ancillary data is returned for various non-zero
3553 # (but still too small) buffer sizes.
3554
3555 def testCmsgTrunc1(self):
3556 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3557
3558 def _testCmsgTrunc1(self):
3559 self.createAndSendFDs(1)
3560
3561 def testCmsgTrunc2Int(self):
3562 # The cmsghdr structure has at least three members, two of
3563 # which are ints, so we still shouldn't see any ancillary
3564 # data.
3565 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3566 SIZEOF_INT * 2))
3567
3568 def _testCmsgTrunc2Int(self):
3569 self.createAndSendFDs(1)
3570
3571 def testCmsgTruncLen0Minus1(self):
3572 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3573 socket.CMSG_LEN(0) - 1))
3574
3575 def _testCmsgTruncLen0Minus1(self):
3576 self.createAndSendFDs(1)
3577
3578 # The following tests try to truncate the control message in the
3579 # middle of the FD array.
3580
3581 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3582 # Check that file descriptor data is truncated to between
3583 # mindata and maxdata bytes when received with buffer size
3584 # ancbuf, and that any complete file descriptor numbers are
3585 # valid.
3586 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3587 len(MSG), ancbuf)
3588 self.assertEqual(msg, MSG)
3589 self.checkRecvmsgAddress(addr, self.cli_addr)
3590 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3591
3592 if mindata == 0 and ancdata == []:
3593 return
3594 self.assertEqual(len(ancdata), 1)
3595 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3596 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3597 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3598 self.assertGreaterEqual(len(cmsg_data), mindata)
3599 self.assertLessEqual(len(cmsg_data), maxdata)
3600 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003601 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003602 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3603 self.checkFDs(fds)
3604
3605 def testCmsgTruncLen0(self):
3606 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3607
3608 def _testCmsgTruncLen0(self):
3609 self.createAndSendFDs(1)
3610
3611 def testCmsgTruncLen0Plus1(self):
3612 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3613
3614 def _testCmsgTruncLen0Plus1(self):
3615 self.createAndSendFDs(2)
3616
3617 def testCmsgTruncLen1(self):
3618 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3619 maxdata=SIZEOF_INT)
3620
3621 def _testCmsgTruncLen1(self):
3622 self.createAndSendFDs(2)
3623
3624 def testCmsgTruncLen2Minus1(self):
3625 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3626 maxdata=(2 * SIZEOF_INT) - 1)
3627
3628 def _testCmsgTruncLen2Minus1(self):
3629 self.createAndSendFDs(2)
3630
3631
3632class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3633 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3634 # features of the RFC 3542 Advanced Sockets API for IPv6.
3635 # Currently we can only handle certain data items (e.g. traffic
3636 # class, hop limit, MTU discovery and fragmentation settings)
3637 # without resorting to unportable means such as the struct module,
3638 # but the tests here are aimed at testing the ancillary data
3639 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3640 # itself.
3641
3642 # Test value to use when setting hop limit of packet
3643 hop_limit = 2
3644
3645 # Test value to use when setting traffic class of packet.
3646 # -1 means "use kernel default".
3647 traffic_class = -1
3648
3649 def ancillaryMapping(self, ancdata):
3650 # Given ancillary data list ancdata, return a mapping from
3651 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3652 # Check that no (level, type) pair appears more than once.
3653 d = {}
3654 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3655 self.assertNotIn((cmsg_level, cmsg_type), d)
3656 d[(cmsg_level, cmsg_type)] = cmsg_data
3657 return d
3658
3659 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3660 # Receive hop limit into ancbufsize bytes of ancillary data
3661 # space. Check that data is MSG, ancillary data is not
3662 # truncated (but ignore any flags in ignoreflags), and hop
3663 # limit is between 0 and maxhop inclusive.
3664 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3665 socket.IPV6_RECVHOPLIMIT, 1)
3666 self.misc_event.set()
3667 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3668 len(MSG), ancbufsize)
3669
3670 self.assertEqual(msg, MSG)
3671 self.checkRecvmsgAddress(addr, self.cli_addr)
3672 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3673 ignore=ignoreflags)
3674
3675 self.assertEqual(len(ancdata), 1)
3676 self.assertIsInstance(ancdata[0], tuple)
3677 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3678 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3679 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3680 self.assertIsInstance(cmsg_data, bytes)
3681 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3682 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003683 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003684 self.assertGreaterEqual(a[0], 0)
3685 self.assertLessEqual(a[0], maxhop)
3686
3687 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3688 def testRecvHopLimit(self):
3689 # Test receiving the packet hop limit as ancillary data.
3690 self.checkHopLimit(ancbufsize=10240)
3691
3692 @testRecvHopLimit.client_skip
3693 def _testRecvHopLimit(self):
3694 # Need to wait until server has asked to receive ancillary
3695 # data, as implementations are not required to buffer it
3696 # otherwise.
3697 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3698 self.sendToServer(MSG)
3699
3700 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3701 def testRecvHopLimitCMSG_SPACE(self):
3702 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3703 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3704
3705 @testRecvHopLimitCMSG_SPACE.client_skip
3706 def _testRecvHopLimitCMSG_SPACE(self):
3707 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3708 self.sendToServer(MSG)
3709
3710 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3711 # 3542 says portable applications must provide space for trailing
3712 # padding. Implementations may set MSG_CTRUNC if there isn't
3713 # enough space for the padding.
3714
3715 @requireAttrs(socket.socket, "sendmsg")
3716 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3717 def testSetHopLimit(self):
3718 # Test setting hop limit on outgoing packet and receiving it
3719 # at the other end.
3720 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3721
3722 @testSetHopLimit.client_skip
3723 def _testSetHopLimit(self):
3724 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3725 self.assertEqual(
3726 self.sendmsgToServer([MSG],
3727 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3728 array.array("i", [self.hop_limit]))]),
3729 len(MSG))
3730
3731 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3732 ignoreflags=0):
3733 # Receive traffic class and hop limit into ancbufsize bytes of
3734 # ancillary data space. Check that data is MSG, ancillary
3735 # data is not truncated (but ignore any flags in ignoreflags),
3736 # and traffic class and hop limit are in range (hop limit no
3737 # more than maxhop).
3738 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3739 socket.IPV6_RECVHOPLIMIT, 1)
3740 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3741 socket.IPV6_RECVTCLASS, 1)
3742 self.misc_event.set()
3743 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3744 len(MSG), ancbufsize)
3745
3746 self.assertEqual(msg, MSG)
3747 self.checkRecvmsgAddress(addr, self.cli_addr)
3748 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3749 ignore=ignoreflags)
3750 self.assertEqual(len(ancdata), 2)
3751 ancmap = self.ancillaryMapping(ancdata)
3752
3753 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3754 self.assertEqual(len(tcdata), SIZEOF_INT)
3755 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003756 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003757 self.assertGreaterEqual(a[0], 0)
3758 self.assertLessEqual(a[0], 255)
3759
3760 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3761 self.assertEqual(len(hldata), SIZEOF_INT)
3762 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003763 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003764 self.assertGreaterEqual(a[0], 0)
3765 self.assertLessEqual(a[0], maxhop)
3766
3767 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3768 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3769 def testRecvTrafficClassAndHopLimit(self):
3770 # Test receiving traffic class and hop limit as ancillary data.
3771 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3772
3773 @testRecvTrafficClassAndHopLimit.client_skip
3774 def _testRecvTrafficClassAndHopLimit(self):
3775 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3776 self.sendToServer(MSG)
3777
3778 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3779 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3780 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3781 # Test receiving traffic class and hop limit, using
3782 # CMSG_SPACE() to calculate buffer size.
3783 self.checkTrafficClassAndHopLimit(
3784 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3785
3786 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3787 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3788 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3789 self.sendToServer(MSG)
3790
3791 @requireAttrs(socket.socket, "sendmsg")
3792 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3793 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3794 def testSetTrafficClassAndHopLimit(self):
3795 # Test setting traffic class and hop limit on outgoing packet,
3796 # and receiving them at the other end.
3797 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3798 maxhop=self.hop_limit)
3799
3800 @testSetTrafficClassAndHopLimit.client_skip
3801 def _testSetTrafficClassAndHopLimit(self):
3802 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3803 self.assertEqual(
3804 self.sendmsgToServer([MSG],
3805 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3806 array.array("i", [self.traffic_class])),
3807 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3808 array.array("i", [self.hop_limit]))]),
3809 len(MSG))
3810
3811 @requireAttrs(socket.socket, "sendmsg")
3812 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3813 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3814 def testOddCmsgSize(self):
3815 # Try to send ancillary data with first item one byte too
3816 # long. Fall back to sending with correct size if this fails,
3817 # and check that second item was handled correctly.
3818 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3819 maxhop=self.hop_limit)
3820
3821 @testOddCmsgSize.client_skip
3822 def _testOddCmsgSize(self):
3823 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3824 try:
3825 nbytes = self.sendmsgToServer(
3826 [MSG],
3827 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003828 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003829 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3830 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003831 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003832 self.assertIsInstance(e.errno, int)
3833 nbytes = self.sendmsgToServer(
3834 [MSG],
3835 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3836 array.array("i", [self.traffic_class])),
3837 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3838 array.array("i", [self.hop_limit]))])
3839 self.assertEqual(nbytes, len(MSG))
3840
3841 # Tests for proper handling of truncated ancillary data
3842
3843 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3844 # Receive hop limit into ancbufsize bytes of ancillary data
3845 # space, which should be too small to contain the ancillary
3846 # data header (if ancbufsize is None, pass no second argument
3847 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3848 # (unless included in ignoreflags), and no ancillary data is
3849 # returned.
3850 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3851 socket.IPV6_RECVHOPLIMIT, 1)
3852 self.misc_event.set()
3853 args = () if ancbufsize is None else (ancbufsize,)
3854 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3855 len(MSG), *args)
3856
3857 self.assertEqual(msg, MSG)
3858 self.checkRecvmsgAddress(addr, self.cli_addr)
3859 self.assertEqual(ancdata, [])
3860 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3861 ignore=ignoreflags)
3862
3863 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3864 def testCmsgTruncNoBufSize(self):
3865 # Check that no ancillary data is received when no ancillary
3866 # buffer size is provided.
3867 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3868 # BSD seems to set
3869 # MSG_CTRUNC only if an item
3870 # has been partially
3871 # received.
3872 ignoreflags=socket.MSG_CTRUNC)
3873
3874 @testCmsgTruncNoBufSize.client_skip
3875 def _testCmsgTruncNoBufSize(self):
3876 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3877 self.sendToServer(MSG)
3878
3879 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3880 def testSingleCmsgTrunc0(self):
3881 # Check that no ancillary data is received when ancillary
3882 # buffer size is zero.
3883 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3884 ignoreflags=socket.MSG_CTRUNC)
3885
3886 @testSingleCmsgTrunc0.client_skip
3887 def _testSingleCmsgTrunc0(self):
3888 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3889 self.sendToServer(MSG)
3890
3891 # Check that no ancillary data is returned for various non-zero
3892 # (but still too small) buffer sizes.
3893
3894 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3895 def testSingleCmsgTrunc1(self):
3896 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3897
3898 @testSingleCmsgTrunc1.client_skip
3899 def _testSingleCmsgTrunc1(self):
3900 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3901 self.sendToServer(MSG)
3902
3903 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3904 def testSingleCmsgTrunc2Int(self):
3905 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3906
3907 @testSingleCmsgTrunc2Int.client_skip
3908 def _testSingleCmsgTrunc2Int(self):
3909 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3910 self.sendToServer(MSG)
3911
3912 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3913 def testSingleCmsgTruncLen0Minus1(self):
3914 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3915
3916 @testSingleCmsgTruncLen0Minus1.client_skip
3917 def _testSingleCmsgTruncLen0Minus1(self):
3918 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3919 self.sendToServer(MSG)
3920
3921 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3922 def testSingleCmsgTruncInData(self):
3923 # Test truncation of a control message inside its associated
3924 # data. The message may be returned with its data truncated,
3925 # or not returned at all.
3926 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3927 socket.IPV6_RECVHOPLIMIT, 1)
3928 self.misc_event.set()
3929 msg, ancdata, flags, addr = self.doRecvmsg(
3930 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3931
3932 self.assertEqual(msg, MSG)
3933 self.checkRecvmsgAddress(addr, self.cli_addr)
3934 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3935
3936 self.assertLessEqual(len(ancdata), 1)
3937 if ancdata:
3938 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3939 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3940 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3941 self.assertLess(len(cmsg_data), SIZEOF_INT)
3942
3943 @testSingleCmsgTruncInData.client_skip
3944 def _testSingleCmsgTruncInData(self):
3945 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3946 self.sendToServer(MSG)
3947
3948 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3949 # Receive traffic class and hop limit into ancbufsize bytes of
3950 # ancillary data space, which should be large enough to
3951 # contain the first item, but too small to contain the header
3952 # of the second. Check that data is MSG, MSG_CTRUNC is set
3953 # (unless included in ignoreflags), and only one ancillary
3954 # data item is returned.
3955 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3956 socket.IPV6_RECVHOPLIMIT, 1)
3957 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3958 socket.IPV6_RECVTCLASS, 1)
3959 self.misc_event.set()
3960 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3961 len(MSG), ancbufsize)
3962
3963 self.assertEqual(msg, MSG)
3964 self.checkRecvmsgAddress(addr, self.cli_addr)
3965 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3966 ignore=ignoreflags)
3967
3968 self.assertEqual(len(ancdata), 1)
3969 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3970 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3971 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3972 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3973 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003974 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003975 self.assertGreaterEqual(a[0], 0)
3976 self.assertLessEqual(a[0], 255)
3977
3978 # Try the above test with various buffer sizes.
3979
3980 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3981 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3982 def testSecondCmsgTrunc0(self):
3983 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3984 ignoreflags=socket.MSG_CTRUNC)
3985
3986 @testSecondCmsgTrunc0.client_skip
3987 def _testSecondCmsgTrunc0(self):
3988 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3989 self.sendToServer(MSG)
3990
3991 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3992 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3993 def testSecondCmsgTrunc1(self):
3994 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3995
3996 @testSecondCmsgTrunc1.client_skip
3997 def _testSecondCmsgTrunc1(self):
3998 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3999 self.sendToServer(MSG)
4000
4001 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4002 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4003 def testSecondCmsgTrunc2Int(self):
4004 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4005 2 * SIZEOF_INT)
4006
4007 @testSecondCmsgTrunc2Int.client_skip
4008 def _testSecondCmsgTrunc2Int(self):
4009 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4010 self.sendToServer(MSG)
4011
4012 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4013 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4014 def testSecondCmsgTruncLen0Minus1(self):
4015 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4016 socket.CMSG_LEN(0) - 1)
4017
4018 @testSecondCmsgTruncLen0Minus1.client_skip
4019 def _testSecondCmsgTruncLen0Minus1(self):
4020 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4021 self.sendToServer(MSG)
4022
4023 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4024 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4025 def testSecomdCmsgTruncInData(self):
4026 # Test truncation of the second of two control messages inside
4027 # its associated data.
4028 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4029 socket.IPV6_RECVHOPLIMIT, 1)
4030 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4031 socket.IPV6_RECVTCLASS, 1)
4032 self.misc_event.set()
4033 msg, ancdata, flags, addr = self.doRecvmsg(
4034 self.serv_sock, len(MSG),
4035 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4036
4037 self.assertEqual(msg, MSG)
4038 self.checkRecvmsgAddress(addr, self.cli_addr)
4039 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4040
4041 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4042
4043 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4044 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4045 cmsg_types.remove(cmsg_type)
4046 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4047 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004048 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004049 self.assertGreaterEqual(a[0], 0)
4050 self.assertLessEqual(a[0], 255)
4051
4052 if ancdata:
4053 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4054 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4055 cmsg_types.remove(cmsg_type)
4056 self.assertLess(len(cmsg_data), SIZEOF_INT)
4057
4058 self.assertEqual(ancdata, [])
4059
4060 @testSecomdCmsgTruncInData.client_skip
4061 def _testSecomdCmsgTruncInData(self):
4062 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4063 self.sendToServer(MSG)
4064
4065
4066# Derive concrete test classes for different socket types.
4067
4068class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4069 SendrecvmsgConnectionlessBase,
4070 ThreadedSocketTestMixin, UDPTestBase):
4071 pass
4072
4073@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004074class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4075 pass
4076
4077@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004078class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4079 pass
4080
4081@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004082class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4083 pass
4084
4085
4086class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4087 SendrecvmsgConnectionlessBase,
4088 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004089
4090 def checkRecvmsgAddress(self, addr1, addr2):
4091 # Called to compare the received address with the address of
4092 # the peer, ignoring scope ID
4093 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004094
4095@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004096@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004098class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4099 pass
4100
4101@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004102@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004103@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4105 pass
4106
4107@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004108@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004109@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004110class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4111 pass
4112
4113@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004114@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004115@requireAttrs(socket, "IPPROTO_IPV6")
4116@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004117class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4118 SendrecvmsgUDP6TestBase):
4119 pass
4120
4121@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004122@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004123@requireAttrs(socket, "IPPROTO_IPV6")
4124@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004125class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4126 RFC3542AncillaryTest,
4127 SendrecvmsgUDP6TestBase):
4128 pass
4129
4130
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004131@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4132 'UDPLITE sockets required for this test.')
4133class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4134 SendrecvmsgConnectionlessBase,
4135 ThreadedSocketTestMixin, UDPLITETestBase):
4136 pass
4137
4138@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4139 'UDPLITE sockets required for this test.')
4140@requireAttrs(socket.socket, "sendmsg")
4141class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4142 pass
4143
4144@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4145 'UDPLITE sockets required for this test.')
4146@requireAttrs(socket.socket, "recvmsg")
4147class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4148 pass
4149
4150@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4151 'UDPLITE sockets required for this test.')
4152@requireAttrs(socket.socket, "recvmsg_into")
4153class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4154 pass
4155
4156
4157@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4158 'UDPLITE sockets required for this test.')
4159class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4160 SendrecvmsgConnectionlessBase,
4161 ThreadedSocketTestMixin, UDPLITE6TestBase):
4162
4163 def checkRecvmsgAddress(self, addr1, addr2):
4164 # Called to compare the received address with the address of
4165 # the peer, ignoring scope ID
4166 self.assertEqual(addr1[:-1], addr2[:-1])
4167
4168@requireAttrs(socket.socket, "sendmsg")
4169@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4170@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4171 'UDPLITE sockets required for this test.')
4172@requireSocket("AF_INET6", "SOCK_DGRAM")
4173class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4174 pass
4175
4176@requireAttrs(socket.socket, "recvmsg")
4177@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4178@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4179 'UDPLITE sockets required for this test.')
4180@requireSocket("AF_INET6", "SOCK_DGRAM")
4181class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4182 pass
4183
4184@requireAttrs(socket.socket, "recvmsg_into")
4185@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4186@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4187 'UDPLITE sockets required for this test.')
4188@requireSocket("AF_INET6", "SOCK_DGRAM")
4189class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4190 pass
4191
4192@requireAttrs(socket.socket, "recvmsg")
4193@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4194@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4195 'UDPLITE sockets required for this test.')
4196@requireAttrs(socket, "IPPROTO_IPV6")
4197@requireSocket("AF_INET6", "SOCK_DGRAM")
4198class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4199 SendrecvmsgUDPLITE6TestBase):
4200 pass
4201
4202@requireAttrs(socket.socket, "recvmsg_into")
4203@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4204@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4205 'UDPLITE sockets required for this test.')
4206@requireAttrs(socket, "IPPROTO_IPV6")
4207@requireSocket("AF_INET6", "SOCK_DGRAM")
4208class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4209 RFC3542AncillaryTest,
4210 SendrecvmsgUDPLITE6TestBase):
4211 pass
4212
4213
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004214class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4215 ConnectedStreamTestMixin, TCPTestBase):
4216 pass
4217
4218@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004219class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4220 pass
4221
4222@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004223class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4224 SendrecvmsgTCPTestBase):
4225 pass
4226
4227@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004228class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4229 SendrecvmsgTCPTestBase):
4230 pass
4231
4232
4233class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4234 SendrecvmsgConnectedBase,
4235 ConnectedStreamTestMixin, SCTPStreamBase):
4236 pass
4237
4238@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004239@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004240@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004241class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4242 pass
4243
4244@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004245@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004246@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004247class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4248 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004249
4250 def testRecvmsgEOF(self):
4251 try:
4252 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4253 except OSError as e:
4254 if e.errno != errno.ENOTCONN:
4255 raise
4256 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004257
4258@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004259@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004260@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004261class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4262 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004263
4264 def testRecvmsgEOF(self):
4265 try:
4266 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4267 except OSError as e:
4268 if e.errno != errno.ENOTCONN:
4269 raise
4270 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004271
4272
4273class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4274 ConnectedStreamTestMixin, UnixStreamBase):
4275 pass
4276
4277@requireAttrs(socket.socket, "sendmsg")
4278@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004279class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4280 pass
4281
4282@requireAttrs(socket.socket, "recvmsg")
4283@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004284class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4285 SendrecvmsgUnixStreamTestBase):
4286 pass
4287
4288@requireAttrs(socket.socket, "recvmsg_into")
4289@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004290class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4291 SendrecvmsgUnixStreamTestBase):
4292 pass
4293
4294@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4295@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004296class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4297 pass
4298
4299@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4300@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004301class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4302 SendrecvmsgUnixStreamTestBase):
4303 pass
4304
4305
4306# Test interrupting the interruptible send/receive methods with a
4307# signal when a timeout is set. These tests avoid having multiple
4308# threads alive during the test so that the OS cannot deliver the
4309# signal to the wrong one.
4310
4311class InterruptedTimeoutBase(unittest.TestCase):
4312 # Base class for interrupted send/receive tests. Installs an
4313 # empty handler for SIGALRM and removes it on teardown, along with
4314 # any scheduled alarms.
4315
4316 def setUp(self):
4317 super().setUp()
4318 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004319 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004320 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321
4322 # Timeout for socket operations
4323 timeout = 4.0
4324
4325 # Provide setAlarm() method to schedule delivery of SIGALRM after
4326 # given number of seconds, or cancel it if zero, and an
4327 # appropriate time value to use. Use setitimer() if available.
4328 if hasattr(signal, "setitimer"):
4329 alarm_time = 0.05
4330
4331 def setAlarm(self, seconds):
4332 signal.setitimer(signal.ITIMER_REAL, seconds)
4333 else:
4334 # Old systems may deliver the alarm up to one second early
4335 alarm_time = 2
4336
4337 def setAlarm(self, seconds):
4338 signal.alarm(seconds)
4339
4340
4341# Require siginterrupt() in order to ensure that system calls are
4342# interrupted by default.
4343@requireAttrs(signal, "siginterrupt")
4344@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4345 "Don't have signal.alarm or signal.setitimer")
4346class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4347 # Test interrupting the recv*() methods with signals when a
4348 # timeout is set.
4349
4350 def setUp(self):
4351 super().setUp()
4352 self.serv.settimeout(self.timeout)
4353
4354 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004355 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004356 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004357 try:
4358 self.setAlarm(self.alarm_time)
4359 with self.assertRaises(ZeroDivisionError) as cm:
4360 func(*args, **kwargs)
4361 finally:
4362 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004363
4364 def testInterruptedRecvTimeout(self):
4365 self.checkInterruptedRecv(self.serv.recv, 1024)
4366
4367 def testInterruptedRecvIntoTimeout(self):
4368 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4369
4370 def testInterruptedRecvfromTimeout(self):
4371 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4372
4373 def testInterruptedRecvfromIntoTimeout(self):
4374 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4375
4376 @requireAttrs(socket.socket, "recvmsg")
4377 def testInterruptedRecvmsgTimeout(self):
4378 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4379
4380 @requireAttrs(socket.socket, "recvmsg_into")
4381 def testInterruptedRecvmsgIntoTimeout(self):
4382 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4383
4384
4385# Require siginterrupt() in order to ensure that system calls are
4386# interrupted by default.
4387@requireAttrs(signal, "siginterrupt")
4388@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4389 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004390class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4391 ThreadSafeCleanupTestCase,
4392 SocketListeningTestMixin, TCPTestBase):
4393 # Test interrupting the interruptible send*() methods with signals
4394 # when a timeout is set.
4395
4396 def setUp(self):
4397 super().setUp()
4398 self.serv_conn = self.newSocket()
4399 self.addCleanup(self.serv_conn.close)
4400 # Use a thread to complete the connection, but wait for it to
4401 # terminate before running the test, so that there is only one
4402 # thread to accept the signal.
4403 cli_thread = threading.Thread(target=self.doConnect)
4404 cli_thread.start()
4405 self.cli_conn, addr = self.serv.accept()
4406 self.addCleanup(self.cli_conn.close)
4407 cli_thread.join()
4408 self.serv_conn.settimeout(self.timeout)
4409
4410 def doConnect(self):
4411 self.serv_conn.connect(self.serv_addr)
4412
4413 def checkInterruptedSend(self, func, *args, **kwargs):
4414 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004415 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004416 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004417 try:
4418 with self.assertRaises(ZeroDivisionError) as cm:
4419 while True:
4420 self.setAlarm(self.alarm_time)
4421 func(*args, **kwargs)
4422 finally:
4423 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004424
Ned Deilyc5640382014-02-03 13:58:31 -08004425 # Issue #12958: The following tests have problems on OS X prior to 10.7
4426 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427 def testInterruptedSendTimeout(self):
4428 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4429
Ned Deilyc5640382014-02-03 13:58:31 -08004430 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004431 def testInterruptedSendtoTimeout(self):
4432 # Passing an actual address here as Python's wrapper for
4433 # sendto() doesn't allow passing a zero-length one; POSIX
4434 # requires that the address is ignored since the socket is
4435 # connection-mode, however.
4436 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4437 self.serv_addr)
4438
Ned Deilyc5640382014-02-03 13:58:31 -08004439 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004440 @requireAttrs(socket.socket, "sendmsg")
4441 def testInterruptedSendmsgTimeout(self):
4442 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4443
4444
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004445class TCPCloserTest(ThreadedTCPSocketTest):
4446
4447 def testClose(self):
4448 conn, addr = self.serv.accept()
4449 conn.close()
4450
4451 sd = self.cli
4452 read, write, err = select.select([sd], [], [], 1.0)
4453 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004454 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004455
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004456 # Calling close() many times should be safe.
4457 conn.close()
4458 conn.close()
4459
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004460 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004461 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004462 time.sleep(1.0)
4463
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004464
Dave Cole331708b2004-08-09 04:51:41 +00004465class BasicSocketPairTest(SocketPairTest):
4466
4467 def __init__(self, methodName='runTest'):
4468 SocketPairTest.__init__(self, methodName=methodName)
4469
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004470 def _check_defaults(self, sock):
4471 self.assertIsInstance(sock, socket.socket)
4472 if hasattr(socket, 'AF_UNIX'):
4473 self.assertEqual(sock.family, socket.AF_UNIX)
4474 else:
4475 self.assertEqual(sock.family, socket.AF_INET)
4476 self.assertEqual(sock.type, socket.SOCK_STREAM)
4477 self.assertEqual(sock.proto, 0)
4478
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004479 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004480 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004481
4482 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004483 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004484
Dave Cole331708b2004-08-09 04:51:41 +00004485 def testRecv(self):
4486 msg = self.serv.recv(1024)
4487 self.assertEqual(msg, MSG)
4488
4489 def _testRecv(self):
4490 self.cli.send(MSG)
4491
4492 def testSend(self):
4493 self.serv.send(MSG)
4494
4495 def _testSend(self):
4496 msg = self.cli.recv(1024)
4497 self.assertEqual(msg, MSG)
4498
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004499
Guido van Rossum24e4af82002-06-12 19:18:08 +00004500class NonBlockingTCPTests(ThreadedTCPSocketTest):
4501
4502 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004503 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004504 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4505
Victor Stinner304315d2018-11-30 13:22:44 +01004506 def assert_sock_timeout(self, sock, timeout):
4507 self.assertEqual(self.serv.gettimeout(), timeout)
4508
4509 blocking = (timeout != 0.0)
4510 self.assertEqual(sock.getblocking(), blocking)
4511
4512 if fcntl is not None:
4513 # When a Python socket has a non-zero timeout, it's switched
4514 # internally to a non-blocking mode. Later, sock.sendall(),
4515 # sock.recv(), and other socket operations use a select() call and
4516 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4517 # timeouts are enforced.
4518 fd_blocking = (timeout is None)
4519
4520 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4521 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4522
Guido van Rossum24e4af82002-06-12 19:18:08 +00004523 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004524 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004525 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004526 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004527
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004528 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004529 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004530
4531 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004532 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004533
4534 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004535 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004536
4537 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004538 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004539
4540 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004541 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004542
4543 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004544 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004545
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004546 @support.cpython_only
4547 def testSetBlocking_overflow(self):
4548 # Issue 15989
4549 import _testcapi
4550 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4551 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004552
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004553 self.serv.setblocking(False)
4554 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004555
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004556 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4557 self.assertIsNone(self.serv.gettimeout())
4558
4559 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4560
Serhiy Storchaka43767632013-11-03 21:31:38 +02004561 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4562 'test needs socket.SOCK_NONBLOCK')
4563 @support.requires_linux_version(2, 6, 28)
4564 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004565 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004566 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004567 self.serv = socket.socket(socket.AF_INET,
4568 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4569 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004570
4571 def _testInitNonBlocking(self):
4572 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004573
Victor Stinner304315d2018-11-30 13:22:44 +01004574 def testInheritFlagsBlocking(self):
4575 # bpo-7995: accept() on a listening socket with a timeout and the
4576 # default timeout is None, the resulting socket must be blocking.
4577 with socket_setdefaulttimeout(None):
4578 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004579 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004580 self.addCleanup(conn.close)
4581 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004582
Victor Stinner304315d2018-11-30 13:22:44 +01004583 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004584 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004585
4586 def testInheritFlagsTimeout(self):
4587 # bpo-7995: accept() on a listening socket with a timeout and the
4588 # default timeout is None, the resulting socket must inherit
4589 # the default timeout.
4590 default_timeout = 20.0
4591 with socket_setdefaulttimeout(default_timeout):
4592 self.serv.settimeout(10)
4593 conn, addr = self.serv.accept()
4594 self.addCleanup(conn.close)
4595 self.assertEqual(conn.gettimeout(), default_timeout)
4596
4597 def _testInheritFlagsTimeout(self):
4598 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004599
Guido van Rossum24e4af82002-06-12 19:18:08 +00004600 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004601 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004602 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004603
4604 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004605 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004606 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004607 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004608 dt = time.monotonic() - start_time
4609 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004610
4611 self.event.set()
4612
4613 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4614 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004615 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004616
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004617 # connect() completed: non-blocking accept() doesn't block
4618 conn, addr = self.serv.accept()
4619 self.addCleanup(conn.close)
4620 self.assertIsNone(conn.gettimeout())
4621
Guido van Rossum24e4af82002-06-12 19:18:08 +00004622 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004623 # don't connect before event is set to check
4624 # that non-blocking accept() raises BlockingIOError
4625 self.event.wait()
4626
Christian Heimes5e696852008-04-09 08:37:03 +00004627 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004628
Guido van Rossum24e4af82002-06-12 19:18:08 +00004629 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004630 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004631 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004632 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004633 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004634
4635 # the server didn't send data yet: non-blocking recv() fails
4636 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004637 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004638
4639 self.event.set()
4640
4641 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4642 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004643 self.fail("Error during select call to non-blocking socket.")
4644
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004645 # the server sent data yet: non-blocking recv() doesn't block
4646 msg = conn.recv(len(MSG))
4647 self.assertEqual(msg, MSG)
4648
Guido van Rossum24e4af82002-06-12 19:18:08 +00004649 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004650 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004651
4652 # don't send anything before event is set to check
4653 # that non-blocking recv() raises BlockingIOError
4654 self.event.wait()
4655
4656 # send data: recv() will no longer block
4657 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004658
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004659
Guido van Rossum24e4af82002-06-12 19:18:08 +00004660class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004661 """Unit tests for the object returned by socket.makefile()
4662
Antoine Pitrou834bd812010-10-13 16:17:14 +00004663 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004664 the client connection. You can read from this file to
4665 get output from the server.
4666
Antoine Pitrou834bd812010-10-13 16:17:14 +00004667 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004668 server connection. You can write to this file to send output
4669 to the client.
4670 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004671
Guido van Rossume9f66142002-08-07 15:46:19 +00004672 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004673 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004674 errors = 'strict'
4675 newline = None
4676
4677 read_mode = 'rb'
4678 read_msg = MSG
4679 write_mode = 'wb'
4680 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004681
Guido van Rossum24e4af82002-06-12 19:18:08 +00004682 def __init__(self, methodName='runTest'):
4683 SocketConnectedTest.__init__(self, methodName=methodName)
4684
4685 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004686 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4687 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004688 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004689 self.read_file = self.cli_conn.makefile(
4690 self.read_mode, self.bufsize,
4691 encoding = self.encoding,
4692 errors = self.errors,
4693 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004694
4695 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004696 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004697 self.read_file.close()
4698 self.assertTrue(self.read_file.closed)
4699 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004700 SocketConnectedTest.tearDown(self)
4701
4702 def clientSetUp(self):
4703 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004704 self.write_file = self.serv_conn.makefile(
4705 self.write_mode, self.bufsize,
4706 encoding = self.encoding,
4707 errors = self.errors,
4708 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004709
4710 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004711 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004712 self.write_file.close()
4713 self.assertTrue(self.write_file.closed)
4714 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004715 SocketConnectedTest.clientTearDown(self)
4716
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004717 def testReadAfterTimeout(self):
4718 # Issue #7322: A file object must disallow further reads
4719 # after a timeout has occurred.
4720 self.cli_conn.settimeout(1)
4721 self.read_file.read(3)
4722 # First read raises a timeout
4723 self.assertRaises(socket.timeout, self.read_file.read, 1)
4724 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004725 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004726 self.read_file.read(1)
4727 self.assertIn("cannot read from timed out object", str(ctx.exception))
4728
4729 def _testReadAfterTimeout(self):
4730 self.write_file.write(self.write_msg[0:3])
4731 self.write_file.flush()
4732 self.serv_finished.wait()
4733
Guido van Rossum24e4af82002-06-12 19:18:08 +00004734 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004735 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004736 first_seg = self.read_file.read(len(self.read_msg)-3)
4737 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004738 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004739 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004740
4741 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004742 self.write_file.write(self.write_msg)
4743 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004744
Guido van Rossum8c943832002-08-08 01:00:28 +00004745 def testFullRead(self):
4746 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004747 msg = self.read_file.read()
4748 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004749
4750 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004751 self.write_file.write(self.write_msg)
4752 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004753
Guido van Rossum24e4af82002-06-12 19:18:08 +00004754 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004755 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004756 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004757 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004758 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004759 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004760 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004761 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004762 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004763
4764 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004765 self.write_file.write(self.write_msg)
4766 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004767
4768 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004769 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004770 line = self.read_file.readline()
4771 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004772
4773 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004774 self.write_file.write(self.write_msg)
4775 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004776
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004777 def testCloseAfterMakefile(self):
4778 # The file returned by makefile should keep the socket open.
4779 self.cli_conn.close()
4780 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004781 msg = self.read_file.read()
4782 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004783
4784 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004785 self.write_file.write(self.write_msg)
4786 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004787
4788 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004789 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004790 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004791 if isinstance(self.read_msg, str):
4792 msg = msg.decode()
4793 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004794
4795 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004796 self.write_file.write(self.write_msg)
4797 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004798
Tim Peters116d83c2004-03-28 02:20:45 +00004799 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004800 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004801
4802 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004803 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004804
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004805 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004806 self.assertEqual(self.read_file.mode, self.read_mode)
4807 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004808
4809 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004810 self.assertEqual(self.write_file.mode, self.write_mode)
4811 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004812
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004813 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004814 self.read_file.close()
4815 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004816 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004817 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004818
4819 def _testRealClose(self):
4820 pass
4821
4822
Guido van Rossume9f66142002-08-07 15:46:19 +00004823class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4824
4825 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004826
Guido van Rossume9f66142002-08-07 15:46:19 +00004827 In this case (and in this case only), it should be possible to
4828 create a file object, read a line from it, create another file
4829 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004830 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004831 when reading multiple requests from the same socket."""
4832
4833 bufsize = 0 # Use unbuffered mode
4834
4835 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004836 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004837 line = self.read_file.readline() # first line
4838 self.assertEqual(line, b"A. " + self.write_msg) # first line
4839 self.read_file = self.cli_conn.makefile('rb', 0)
4840 line = self.read_file.readline() # second line
4841 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004842
4843 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004844 self.write_file.write(b"A. " + self.write_msg)
4845 self.write_file.write(b"B. " + self.write_msg)
4846 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004847
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004848 def testMakefileClose(self):
4849 # The file returned by makefile should keep the socket open...
4850 self.cli_conn.close()
4851 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004852 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004853 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004854 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004855 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004856
4857 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004858 self.write_file.write(self.write_msg)
4859 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004860
4861 def testMakefileCloseSocketDestroy(self):
4862 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004863 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004864 refcount_after = sys.getrefcount(self.cli_conn)
4865 self.assertEqual(refcount_before - 1, refcount_after)
4866
4867 def _testMakefileCloseSocketDestroy(self):
4868 pass
4869
Antoine Pitrou98b46702010-09-18 22:59:00 +00004870 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004871 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004872 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4873
4874 def testSmallReadNonBlocking(self):
4875 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004876 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4877 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004878 self.evt1.set()
4879 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004880 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004881 if first_seg is None:
4882 # Data not arrived (can happen under Windows), wait a bit
4883 time.sleep(0.5)
4884 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004885 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004886 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004887 self.assertEqual(n, 3)
4888 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004889 self.assertEqual(msg, self.read_msg)
4890 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4891 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004892
4893 def _testSmallReadNonBlocking(self):
4894 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004895 self.write_file.write(self.write_msg)
4896 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004897 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004898 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004899 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4900 self.serv_finished.wait(5.0)
4901
4902 def testWriteNonBlocking(self):
4903 self.cli_finished.wait(5.0)
4904 # The client thread can't skip directly - the SkipTest exception
4905 # would appear as a failure.
4906 if self.serv_skipped:
4907 self.skipTest(self.serv_skipped)
4908
4909 def _testWriteNonBlocking(self):
4910 self.serv_skipped = None
4911 self.serv_conn.setblocking(False)
4912 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004913 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004914 LIMIT = 10
4915 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004916 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004917 self.assertGreater(n, 0)
4918 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004919 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004920 if n is None:
4921 # Succeeded
4922 break
4923 self.assertGreater(n, 0)
4924 else:
4925 # Let us know that this test didn't manage to establish
4926 # the expected conditions. This is not a failure in itself but,
4927 # if it happens repeatedly, the test should be fixed.
4928 self.serv_skipped = "failed to saturate the socket buffer"
4929
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004930
Guido van Rossum8c943832002-08-08 01:00:28 +00004931class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4932
4933 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4934
4935
4936class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4937
4938 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004939
Thomas Woutersb2137042007-02-01 18:02:27 +00004940
Antoine Pitrou834bd812010-10-13 16:17:14 +00004941class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4942 """Tests for socket.makefile() in text mode (rather than binary)"""
4943
4944 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004945 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004946 write_mode = 'wb'
4947 write_msg = MSG
4948 newline = ''
4949
4950
4951class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4952 """Tests for socket.makefile() in text mode (rather than binary)"""
4953
4954 read_mode = 'rb'
4955 read_msg = MSG
4956 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004957 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004958 newline = ''
4959
4960
4961class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4962 """Tests for socket.makefile() in text mode (rather than binary)"""
4963
4964 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004965 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004966 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004967 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004968 newline = ''
4969
4970
Guido van Rossumd8faa362007-04-27 19:54:29 +00004971class NetworkConnectionTest(object):
4972 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004973
Guido van Rossumd8faa362007-04-27 19:54:29 +00004974 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004975 # We're inherited below by BasicTCPTest2, which also inherits
4976 # BasicTCPTest, which defines self.port referenced below.
4977 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004978 self.serv_conn = self.cli
4979
4980class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4981 """Tests that NetworkConnection does not break existing TCP functionality.
4982 """
4983
4984class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004985
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004986 class MockSocket(socket.socket):
4987 def connect(self, *args):
4988 raise socket.timeout('timed out')
4989
4990 @contextlib.contextmanager
4991 def mocked_socket_module(self):
4992 """Return a socket which times out on connect"""
4993 old_socket = socket.socket
4994 socket.socket = self.MockSocket
4995 try:
4996 yield
4997 finally:
4998 socket.socket = old_socket
4999
5000 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005001 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005002 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005003 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005004 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005005 cli.connect((HOST, port))
5006 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5007
5008 def test_create_connection(self):
5009 # Issue #9792: errors raised by create_connection() should have
5010 # a proper errno attribute.
5011 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005012 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005013 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005014
5015 # Issue #16257: create_connection() calls getaddrinfo() against
5016 # 'localhost'. This may result in an IPV6 addr being returned
5017 # as well as an IPV4 one:
5018 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5019 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5020 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5021 #
5022 # create_connection() enumerates through all the addresses returned
5023 # and if it doesn't successfully bind to any of them, it propagates
5024 # the last exception it encountered.
5025 #
5026 # On Solaris, ENETUNREACH is returned in this circumstance instead
5027 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5028 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02005029 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005030 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005031
5032 def test_create_connection_timeout(self):
5033 # Issue #9792: create_connection() should not recast timeout errors
5034 # as generic socket errors.
5035 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005036 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005037 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005038 except socket.timeout:
5039 pass
5040 except OSError as exc:
5041 if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
5042 raise
5043 else:
5044 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005045
Guido van Rossumd8faa362007-04-27 19:54:29 +00005046
5047class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5048
5049 def __init__(self, methodName='runTest'):
5050 SocketTCPTest.__init__(self, methodName=methodName)
5051 ThreadableTest.__init__(self)
5052
5053 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00005054 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005055
5056 def clientTearDown(self):
5057 self.cli.close()
5058 self.cli = None
5059 ThreadableTest.clientTearDown(self)
5060
5061 def _justAccept(self):
5062 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005063 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005064
5065 testFamily = _justAccept
5066 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005067 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005068 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005069 self.assertEqual(self.cli.family, 2)
5070
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005071 testSourceAddress = _justAccept
5072 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00005073 self.cli = socket.create_connection((HOST, self.port), timeout=30,
5074 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005075 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005076 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005077 # The port number being used is sufficient to show that the bind()
5078 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005079
Guido van Rossumd8faa362007-04-27 19:54:29 +00005080 testTimeoutDefault = _justAccept
5081 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005082 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005083 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005084 socket.setdefaulttimeout(42)
5085 try:
5086 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005087 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005088 finally:
5089 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005090 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005091
5092 testTimeoutNone = _justAccept
5093 def _testTimeoutNone(self):
5094 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005095 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005096 socket.setdefaulttimeout(30)
5097 try:
5098 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005099 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005100 finally:
5101 socket.setdefaulttimeout(None)
5102 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005103
5104 testTimeoutValueNamed = _justAccept
5105 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005106 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005107 self.assertEqual(self.cli.gettimeout(), 30)
5108
5109 testTimeoutValueNonamed = _justAccept
5110 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005111 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005112 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005113 self.assertEqual(self.cli.gettimeout(), 30)
5114
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005115
Guido van Rossumd8faa362007-04-27 19:54:29 +00005116class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5117
5118 def __init__(self, methodName='runTest'):
5119 SocketTCPTest.__init__(self, methodName=methodName)
5120 ThreadableTest.__init__(self)
5121
5122 def clientSetUp(self):
5123 pass
5124
5125 def clientTearDown(self):
5126 self.cli.close()
5127 self.cli = None
5128 ThreadableTest.clientTearDown(self)
5129
5130 def testInsideTimeout(self):
5131 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005132 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005133 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005134 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005135 testOutsideTimeout = testInsideTimeout
5136
5137 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005138 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005139 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005140 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005141
5142 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005143 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005144 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005145
5146
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005147class TCPTimeoutTest(SocketTCPTest):
5148
5149 def testTCPTimeout(self):
5150 def raise_timeout(*args, **kwargs):
5151 self.serv.settimeout(1.0)
5152 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005153 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005154 "Error generating a timeout exception (TCP)")
5155
5156 def testTimeoutZero(self):
5157 ok = False
5158 try:
5159 self.serv.settimeout(0.0)
5160 foo = self.serv.accept()
5161 except socket.timeout:
5162 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005163 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005164 ok = True
5165 except:
5166 self.fail("caught unexpected exception (TCP)")
5167 if not ok:
5168 self.fail("accept() returned success when we did not expect it")
5169
Serhiy Storchaka43767632013-11-03 21:31:38 +02005170 @unittest.skipUnless(hasattr(signal, 'alarm'),
5171 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005172 def testInterruptedTimeout(self):
5173 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005174 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005175 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005176 self.serv.settimeout(5.0) # must be longer than alarm
5177 class Alarm(Exception):
5178 pass
5179 def alarm_handler(signal, frame):
5180 raise Alarm
5181 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5182 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005183 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005184 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005185 foo = self.serv.accept()
5186 except socket.timeout:
5187 self.fail("caught timeout instead of Alarm")
5188 except Alarm:
5189 pass
5190 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005191 self.fail("caught other exception instead of Alarm:"
5192 " %s(%s):\n%s" %
5193 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005194 else:
5195 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005196 finally:
5197 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005198 except Alarm:
5199 self.fail("got Alarm in wrong place")
5200 finally:
5201 # no alarm can be pending. Safe to restore old handler.
5202 signal.signal(signal.SIGALRM, old_alarm)
5203
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005204class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005205
5206 def testUDPTimeout(self):
5207 def raise_timeout(*args, **kwargs):
5208 self.serv.settimeout(1.0)
5209 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005210 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005211 "Error generating a timeout exception (UDP)")
5212
5213 def testTimeoutZero(self):
5214 ok = False
5215 try:
5216 self.serv.settimeout(0.0)
5217 foo = self.serv.recv(1024)
5218 except socket.timeout:
5219 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005220 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005221 ok = True
5222 except:
5223 self.fail("caught unexpected exception (UDP)")
5224 if not ok:
5225 self.fail("recv() returned success when we did not expect it")
5226
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005227@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5228 'UDPLITE sockets required for this test.')
5229class UDPLITETimeoutTest(SocketUDPLITETest):
5230
5231 def testUDPLITETimeout(self):
5232 def raise_timeout(*args, **kwargs):
5233 self.serv.settimeout(1.0)
5234 self.serv.recv(1024)
5235 self.assertRaises(socket.timeout, raise_timeout,
5236 "Error generating a timeout exception (UDPLITE)")
5237
5238 def testTimeoutZero(self):
5239 ok = False
5240 try:
5241 self.serv.settimeout(0.0)
5242 foo = self.serv.recv(1024)
5243 except socket.timeout:
5244 self.fail("caught timeout instead of error (UDPLITE)")
5245 except OSError:
5246 ok = True
5247 except:
5248 self.fail("caught unexpected exception (UDPLITE)")
5249 if not ok:
5250 self.fail("recv() returned success when we did not expect it")
5251
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005252class TestExceptions(unittest.TestCase):
5253
5254 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005255 self.assertTrue(issubclass(OSError, Exception))
5256 self.assertTrue(issubclass(socket.herror, OSError))
5257 self.assertTrue(issubclass(socket.gaierror, OSError))
5258 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005259
Yury Selivanovfa22b292016-10-18 16:03:52 -04005260 def test_setblocking_invalidfd(self):
5261 # Regression test for issue #28471
5262
5263 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5264 sock = socket.socket(
5265 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5266 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005267 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005268
5269 with self.assertRaises(OSError):
5270 sock.setblocking(False)
5271
5272
Serhiy Storchaka43767632013-11-03 21:31:38 +02005273@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005274class TestLinuxAbstractNamespace(unittest.TestCase):
5275
5276 UNIX_PATH_MAX = 108
5277
5278 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005279 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005280 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5281 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005282 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005283 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5284 s2.connect(s1.getsockname())
5285 with s1.accept()[0] as s3:
5286 self.assertEqual(s1.getsockname(), address)
5287 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005288
5289 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005290 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005291 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5292 s.bind(address)
5293 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005294
5295 def testNameOverflow(self):
5296 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005297 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005298 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005299
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005300 def testStrName(self):
5301 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005302 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5303 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005304 s.bind("\x00python\x00test\x00")
5305 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005306 finally:
5307 s.close()
5308
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005309 def testBytearrayName(self):
5310 # Check that an abstract name can be passed as a bytearray.
5311 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5312 s.bind(bytearray(b"\x00python\x00test\x00"))
5313 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5314
Serhiy Storchaka43767632013-11-03 21:31:38 +02005315@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005316class TestUnixDomain(unittest.TestCase):
5317
5318 def setUp(self):
5319 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5320
5321 def tearDown(self):
5322 self.sock.close()
5323
5324 def encoded(self, path):
5325 # Return the given path encoded in the file system encoding,
5326 # or skip the test if this is not possible.
5327 try:
5328 return os.fsencode(path)
5329 except UnicodeEncodeError:
5330 self.skipTest(
5331 "Pathname {0!a} cannot be represented in file "
5332 "system encoding {1!r}".format(
5333 path, sys.getfilesystemencoding()))
5334
Antoine Pitrou16374872011-12-16 15:04:12 +01005335 def bind(self, sock, path):
5336 # Bind the socket
5337 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005338 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005339 except OSError as e:
5340 if str(e) == "AF_UNIX path too long":
5341 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005342 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005343 .format(path))
5344 else:
5345 raise
5346
Antoine Pitrou495b5022017-05-02 17:20:00 +02005347 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005348 # Issue #30205 (note getsockname() can return None on OS X)
5349 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005350
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005351 def testStrAddr(self):
5352 # Test binding to and retrieving a normal string pathname.
5353 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005354 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005355 self.addCleanup(support.unlink, path)
5356 self.assertEqual(self.sock.getsockname(), path)
5357
5358 def testBytesAddr(self):
5359 # Test binding to a bytes pathname.
5360 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005361 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005362 self.addCleanup(support.unlink, path)
5363 self.assertEqual(self.sock.getsockname(), path)
5364
5365 def testSurrogateescapeBind(self):
5366 # Test binding to a valid non-ASCII pathname, with the
5367 # non-ASCII bytes supplied using surrogateescape encoding.
5368 path = os.path.abspath(support.TESTFN_UNICODE)
5369 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005370 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005371 self.addCleanup(support.unlink, path)
5372 self.assertEqual(self.sock.getsockname(), path)
5373
5374 def testUnencodableAddr(self):
5375 # Test binding to a pathname that cannot be encoded in the
5376 # file system encoding.
5377 if support.TESTFN_UNENCODABLE is None:
5378 self.skipTest("No unencodable filename available")
5379 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005380 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005381 self.addCleanup(support.unlink, path)
5382 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005383
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005384
Thomas Wouters477c8d52006-05-27 19:21:47 +00005385class BufferIOTest(SocketConnectedTest):
5386 """
5387 Test the buffer versions of socket.recv() and socket.send().
5388 """
5389 def __init__(self, methodName='runTest'):
5390 SocketConnectedTest.__init__(self, methodName=methodName)
5391
Antoine Pitrou25480782010-03-17 22:50:28 +00005392 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005393 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005394 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005395 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005396 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005397 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005398 self.assertEqual(msg, MSG)
5399
Antoine Pitrou25480782010-03-17 22:50:28 +00005400 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005401 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005402 self.serv_conn.send(buf)
5403
Antoine Pitrou25480782010-03-17 22:50:28 +00005404 def testRecvIntoBytearray(self):
5405 buf = bytearray(1024)
5406 nbytes = self.cli_conn.recv_into(buf)
5407 self.assertEqual(nbytes, len(MSG))
5408 msg = buf[:len(MSG)]
5409 self.assertEqual(msg, MSG)
5410
5411 _testRecvIntoBytearray = _testRecvIntoArray
5412
5413 def testRecvIntoMemoryview(self):
5414 buf = bytearray(1024)
5415 nbytes = self.cli_conn.recv_into(memoryview(buf))
5416 self.assertEqual(nbytes, len(MSG))
5417 msg = buf[:len(MSG)]
5418 self.assertEqual(msg, MSG)
5419
5420 _testRecvIntoMemoryview = _testRecvIntoArray
5421
5422 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005423 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005424 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005425 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005426 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005427 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005428 self.assertEqual(msg, MSG)
5429
Antoine Pitrou25480782010-03-17 22:50:28 +00005430 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005431 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005432 self.serv_conn.send(buf)
5433
Antoine Pitrou25480782010-03-17 22:50:28 +00005434 def testRecvFromIntoBytearray(self):
5435 buf = bytearray(1024)
5436 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5437 self.assertEqual(nbytes, len(MSG))
5438 msg = buf[:len(MSG)]
5439 self.assertEqual(msg, MSG)
5440
5441 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5442
5443 def testRecvFromIntoMemoryview(self):
5444 buf = bytearray(1024)
5445 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5446 self.assertEqual(nbytes, len(MSG))
5447 msg = buf[:len(MSG)]
5448 self.assertEqual(msg, MSG)
5449
5450 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5451
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005452 def testRecvFromIntoSmallBuffer(self):
5453 # See issue #20246.
5454 buf = bytearray(8)
5455 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5456
5457 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005458 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005459
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005460 def testRecvFromIntoEmptyBuffer(self):
5461 buf = bytearray()
5462 self.cli_conn.recvfrom_into(buf)
5463 self.cli_conn.recvfrom_into(buf, 0)
5464
5465 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5466
Christian Heimes043d6f62008-01-07 17:19:16 +00005467
5468TIPC_STYPE = 2000
5469TIPC_LOWER = 200
5470TIPC_UPPER = 210
5471
5472def isTipcAvailable():
5473 """Check if the TIPC module is loaded
5474
5475 The TIPC module is not loaded automatically on Ubuntu and probably
5476 other Linux distros.
5477 """
5478 if not hasattr(socket, "AF_TIPC"):
5479 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005480 try:
5481 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005482 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005483 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005484 # have not the permission to read it.
5485 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005486 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005487 for line in f:
5488 if line.startswith("tipc "):
5489 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005490 return False
5491
Serhiy Storchaka43767632013-11-03 21:31:38 +02005492@unittest.skipUnless(isTipcAvailable(),
5493 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005494class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005495 def testRDM(self):
5496 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5497 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005498 self.addCleanup(srv.close)
5499 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005500
5501 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5502 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5503 TIPC_LOWER, TIPC_UPPER)
5504 srv.bind(srvaddr)
5505
5506 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5507 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5508 cli.sendto(MSG, sendaddr)
5509
5510 msg, recvaddr = srv.recvfrom(1024)
5511
5512 self.assertEqual(cli.getsockname(), recvaddr)
5513 self.assertEqual(msg, MSG)
5514
5515
Serhiy Storchaka43767632013-11-03 21:31:38 +02005516@unittest.skipUnless(isTipcAvailable(),
5517 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005518class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005519 def __init__(self, methodName = 'runTest'):
5520 unittest.TestCase.__init__(self, methodName = methodName)
5521 ThreadableTest.__init__(self)
5522
5523 def setUp(self):
5524 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005525 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005526 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5527 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5528 TIPC_LOWER, TIPC_UPPER)
5529 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005530 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005531 self.serverExplicitReady()
5532 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005533 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005534
5535 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005536 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005537 # accept() call; sleep a little while to avoid it, otherwise
5538 # we could get an exception
5539 time.sleep(0.1)
5540 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005541 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005542 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5543 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5544 self.cli.connect(addr)
5545 self.cliaddr = self.cli.getsockname()
5546
5547 def testStream(self):
5548 msg = self.conn.recv(1024)
5549 self.assertEqual(msg, MSG)
5550 self.assertEqual(self.cliaddr, self.connaddr)
5551
5552 def _testStream(self):
5553 self.cli.send(MSG)
5554 self.cli.close()
5555
5556
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005557class ContextManagersTest(ThreadedTCPSocketTest):
5558
5559 def _testSocketClass(self):
5560 # base test
5561 with socket.socket() as sock:
5562 self.assertFalse(sock._closed)
5563 self.assertTrue(sock._closed)
5564 # close inside with block
5565 with socket.socket() as sock:
5566 sock.close()
5567 self.assertTrue(sock._closed)
5568 # exception inside with block
5569 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005570 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005571 self.assertTrue(sock._closed)
5572
5573 def testCreateConnectionBase(self):
5574 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005575 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005576 data = conn.recv(1024)
5577 conn.sendall(data)
5578
5579 def _testCreateConnectionBase(self):
5580 address = self.serv.getsockname()
5581 with socket.create_connection(address) as sock:
5582 self.assertFalse(sock._closed)
5583 sock.sendall(b'foo')
5584 self.assertEqual(sock.recv(1024), b'foo')
5585 self.assertTrue(sock._closed)
5586
5587 def testCreateConnectionClose(self):
5588 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005589 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005590 data = conn.recv(1024)
5591 conn.sendall(data)
5592
5593 def _testCreateConnectionClose(self):
5594 address = self.serv.getsockname()
5595 with socket.create_connection(address) as sock:
5596 sock.close()
5597 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005598 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005599
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005600
Victor Stinnerdaf45552013-08-28 00:53:59 +02005601class InheritanceTest(unittest.TestCase):
5602 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5603 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005604 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005605 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005606 with socket.socket(socket.AF_INET,
5607 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005608 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005609 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005610
5611 def test_default_inheritable(self):
5612 sock = socket.socket()
5613 with sock:
5614 self.assertEqual(sock.get_inheritable(), False)
5615
5616 def test_dup(self):
5617 sock = socket.socket()
5618 with sock:
5619 newsock = sock.dup()
5620 sock.close()
5621 with newsock:
5622 self.assertEqual(newsock.get_inheritable(), False)
5623
5624 def test_set_inheritable(self):
5625 sock = socket.socket()
5626 with sock:
5627 sock.set_inheritable(True)
5628 self.assertEqual(sock.get_inheritable(), True)
5629
5630 sock.set_inheritable(False)
5631 self.assertEqual(sock.get_inheritable(), False)
5632
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005633 @unittest.skipIf(fcntl is None, "need fcntl")
5634 def test_get_inheritable_cloexec(self):
5635 sock = socket.socket()
5636 with sock:
5637 fd = sock.fileno()
5638 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005639
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005640 # clear FD_CLOEXEC flag
5641 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5642 flags &= ~fcntl.FD_CLOEXEC
5643 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005644
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005645 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005646
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005647 @unittest.skipIf(fcntl is None, "need fcntl")
5648 def test_set_inheritable_cloexec(self):
5649 sock = socket.socket()
5650 with sock:
5651 fd = sock.fileno()
5652 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5653 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005654
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005655 sock.set_inheritable(True)
5656 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5657 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005658
5659
Victor Stinnerdaf45552013-08-28 00:53:59 +02005660 def test_socketpair(self):
5661 s1, s2 = socket.socketpair()
5662 self.addCleanup(s1.close)
5663 self.addCleanup(s2.close)
5664 self.assertEqual(s1.get_inheritable(), False)
5665 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005666
5667
5668@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5669 "SOCK_NONBLOCK not defined")
5670class NonblockConstantTest(unittest.TestCase):
5671 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5672 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005673 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005674 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005675 self.assertTrue(
5676 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005677 if timeout == 0:
5678 # timeout == 0: means that getblocking() must be False.
5679 self.assertFalse(s.getblocking())
5680 else:
5681 # If timeout > 0, the socket will be in a "blocking" mode
5682 # from the standpoint of the Python API. For Python socket
5683 # object, "blocking" means that operations like 'sock.recv()'
5684 # will block. Internally, file descriptors for
5685 # "blocking" Python sockets *with timeouts* are in a
5686 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5687 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5688 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005689 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005690 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005691 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005692 self.assertFalse(
5693 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005694 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005695
Charles-François Natali239bb962011-06-03 12:55:15 +02005696 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005697 def test_SOCK_NONBLOCK(self):
5698 # a lot of it seems silly and redundant, but I wanted to test that
5699 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005700 with socket.socket(socket.AF_INET,
5701 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5702 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005703 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005704 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005705 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005706 self.checkNonblock(s)
5707 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005708 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005709 s.settimeout(2.0)
5710 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005711 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005712 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005713 # defaulttimeout
5714 t = socket.getdefaulttimeout()
5715 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005716 with socket.socket() as s:
5717 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005718 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005719 with socket.socket() as s:
5720 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005721 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005722 with socket.socket() as s:
5723 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005724 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005725 with socket.socket() as s:
5726 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005727 socket.setdefaulttimeout(t)
5728
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005729
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005730@unittest.skipUnless(os.name == "nt", "Windows specific")
5731@unittest.skipUnless(multiprocessing, "need multiprocessing")
5732class TestSocketSharing(SocketTCPTest):
5733 # This must be classmethod and not staticmethod or multiprocessing
5734 # won't be able to bootstrap it.
5735 @classmethod
5736 def remoteProcessServer(cls, q):
5737 # Recreate socket from shared data
5738 sdata = q.get()
5739 message = q.get()
5740
5741 s = socket.fromshare(sdata)
5742 s2, c = s.accept()
5743
5744 # Send the message
5745 s2.sendall(message)
5746 s2.close()
5747 s.close()
5748
5749 def testShare(self):
5750 # Transfer the listening server socket to another process
5751 # and service it from there.
5752
5753 # Create process:
5754 q = multiprocessing.Queue()
5755 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5756 p.start()
5757
5758 # Get the shared socket data
5759 data = self.serv.share(p.pid)
5760
5761 # Pass the shared socket to the other process
5762 addr = self.serv.getsockname()
5763 self.serv.close()
5764 q.put(data)
5765
5766 # The data that the server will send us
5767 message = b"slapmahfro"
5768 q.put(message)
5769
5770 # Connect
5771 s = socket.create_connection(addr)
5772 # listen for the data
5773 m = []
5774 while True:
5775 data = s.recv(100)
5776 if not data:
5777 break
5778 m.append(data)
5779 s.close()
5780 received = b"".join(m)
5781 self.assertEqual(received, message)
5782 p.join()
5783
5784 def testShareLength(self):
5785 data = self.serv.share(os.getpid())
5786 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5787 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5788
5789 def compareSockets(self, org, other):
5790 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005791 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005792 self.assertEqual(org.gettimeout(), None)
5793 self.assertEqual(org.gettimeout(), other.gettimeout())
5794
5795 self.assertEqual(org.family, other.family)
5796 self.assertEqual(org.type, other.type)
5797 # If the user specified "0" for proto, then
5798 # internally windows will have picked the correct value.
5799 # Python introspection on the socket however will still return
5800 # 0. For the shared socket, the python value is recreated
5801 # from the actual value, so it may not compare correctly.
5802 if org.proto != 0:
5803 self.assertEqual(org.proto, other.proto)
5804
5805 def testShareLocal(self):
5806 data = self.serv.share(os.getpid())
5807 s = socket.fromshare(data)
5808 try:
5809 self.compareSockets(self.serv, s)
5810 finally:
5811 s.close()
5812
5813 def testTypes(self):
5814 families = [socket.AF_INET, socket.AF_INET6]
5815 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5816 for f in families:
5817 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005818 try:
5819 source = socket.socket(f, t)
5820 except OSError:
5821 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005822 try:
5823 data = source.share(os.getpid())
5824 shared = socket.fromshare(data)
5825 try:
5826 self.compareSockets(source, shared)
5827 finally:
5828 shared.close()
5829 finally:
5830 source.close()
5831
5832
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005833class SendfileUsingSendTest(ThreadedTCPSocketTest):
5834 """
5835 Test the send() implementation of socket.sendfile().
5836 """
5837
Victor Stinner8c663fd2017-11-08 14:44:44 -08005838 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005839 BUFSIZE = 8192
5840 FILEDATA = b""
Paul Monson52c8c092019-07-14 01:30:28 -07005841 # bpo-37553: This is taking longer than 2 seconds on Windows ARM32 buildbot
5842 TIMEOUT = 10 if sys.platform == 'win32' and platform.machine() == 'ARM' else 2
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005843
5844 @classmethod
5845 def setUpClass(cls):
5846 def chunks(total, step):
5847 assert total >= step
5848 while total > step:
5849 yield step
5850 total -= step
5851 if total:
5852 yield total
5853
5854 chunk = b"".join([random.choice(string.ascii_letters).encode()
5855 for i in range(cls.BUFSIZE)])
5856 with open(support.TESTFN, 'wb') as f:
5857 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5858 f.write(chunk)
5859 with open(support.TESTFN, 'rb') as f:
5860 cls.FILEDATA = f.read()
5861 assert len(cls.FILEDATA) == cls.FILESIZE
5862
5863 @classmethod
5864 def tearDownClass(cls):
5865 support.unlink(support.TESTFN)
5866
5867 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005868 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005869 conn, addr = self.serv.accept()
5870 conn.settimeout(self.TIMEOUT)
5871 self.addCleanup(conn.close)
5872 return conn
5873
5874 def recv_data(self, conn):
5875 received = []
5876 while True:
5877 chunk = conn.recv(self.BUFSIZE)
5878 if not chunk:
5879 break
5880 received.append(chunk)
5881 return b''.join(received)
5882
5883 def meth_from_sock(self, sock):
5884 # Depending on the mixin class being run return either send()
5885 # or sendfile() method implementation.
5886 return getattr(sock, "_sendfile_use_send")
5887
5888 # regular file
5889
5890 def _testRegularFile(self):
5891 address = self.serv.getsockname()
5892 file = open(support.TESTFN, 'rb')
5893 with socket.create_connection(address) as sock, file as file:
5894 meth = self.meth_from_sock(sock)
5895 sent = meth(file)
5896 self.assertEqual(sent, self.FILESIZE)
5897 self.assertEqual(file.tell(), self.FILESIZE)
5898
5899 def testRegularFile(self):
5900 conn = self.accept_conn()
5901 data = self.recv_data(conn)
5902 self.assertEqual(len(data), self.FILESIZE)
5903 self.assertEqual(data, self.FILEDATA)
5904
5905 # non regular file
5906
5907 def _testNonRegularFile(self):
5908 address = self.serv.getsockname()
5909 file = io.BytesIO(self.FILEDATA)
5910 with socket.create_connection(address) as sock, file as file:
5911 sent = sock.sendfile(file)
5912 self.assertEqual(sent, self.FILESIZE)
5913 self.assertEqual(file.tell(), self.FILESIZE)
5914 self.assertRaises(socket._GiveupOnSendfile,
5915 sock._sendfile_use_sendfile, file)
5916
5917 def testNonRegularFile(self):
5918 conn = self.accept_conn()
5919 data = self.recv_data(conn)
5920 self.assertEqual(len(data), self.FILESIZE)
5921 self.assertEqual(data, self.FILEDATA)
5922
5923 # empty file
5924
5925 def _testEmptyFileSend(self):
5926 address = self.serv.getsockname()
5927 filename = support.TESTFN + "2"
5928 with open(filename, 'wb'):
5929 self.addCleanup(support.unlink, filename)
5930 file = open(filename, 'rb')
5931 with socket.create_connection(address) as sock, file as file:
5932 meth = self.meth_from_sock(sock)
5933 sent = meth(file)
5934 self.assertEqual(sent, 0)
5935 self.assertEqual(file.tell(), 0)
5936
5937 def testEmptyFileSend(self):
5938 conn = self.accept_conn()
5939 data = self.recv_data(conn)
5940 self.assertEqual(data, b"")
5941
5942 # offset
5943
5944 def _testOffset(self):
5945 address = self.serv.getsockname()
5946 file = open(support.TESTFN, 'rb')
5947 with socket.create_connection(address) as sock, file as file:
5948 meth = self.meth_from_sock(sock)
5949 sent = meth(file, offset=5000)
5950 self.assertEqual(sent, self.FILESIZE - 5000)
5951 self.assertEqual(file.tell(), self.FILESIZE)
5952
5953 def testOffset(self):
5954 conn = self.accept_conn()
5955 data = self.recv_data(conn)
5956 self.assertEqual(len(data), self.FILESIZE - 5000)
5957 self.assertEqual(data, self.FILEDATA[5000:])
5958
5959 # count
5960
5961 def _testCount(self):
5962 address = self.serv.getsockname()
5963 file = open(support.TESTFN, 'rb')
5964 with socket.create_connection(address, timeout=2) as sock, file as file:
5965 count = 5000007
5966 meth = self.meth_from_sock(sock)
5967 sent = meth(file, count=count)
5968 self.assertEqual(sent, count)
5969 self.assertEqual(file.tell(), count)
5970
5971 def testCount(self):
5972 count = 5000007
5973 conn = self.accept_conn()
5974 data = self.recv_data(conn)
5975 self.assertEqual(len(data), count)
5976 self.assertEqual(data, self.FILEDATA[:count])
5977
5978 # count small
5979
5980 def _testCountSmall(self):
5981 address = self.serv.getsockname()
5982 file = open(support.TESTFN, 'rb')
5983 with socket.create_connection(address, timeout=2) as sock, file as file:
5984 count = 1
5985 meth = self.meth_from_sock(sock)
5986 sent = meth(file, count=count)
5987 self.assertEqual(sent, count)
5988 self.assertEqual(file.tell(), count)
5989
5990 def testCountSmall(self):
5991 count = 1
5992 conn = self.accept_conn()
5993 data = self.recv_data(conn)
5994 self.assertEqual(len(data), count)
5995 self.assertEqual(data, self.FILEDATA[:count])
5996
5997 # count + offset
5998
5999 def _testCountWithOffset(self):
6000 address = self.serv.getsockname()
6001 file = open(support.TESTFN, 'rb')
6002 with socket.create_connection(address, timeout=2) as sock, file as file:
6003 count = 100007
6004 meth = self.meth_from_sock(sock)
6005 sent = meth(file, offset=2007, count=count)
6006 self.assertEqual(sent, count)
6007 self.assertEqual(file.tell(), count + 2007)
6008
6009 def testCountWithOffset(self):
6010 count = 100007
6011 conn = self.accept_conn()
6012 data = self.recv_data(conn)
6013 self.assertEqual(len(data), count)
6014 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6015
6016 # non blocking sockets are not supposed to work
6017
6018 def _testNonBlocking(self):
6019 address = self.serv.getsockname()
6020 file = open(support.TESTFN, 'rb')
6021 with socket.create_connection(address) as sock, file as file:
6022 sock.setblocking(False)
6023 meth = self.meth_from_sock(sock)
6024 self.assertRaises(ValueError, meth, file)
6025 self.assertRaises(ValueError, sock.sendfile, file)
6026
6027 def testNonBlocking(self):
6028 conn = self.accept_conn()
6029 if conn.recv(8192):
6030 self.fail('was not supposed to receive any data')
6031
6032 # timeout (non-triggered)
6033
6034 def _testWithTimeout(self):
6035 address = self.serv.getsockname()
6036 file = open(support.TESTFN, 'rb')
6037 with socket.create_connection(address, timeout=2) as sock, file as file:
6038 meth = self.meth_from_sock(sock)
6039 sent = meth(file)
6040 self.assertEqual(sent, self.FILESIZE)
6041
6042 def testWithTimeout(self):
6043 conn = self.accept_conn()
6044 data = self.recv_data(conn)
6045 self.assertEqual(len(data), self.FILESIZE)
6046 self.assertEqual(data, self.FILEDATA)
6047
6048 # timeout (triggered)
6049
6050 def _testWithTimeoutTriggeredSend(self):
6051 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006052 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006053 with socket.create_connection(address) as sock:
6054 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006055 meth = self.meth_from_sock(sock)
6056 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006057
6058 def testWithTimeoutTriggeredSend(self):
6059 conn = self.accept_conn()
6060 conn.recv(88192)
6061
6062 # errors
6063
6064 def _test_errors(self):
6065 pass
6066
6067 def test_errors(self):
6068 with open(support.TESTFN, 'rb') as file:
6069 with socket.socket(type=socket.SOCK_DGRAM) as s:
6070 meth = self.meth_from_sock(s)
6071 self.assertRaisesRegex(
6072 ValueError, "SOCK_STREAM", meth, file)
6073 with open(support.TESTFN, 'rt') as file:
6074 with socket.socket() as s:
6075 meth = self.meth_from_sock(s)
6076 self.assertRaisesRegex(
6077 ValueError, "binary mode", meth, file)
6078 with open(support.TESTFN, 'rb') as file:
6079 with socket.socket() as s:
6080 meth = self.meth_from_sock(s)
6081 self.assertRaisesRegex(TypeError, "positive integer",
6082 meth, file, count='2')
6083 self.assertRaisesRegex(TypeError, "positive integer",
6084 meth, file, count=0.1)
6085 self.assertRaisesRegex(ValueError, "positive integer",
6086 meth, file, count=0)
6087 self.assertRaisesRegex(ValueError, "positive integer",
6088 meth, file, count=-1)
6089
6090
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006091@unittest.skipUnless(hasattr(os, "sendfile"),
6092 'os.sendfile() required for this test.')
6093class SendfileUsingSendfileTest(SendfileUsingSendTest):
6094 """
6095 Test the sendfile() implementation of socket.sendfile().
6096 """
6097 def meth_from_sock(self, sock):
6098 return getattr(sock, "_sendfile_use_sendfile")
6099
Christian Heimes48371412016-09-06 00:37:46 +02006100
6101@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006102class LinuxKernelCryptoAPI(unittest.TestCase):
6103 # tests for AF_ALG
6104 def create_alg(self, typ, name):
6105 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006106 try:
6107 sock.bind((typ, name))
6108 except FileNotFoundError as e:
6109 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006110 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006111 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006112 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006113 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006114
Victor Stinner86afc1f2017-11-30 13:58:43 +01006115 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6116 # at least on ppc64le architecture
6117 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006118 def test_sha256(self):
6119 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6120 "177a9cb410ff61f20015ad")
6121 with self.create_alg('hash', 'sha256') as algo:
6122 op, _ = algo.accept()
6123 with op:
6124 op.sendall(b"abc")
6125 self.assertEqual(op.recv(512), expected)
6126
6127 op, _ = algo.accept()
6128 with op:
6129 op.send(b'a', socket.MSG_MORE)
6130 op.send(b'b', socket.MSG_MORE)
6131 op.send(b'c', socket.MSG_MORE)
6132 op.send(b'')
6133 self.assertEqual(op.recv(512), expected)
6134
6135 def test_hmac_sha1(self):
6136 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6137 with self.create_alg('hash', 'hmac(sha1)') as algo:
6138 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6139 op, _ = algo.accept()
6140 with op:
6141 op.sendall(b"what do ya want for nothing?")
6142 self.assertEqual(op.recv(512), expected)
6143
Christian Heimese084f842016-09-11 20:11:30 +02006144 # Although it should work with 3.19 and newer the test blocks on
6145 # Ubuntu 15.10 with Kernel 4.2.0-19.
6146 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006147 def test_aes_cbc(self):
6148 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6149 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6150 msg = b"Single block msg"
6151 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6152 msglen = len(msg)
6153 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6154 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6155 op, _ = algo.accept()
6156 with op:
6157 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6158 flags=socket.MSG_MORE)
6159 op.sendall(msg)
6160 self.assertEqual(op.recv(msglen), ciphertext)
6161
6162 op, _ = algo.accept()
6163 with op:
6164 op.sendmsg_afalg([ciphertext],
6165 op=socket.ALG_OP_DECRYPT, iv=iv)
6166 self.assertEqual(op.recv(msglen), msg)
6167
6168 # long message
6169 multiplier = 1024
6170 longmsg = [msg] * multiplier
6171 op, _ = algo.accept()
6172 with op:
6173 op.sendmsg_afalg(longmsg,
6174 op=socket.ALG_OP_ENCRYPT, iv=iv)
6175 enc = op.recv(msglen * multiplier)
6176 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006177 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006178
6179 op, _ = algo.accept()
6180 with op:
6181 op.sendmsg_afalg([enc],
6182 op=socket.ALG_OP_DECRYPT, iv=iv)
6183 dec = op.recv(msglen * multiplier)
6184 self.assertEqual(len(dec), msglen * multiplier)
6185 self.assertEqual(dec, msg * multiplier)
6186
matejcik9764c152017-02-16 14:41:31 +01006187 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006188 def test_aead_aes_gcm(self):
6189 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6190 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6191 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6192 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6193 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6194 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6195
6196 taglen = len(expected_tag)
6197 assoclen = len(assoc)
6198
6199 with self.create_alg('aead', 'gcm(aes)') as algo:
6200 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6201 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6202 None, taglen)
6203
6204 # send assoc, plain and tag buffer in separate steps
6205 op, _ = algo.accept()
6206 with op:
6207 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6208 assoclen=assoclen, flags=socket.MSG_MORE)
6209 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006210 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006211 res = op.recv(assoclen + len(plain) + taglen)
6212 self.assertEqual(expected_ct, res[assoclen:-taglen])
6213 self.assertEqual(expected_tag, res[-taglen:])
6214
6215 # now with msg
6216 op, _ = algo.accept()
6217 with op:
matejcik9764c152017-02-16 14:41:31 +01006218 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006219 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6220 assoclen=assoclen)
6221 res = op.recv(assoclen + len(plain) + taglen)
6222 self.assertEqual(expected_ct, res[assoclen:-taglen])
6223 self.assertEqual(expected_tag, res[-taglen:])
6224
6225 # create anc data manually
6226 pack_uint32 = struct.Struct('I').pack
6227 op, _ = algo.accept()
6228 with op:
matejcik9764c152017-02-16 14:41:31 +01006229 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006230 op.sendmsg(
6231 [msg],
6232 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6233 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6234 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6235 )
6236 )
matejcik9764c152017-02-16 14:41:31 +01006237 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006238 self.assertEqual(expected_ct, res[assoclen:-taglen])
6239 self.assertEqual(expected_tag, res[-taglen:])
6240
6241 # decrypt and verify
6242 op, _ = algo.accept()
6243 with op:
6244 msg = assoc + expected_ct + expected_tag
6245 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6246 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006247 res = op.recv(len(msg) - taglen)
6248 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006249
Christian Heimese084f842016-09-11 20:11:30 +02006250 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006251 def test_drbg_pr_sha256(self):
6252 # deterministic random bit generator, prediction resistance, sha256
6253 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6254 extra_seed = os.urandom(32)
6255 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6256 op, _ = algo.accept()
6257 with op:
6258 rn = op.recv(32)
6259 self.assertEqual(len(rn), 32)
6260
6261 def test_sendmsg_afalg_args(self):
6262 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006263 with sock:
6264 with self.assertRaises(TypeError):
6265 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006266
Christian Heimes02b30352016-09-11 19:49:56 +02006267 with self.assertRaises(TypeError):
6268 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006269
Christian Heimes02b30352016-09-11 19:49:56 +02006270 with self.assertRaises(TypeError):
6271 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006272
Christian Heimes02b30352016-09-11 19:49:56 +02006273 with self.assertRaises(TypeError):
6274 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006275
Christian Heimes02b30352016-09-11 19:49:56 +02006276 with self.assertRaises(TypeError):
6277 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6278
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006279 def test_length_restriction(self):
6280 # bpo-35050, off-by-one error in length check
6281 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6282 self.addCleanup(sock.close)
6283
6284 # salg_type[14]
6285 with self.assertRaises(FileNotFoundError):
6286 sock.bind(("t" * 13, "name"))
6287 with self.assertRaisesRegex(ValueError, "type too long"):
6288 sock.bind(("t" * 14, "name"))
6289
6290 # salg_name[64]
6291 with self.assertRaises(FileNotFoundError):
6292 sock.bind(("type", "n" * 63))
6293 with self.assertRaisesRegex(ValueError, "name too long"):
6294 sock.bind(("type", "n" * 64))
6295
6296
animalize19e7d482018-02-27 02:10:36 +08006297@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6298class TestMSWindowsTCPFlags(unittest.TestCase):
6299 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006300 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006301 'TCP_MAXSEG',
6302 'TCP_NODELAY',
6303 # available starting with Windows 10 1607
6304 'TCP_FASTOPEN',
6305 # available starting with Windows 10 1703
6306 'TCP_KEEPCNT',
6307 # available starting with Windows 10 1709
6308 'TCP_KEEPIDLE',
6309 'TCP_KEEPINTVL'
6310 }
6311
6312 def test_new_tcp_flags(self):
6313 provided = [s for s in dir(socket) if s.startswith('TCP')]
6314 unknown = [s for s in provided if s not in self.knownTCPFlags]
6315
6316 self.assertEqual([], unknown,
6317 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006318
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006319
6320class CreateServerTest(unittest.TestCase):
6321
6322 def test_address(self):
6323 port = support.find_unused_port()
6324 with socket.create_server(("127.0.0.1", port)) as sock:
6325 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6326 self.assertEqual(sock.getsockname()[1], port)
6327 if support.IPV6_ENABLED:
6328 with socket.create_server(("::1", port),
6329 family=socket.AF_INET6) as sock:
6330 self.assertEqual(sock.getsockname()[0], "::1")
6331 self.assertEqual(sock.getsockname()[1], port)
6332
6333 def test_family_and_type(self):
6334 with socket.create_server(("127.0.0.1", 0)) as sock:
6335 self.assertEqual(sock.family, socket.AF_INET)
6336 self.assertEqual(sock.type, socket.SOCK_STREAM)
6337 if support.IPV6_ENABLED:
6338 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6339 self.assertEqual(s.family, socket.AF_INET6)
6340 self.assertEqual(sock.type, socket.SOCK_STREAM)
6341
6342 def test_reuse_port(self):
6343 if not hasattr(socket, "SO_REUSEPORT"):
6344 with self.assertRaises(ValueError):
6345 socket.create_server(("localhost", 0), reuse_port=True)
6346 else:
6347 with socket.create_server(("localhost", 0)) as sock:
6348 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6349 self.assertEqual(opt, 0)
6350 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6351 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6352 self.assertNotEqual(opt, 0)
6353
6354 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6355 not hasattr(_socket, 'IPV6_V6ONLY'),
6356 "IPV6_V6ONLY option not supported")
6357 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6358 def test_ipv6_only_default(self):
6359 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6360 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6361
6362 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6363 "dualstack_ipv6 not supported")
6364 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6365 def test_dualstack_ipv6_family(self):
6366 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6367 dualstack_ipv6=True) as sock:
6368 self.assertEqual(sock.family, socket.AF_INET6)
6369
6370
6371class CreateServerFunctionalTest(unittest.TestCase):
6372 timeout = 3
6373
6374 def setUp(self):
6375 self.thread = None
6376
6377 def tearDown(self):
6378 if self.thread is not None:
6379 self.thread.join(self.timeout)
6380
6381 def echo_server(self, sock):
6382 def run(sock):
6383 with sock:
6384 conn, _ = sock.accept()
6385 with conn:
6386 event.wait(self.timeout)
6387 msg = conn.recv(1024)
6388 if not msg:
6389 return
6390 conn.sendall(msg)
6391
6392 event = threading.Event()
6393 sock.settimeout(self.timeout)
6394 self.thread = threading.Thread(target=run, args=(sock, ))
6395 self.thread.start()
6396 event.set()
6397
6398 def echo_client(self, addr, family):
6399 with socket.socket(family=family) as sock:
6400 sock.settimeout(self.timeout)
6401 sock.connect(addr)
6402 sock.sendall(b'foo')
6403 self.assertEqual(sock.recv(1024), b'foo')
6404
6405 def test_tcp4(self):
6406 port = support.find_unused_port()
6407 with socket.create_server(("", port)) as sock:
6408 self.echo_server(sock)
6409 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6410
6411 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6412 def test_tcp6(self):
6413 port = support.find_unused_port()
6414 with socket.create_server(("", port),
6415 family=socket.AF_INET6) as sock:
6416 self.echo_server(sock)
6417 self.echo_client(("::1", port), socket.AF_INET6)
6418
6419 # --- dual stack tests
6420
6421 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6422 "dualstack_ipv6 not supported")
6423 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6424 def test_dual_stack_client_v4(self):
6425 port = support.find_unused_port()
6426 with socket.create_server(("", port), family=socket.AF_INET6,
6427 dualstack_ipv6=True) as sock:
6428 self.echo_server(sock)
6429 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6430
6431 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6432 "dualstack_ipv6 not supported")
6433 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6434 def test_dual_stack_client_v6(self):
6435 port = support.find_unused_port()
6436 with socket.create_server(("", port), family=socket.AF_INET6,
6437 dualstack_ipv6=True) as sock:
6438 self.echo_server(sock)
6439 self.echo_client(("::1", port), socket.AF_INET6)
6440
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006441@requireAttrs(socket, "send_fds")
6442@requireAttrs(socket, "recv_fds")
6443@requireAttrs(socket, "AF_UNIX")
6444class SendRecvFdsTests(unittest.TestCase):
6445 def testSendAndRecvFds(self):
6446 def close_pipes(pipes):
6447 for fd1, fd2 in pipes:
6448 os.close(fd1)
6449 os.close(fd2)
6450
6451 def close_fds(fds):
6452 for fd in fds:
6453 os.close(fd)
6454
6455 # send 10 file descriptors
6456 pipes = [os.pipe() for _ in range(10)]
6457 self.addCleanup(close_pipes, pipes)
6458 fds = [rfd for rfd, wfd in pipes]
6459
6460 # use a UNIX socket pair to exchange file descriptors locally
6461 sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
6462 with sock1, sock2:
6463 socket.send_fds(sock1, [MSG], fds)
6464 # request more data and file descriptors than expected
6465 msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
6466 self.addCleanup(close_fds, fds2)
6467
6468 self.assertEqual(msg, MSG)
6469 self.assertEqual(len(fds2), len(fds))
6470 self.assertEqual(flags, 0)
6471 # don't test addr
6472
6473 # test that file descriptors are connected
6474 for index, fds in enumerate(pipes):
6475 rfd, wfd = fds
6476 os.write(wfd, str(index).encode())
6477
6478 for index, rfd in enumerate(fds2):
6479 data = os.read(rfd, 100)
6480 self.assertEqual(data, str(index).encode())
6481
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006482
Guido van Rossumb995eb72002-07-31 16:08:40 +00006483def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006484 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006485 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006486 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest,
6487 SendRecvFdsTests]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006488
6489 tests.extend([
6490 NonBlockingTCPTests,
6491 FileObjectClassTestCase,
6492 UnbufferedFileObjectClassTestCase,
6493 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006494 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006495 UnicodeReadFileObjectClassTestCase,
6496 UnicodeWriteFileObjectClassTestCase,
6497 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006498 NetworkConnectionNoServer,
6499 NetworkConnectionAttributesTest,
6500 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006501 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006502 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006503 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006504 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006505 tests.append(BasicSocketPairTest)
6506 tests.append(TestUnixDomain)
6507 tests.append(TestLinuxAbstractNamespace)
6508 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006509 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006510 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006511 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006512 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006513 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006514 BasicVSOCKTest,
6515 ThreadedVSOCKSocketStreamTest,
6516 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006517 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006518 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006519 CmsgMacroTests,
6520 SendmsgUDPTest,
6521 RecvmsgUDPTest,
6522 RecvmsgIntoUDPTest,
6523 SendmsgUDP6Test,
6524 RecvmsgUDP6Test,
6525 RecvmsgRFC3542AncillaryUDP6Test,
6526 RecvmsgIntoRFC3542AncillaryUDP6Test,
6527 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006528 SendmsgUDPLITETest,
6529 RecvmsgUDPLITETest,
6530 RecvmsgIntoUDPLITETest,
6531 SendmsgUDPLITE6Test,
6532 RecvmsgUDPLITE6Test,
6533 RecvmsgRFC3542AncillaryUDPLITE6Test,
6534 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6535 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006536 SendmsgTCPTest,
6537 RecvmsgTCPTest,
6538 RecvmsgIntoTCPTest,
6539 SendmsgSCTPStreamTest,
6540 RecvmsgSCTPStreamTest,
6541 RecvmsgIntoSCTPStreamTest,
6542 SendmsgUnixStreamTest,
6543 RecvmsgUnixStreamTest,
6544 RecvmsgIntoUnixStreamTest,
6545 RecvmsgSCMRightsStreamTest,
6546 RecvmsgIntoSCMRightsStreamTest,
6547 # These are slow when setitimer() is not available
6548 InterruptedRecvTimeoutTest,
6549 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006550 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006551 SendfileUsingSendTest,
6552 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006553 ])
animalize19e7d482018-02-27 02:10:36 +08006554 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006555
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006556 thread_info = support.threading_setup()
6557 support.run_unittest(*tests)
6558 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006559
Joannah Nanjekye8d120f72019-09-11 18:12:21 +01006560
Guido van Rossum24e4af82002-06-12 19:18:08 +00006561if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006562 test_main()