blob: 14ff561da94f27b2ac9afb119fbddf5af40f2c0d [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:
1951 s.bind(('', ))
1952
1953 def testTooLongInterfaceName(self):
1954 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1955 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001956 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001957 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001958
1959 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1960 'socket.CAN_RAW_LOOPBACK required for this test.')
1961 def testLoopback(self):
1962 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1963 for loopback in (0, 1):
1964 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1965 loopback)
1966 self.assertEqual(loopback,
1967 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1968
1969 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1970 'socket.CAN_RAW_FILTER required for this test.')
1971 def testFilter(self):
1972 can_id, can_mask = 0x200, 0x700
1973 can_filter = struct.pack("=II", can_id, can_mask)
1974 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1975 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1976 self.assertEqual(can_filter,
1977 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001978 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001979
1980
1981@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001982class CANTest(ThreadedCANSocketTest):
1983
Charles-François Natali47413c12011-10-06 19:47:44 +02001984 def __init__(self, methodName='runTest'):
1985 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1986
1987 @classmethod
1988 def build_can_frame(cls, can_id, data):
1989 """Build a CAN frame."""
1990 can_dlc = len(data)
1991 data = data.ljust(8, b'\x00')
1992 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1993
1994 @classmethod
1995 def dissect_can_frame(cls, frame):
1996 """Dissect a CAN frame."""
1997 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1998 return (can_id, can_dlc, data[:can_dlc])
1999
2000 def testSendFrame(self):
2001 cf, addr = self.s.recvfrom(self.bufsize)
2002 self.assertEqual(self.cf, cf)
2003 self.assertEqual(addr[0], self.interface)
2004 self.assertEqual(addr[1], socket.AF_CAN)
2005
2006 def _testSendFrame(self):
2007 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
2008 self.cli.send(self.cf)
2009
2010 def testSendMaxFrame(self):
2011 cf, addr = self.s.recvfrom(self.bufsize)
2012 self.assertEqual(self.cf, cf)
2013
2014 def _testSendMaxFrame(self):
2015 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2016 self.cli.send(self.cf)
2017
2018 def testSendMultiFrames(self):
2019 cf, addr = self.s.recvfrom(self.bufsize)
2020 self.assertEqual(self.cf1, cf)
2021
2022 cf, addr = self.s.recvfrom(self.bufsize)
2023 self.assertEqual(self.cf2, cf)
2024
2025 def _testSendMultiFrames(self):
2026 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2027 self.cli.send(self.cf1)
2028
2029 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2030 self.cli.send(self.cf2)
2031
Charles-François Natali773e42d2013-02-05 19:42:01 +01002032 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2033 'socket.CAN_BCM required for this test.')
2034 def _testBCM(self):
2035 cf, addr = self.cli.recvfrom(self.bufsize)
2036 self.assertEqual(self.cf, cf)
2037 can_id, can_dlc, data = self.dissect_can_frame(cf)
2038 self.assertEqual(self.can_id, can_id)
2039 self.assertEqual(self.data, data)
2040
2041 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2042 'socket.CAN_BCM required for this test.')
2043 def testBCM(self):
2044 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2045 self.addCleanup(bcm.close)
2046 bcm.connect((self.interface,))
2047 self.can_id = 0x123
2048 self.data = bytes([0xc0, 0xff, 0xee])
2049 self.cf = self.build_can_frame(self.can_id, self.data)
2050 opcode = socket.CAN_BCM_TX_SEND
2051 flags = 0
2052 count = 0
2053 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2054 bcm_can_id = 0x0222
2055 nframes = 1
2056 assert len(self.cf) == 16
2057 header = struct.pack(self.bcm_cmd_msg_fmt,
2058 opcode,
2059 flags,
2060 count,
2061 ival1_seconds,
2062 ival1_usec,
2063 ival2_seconds,
2064 ival2_usec,
2065 bcm_can_id,
2066 nframes,
2067 )
2068 header_plus_frame = header + self.cf
2069 bytes_sent = bcm.send(header_plus_frame)
2070 self.assertEqual(bytes_sent, len(header_plus_frame))
2071
Charles-François Natali47413c12011-10-06 19:47:44 +02002072
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002073@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2074class ISOTPTest(unittest.TestCase):
2075
2076 def __init__(self, *args, **kwargs):
2077 super().__init__(*args, **kwargs)
2078 self.interface = "vcan0"
2079
2080 def testCrucialConstants(self):
2081 socket.AF_CAN
2082 socket.PF_CAN
2083 socket.CAN_ISOTP
2084 socket.SOCK_DGRAM
2085
2086 def testCreateSocket(self):
2087 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2088 pass
2089
2090 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2091 'socket.CAN_ISOTP required for this test.')
2092 def testCreateISOTPSocket(self):
2093 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2094 pass
2095
2096 def testTooLongInterfaceName(self):
2097 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2098 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2099 with self.assertRaisesRegex(OSError, 'interface name too long'):
2100 s.bind(('x' * 1024, 1, 2))
2101
2102 def testBind(self):
2103 try:
2104 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2105 addr = self.interface, 0x123, 0x456
2106 s.bind(addr)
2107 self.assertEqual(s.getsockname(), addr)
2108 except OSError as e:
2109 if e.errno == errno.ENODEV:
2110 self.skipTest('network interface `%s` does not exist' %
2111 self.interface)
2112 else:
2113 raise
2114
2115
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002116@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2117class BasicRDSTest(unittest.TestCase):
2118
2119 def testCrucialConstants(self):
2120 socket.AF_RDS
2121 socket.PF_RDS
2122
2123 def testCreateSocket(self):
2124 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2125 pass
2126
2127 def testSocketBufferSize(self):
2128 bufsize = 16384
2129 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2130 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2131 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2132
2133
2134@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002135class RDSTest(ThreadedRDSSocketTest):
2136
2137 def __init__(self, methodName='runTest'):
2138 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2139
Charles-François Natali240c55f2011-11-10 20:33:36 +01002140 def setUp(self):
2141 super().setUp()
2142 self.evt = threading.Event()
2143
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002144 def testSendAndRecv(self):
2145 data, addr = self.serv.recvfrom(self.bufsize)
2146 self.assertEqual(self.data, data)
2147 self.assertEqual(self.cli_addr, addr)
2148
2149 def _testSendAndRecv(self):
2150 self.data = b'spam'
2151 self.cli.sendto(self.data, 0, (HOST, self.port))
2152
2153 def testPeek(self):
2154 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2155 self.assertEqual(self.data, data)
2156 data, addr = self.serv.recvfrom(self.bufsize)
2157 self.assertEqual(self.data, data)
2158
2159 def _testPeek(self):
2160 self.data = b'spam'
2161 self.cli.sendto(self.data, 0, (HOST, self.port))
2162
2163 @requireAttrs(socket.socket, 'recvmsg')
2164 def testSendAndRecvMsg(self):
2165 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2166 self.assertEqual(self.data, data)
2167
2168 @requireAttrs(socket.socket, 'sendmsg')
2169 def _testSendAndRecvMsg(self):
2170 self.data = b'hello ' * 10
2171 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2172
2173 def testSendAndRecvMulti(self):
2174 data, addr = self.serv.recvfrom(self.bufsize)
2175 self.assertEqual(self.data1, data)
2176
2177 data, addr = self.serv.recvfrom(self.bufsize)
2178 self.assertEqual(self.data2, data)
2179
2180 def _testSendAndRecvMulti(self):
2181 self.data1 = b'bacon'
2182 self.cli.sendto(self.data1, 0, (HOST, self.port))
2183
2184 self.data2 = b'egg'
2185 self.cli.sendto(self.data2, 0, (HOST, self.port))
2186
2187 def testSelect(self):
2188 r, w, x = select.select([self.serv], [], [], 3.0)
2189 self.assertIn(self.serv, r)
2190 data, addr = self.serv.recvfrom(self.bufsize)
2191 self.assertEqual(self.data, data)
2192
2193 def _testSelect(self):
2194 self.data = b'select'
2195 self.cli.sendto(self.data, 0, (HOST, self.port))
2196
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002197@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2198 'QIPCRTR sockets required for this test.')
2199class BasicQIPCRTRTest(unittest.TestCase):
2200
2201 def testCrucialConstants(self):
2202 socket.AF_QIPCRTR
2203
2204 def testCreateSocket(self):
2205 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2206 pass
2207
2208 def testUnbound(self):
2209 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2210 self.assertEqual(s.getsockname()[1], 0)
2211
2212 def testBindSock(self):
2213 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2214 support.bind_port(s, host=s.getsockname()[0])
2215 self.assertNotEqual(s.getsockname()[1], 0)
2216
2217 def testInvalidBindSock(self):
2218 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2219 self.assertRaises(OSError, support.bind_port, s, host=-2)
2220
2221 def testAutoBindSock(self):
2222 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2223 s.connect((123, 123))
2224 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002225
caaveryeffc12f2017-09-06 18:18:10 -04002226@unittest.skipIf(fcntl is None, "need fcntl")
2227@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2228 'VSOCK sockets required for this test.')
2229class BasicVSOCKTest(unittest.TestCase):
2230
2231 def testCrucialConstants(self):
2232 socket.AF_VSOCK
2233
2234 def testVSOCKConstants(self):
2235 socket.SO_VM_SOCKETS_BUFFER_SIZE
2236 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2237 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2238 socket.VMADDR_CID_ANY
2239 socket.VMADDR_PORT_ANY
2240 socket.VMADDR_CID_HOST
2241 socket.VM_SOCKETS_INVALID_VERSION
2242 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2243
2244 def testCreateSocket(self):
2245 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2246 pass
2247
2248 def testSocketBufferSize(self):
2249 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2250 orig_max = s.getsockopt(socket.AF_VSOCK,
2251 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2252 orig = s.getsockopt(socket.AF_VSOCK,
2253 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2254 orig_min = s.getsockopt(socket.AF_VSOCK,
2255 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2256
2257 s.setsockopt(socket.AF_VSOCK,
2258 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2259 s.setsockopt(socket.AF_VSOCK,
2260 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2261 s.setsockopt(socket.AF_VSOCK,
2262 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2263
2264 self.assertEqual(orig_max * 2,
2265 s.getsockopt(socket.AF_VSOCK,
2266 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2267 self.assertEqual(orig * 2,
2268 s.getsockopt(socket.AF_VSOCK,
2269 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2270 self.assertEqual(orig_min * 2,
2271 s.getsockopt(socket.AF_VSOCK,
2272 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2273
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002274
Greg Bowser8fbece12019-08-02 16:29:52 -04002275@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2276 'Bluetooth sockets required for this test.')
2277class BasicBluetoothTest(unittest.TestCase):
2278
2279 def testBluetoothConstants(self):
2280 socket.BDADDR_ANY
2281 socket.BDADDR_LOCAL
2282 socket.AF_BLUETOOTH
2283 socket.BTPROTO_RFCOMM
2284
2285 if sys.platform != "win32":
2286 socket.BTPROTO_HCI
2287 socket.SOL_HCI
2288 socket.BTPROTO_L2CAP
2289
2290 if not sys.platform.startswith("freebsd"):
2291 socket.BTPROTO_SCO
2292
2293 def testCreateRfcommSocket(self):
2294 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
2295 pass
2296
2297 @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
2298 def testCreateL2capSocket(self):
2299 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
2300 pass
2301
2302 @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
2303 def testCreateHciSocket(self):
2304 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
2305 pass
2306
2307 @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
2308 "windows and freebsd do not support SCO sockets")
2309 def testCreateScoSocket(self):
2310 with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
2311 pass
2312
2313
Guido van Rossum24e4af82002-06-12 19:18:08 +00002314class BasicTCPTest(SocketConnectedTest):
2315
2316 def __init__(self, methodName='runTest'):
2317 SocketConnectedTest.__init__(self, methodName=methodName)
2318
2319 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002320 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002321 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002322 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002323
2324 def _testRecv(self):
2325 self.serv_conn.send(MSG)
2326
2327 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002328 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002329 seg1 = self.cli_conn.recv(len(MSG) - 3)
2330 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002331 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002332 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002333
2334 def _testOverFlowRecv(self):
2335 self.serv_conn.send(MSG)
2336
2337 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002338 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002339 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002340 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002341
2342 def _testRecvFrom(self):
2343 self.serv_conn.send(MSG)
2344
2345 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002346 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002347 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2348 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002349 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002350 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002351
2352 def _testOverFlowRecvFrom(self):
2353 self.serv_conn.send(MSG)
2354
2355 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002356 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002357 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002358 while 1:
2359 read = self.cli_conn.recv(1024)
2360 if not read:
2361 break
Guido van Rossume531e292002-08-08 20:28:34 +00002362 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002363 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002364
2365 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002366 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002367 self.serv_conn.sendall(big_chunk)
2368
2369 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002370 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002371 fd = self.cli_conn.fileno()
2372 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002373 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002374 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002375 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002376 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002377
2378 def _testFromFd(self):
2379 self.serv_conn.send(MSG)
2380
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002381 def testDup(self):
2382 # Testing dup()
2383 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002384 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002385 msg = sock.recv(1024)
2386 self.assertEqual(msg, MSG)
2387
2388 def _testDup(self):
2389 self.serv_conn.send(MSG)
2390
Guido van Rossum24e4af82002-06-12 19:18:08 +00002391 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002392 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002393 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002394 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002395 # wait for _testShutdown to finish: on OS X, when the server
2396 # closes the connection the client also becomes disconnected,
2397 # and the client's shutdown call will fail. (Issue #4397.)
2398 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002399
2400 def _testShutdown(self):
2401 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002402 self.serv_conn.shutdown(2)
2403
2404 testShutdown_overflow = support.cpython_only(testShutdown)
2405
2406 @support.cpython_only
2407 def _testShutdown_overflow(self):
2408 import _testcapi
2409 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002410 # Issue 15989
2411 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2412 _testcapi.INT_MAX + 1)
2413 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2414 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002415 self.serv_conn.shutdown(2)
2416
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002417 def testDetach(self):
2418 # Testing detach()
2419 fileno = self.cli_conn.fileno()
2420 f = self.cli_conn.detach()
2421 self.assertEqual(f, fileno)
2422 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002423 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002424 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002425 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002426 # ...but we can create another socket using the (still open)
2427 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002428 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002429 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002430 msg = sock.recv(1024)
2431 self.assertEqual(msg, MSG)
2432
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002433 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002434 self.serv_conn.send(MSG)
2435
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002436
Guido van Rossum24e4af82002-06-12 19:18:08 +00002437class BasicUDPTest(ThreadedUDPSocketTest):
2438
2439 def __init__(self, methodName='runTest'):
2440 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2441
2442 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002443 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002444 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002445 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002446
2447 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002448 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002449
Guido van Rossum1c938012002-06-12 21:17:20 +00002450 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002451 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002452 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002453 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002454
Guido van Rossum1c938012002-06-12 21:17:20 +00002455 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002456 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002457
Guido van Rossumd8faa362007-04-27 19:54:29 +00002458 def testRecvFromNegative(self):
2459 # Negative lengths passed to recvfrom should give ValueError.
2460 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2461
2462 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002463 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002464
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002465
2466@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2467 'UDPLITE sockets required for this test.')
2468class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2469
2470 def __init__(self, methodName='runTest'):
2471 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2472
2473 def testSendtoAndRecv(self):
2474 # Testing sendto() and Recv() over UDPLITE
2475 msg = self.serv.recv(len(MSG))
2476 self.assertEqual(msg, MSG)
2477
2478 def _testSendtoAndRecv(self):
2479 self.cli.sendto(MSG, 0, (HOST, self.port))
2480
2481 def testRecvFrom(self):
2482 # Testing recvfrom() over UDPLITE
2483 msg, addr = self.serv.recvfrom(len(MSG))
2484 self.assertEqual(msg, MSG)
2485
2486 def _testRecvFrom(self):
2487 self.cli.sendto(MSG, 0, (HOST, self.port))
2488
2489 def testRecvFromNegative(self):
2490 # Negative lengths passed to recvfrom should give ValueError.
2491 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2492
2493 def _testRecvFromNegative(self):
2494 self.cli.sendto(MSG, 0, (HOST, self.port))
2495
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002496# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2497# same test code is used with different families and types of socket
2498# (e.g. stream, datagram), and tests using recvmsg() are repeated
2499# using recvmsg_into().
2500#
2501# The generic test classes such as SendmsgTests and
2502# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2503# supplied with sockets cli_sock and serv_sock representing the
2504# client's and the server's end of the connection respectively, and
2505# attributes cli_addr and serv_addr holding their (numeric where
2506# appropriate) addresses.
2507#
2508# The final concrete test classes combine these with subclasses of
2509# SocketTestBase which set up client and server sockets of a specific
2510# type, and with subclasses of SendrecvmsgBase such as
2511# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2512# sockets to cli_sock and serv_sock and override the methods and
2513# attributes of SendrecvmsgBase to fill in destination addresses if
2514# needed when sending, check for specific flags in msg_flags, etc.
2515#
2516# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2517# recvmsg_into().
2518
2519# XXX: like the other datagram (UDP) tests in this module, the code
2520# here assumes that datagram delivery on the local machine will be
2521# reliable.
2522
2523class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2524 # Base class for sendmsg()/recvmsg() tests.
2525
2526 # Time in seconds to wait before considering a test failed, or
2527 # None for no timeout. Not all tests actually set a timeout.
2528 fail_timeout = 3.0
2529
2530 def setUp(self):
2531 self.misc_event = threading.Event()
2532 super().setUp()
2533
2534 def sendToServer(self, msg):
2535 # Send msg to the server.
2536 return self.cli_sock.send(msg)
2537
2538 # Tuple of alternative default arguments for sendmsg() when called
2539 # via sendmsgToServer() (e.g. to include a destination address).
2540 sendmsg_to_server_defaults = ()
2541
2542 def sendmsgToServer(self, *args):
2543 # Call sendmsg() on self.cli_sock with the given arguments,
2544 # filling in any arguments which are not supplied with the
2545 # corresponding items of self.sendmsg_to_server_defaults, if
2546 # any.
2547 return self.cli_sock.sendmsg(
2548 *(args + self.sendmsg_to_server_defaults[len(args):]))
2549
2550 def doRecvmsg(self, sock, bufsize, *args):
2551 # Call recvmsg() on sock with given arguments and return its
2552 # result. Should be used for tests which can use either
2553 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2554 # this method with one which emulates it using recvmsg_into(),
2555 # thus allowing the same test to be used for both methods.
2556 result = sock.recvmsg(bufsize, *args)
2557 self.registerRecvmsgResult(result)
2558 return result
2559
2560 def registerRecvmsgResult(self, result):
2561 # Called by doRecvmsg() with the return value of recvmsg() or
2562 # recvmsg_into(). Can be overridden to arrange cleanup based
2563 # on the returned ancillary data, for instance.
2564 pass
2565
2566 def checkRecvmsgAddress(self, addr1, addr2):
2567 # Called to compare the received address with the address of
2568 # the peer.
2569 self.assertEqual(addr1, addr2)
2570
2571 # Flags that are normally unset in msg_flags
2572 msg_flags_common_unset = 0
2573 for name in ("MSG_CTRUNC", "MSG_OOB"):
2574 msg_flags_common_unset |= getattr(socket, name, 0)
2575
2576 # Flags that are normally set
2577 msg_flags_common_set = 0
2578
2579 # Flags set when a complete record has been received (e.g. MSG_EOR
2580 # for SCTP)
2581 msg_flags_eor_indicator = 0
2582
2583 # Flags set when a complete record has not been received
2584 # (e.g. MSG_TRUNC for datagram sockets)
2585 msg_flags_non_eor_indicator = 0
2586
2587 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2588 # Method to check the value of msg_flags returned by recvmsg[_into]().
2589 #
2590 # Checks that all bits in msg_flags_common_set attribute are
2591 # set in "flags" and all bits in msg_flags_common_unset are
2592 # unset.
2593 #
2594 # The "eor" argument specifies whether the flags should
2595 # indicate that a full record (or datagram) has been received.
2596 # If "eor" is None, no checks are done; otherwise, checks
2597 # that:
2598 #
2599 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2600 # set and all bits in msg_flags_non_eor_indicator are unset
2601 #
2602 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2603 # are set and all bits in msg_flags_eor_indicator are unset
2604 #
2605 # If "checkset" and/or "checkunset" are supplied, they require
2606 # the given bits to be set or unset respectively, overriding
2607 # what the attributes require for those bits.
2608 #
2609 # If any bits are set in "ignore", they will not be checked,
2610 # regardless of the other inputs.
2611 #
2612 # Will raise Exception if the inputs require a bit to be both
2613 # set and unset, and it is not ignored.
2614
2615 defaultset = self.msg_flags_common_set
2616 defaultunset = self.msg_flags_common_unset
2617
2618 if eor:
2619 defaultset |= self.msg_flags_eor_indicator
2620 defaultunset |= self.msg_flags_non_eor_indicator
2621 elif eor is not None:
2622 defaultset |= self.msg_flags_non_eor_indicator
2623 defaultunset |= self.msg_flags_eor_indicator
2624
2625 # Function arguments override defaults
2626 defaultset &= ~checkunset
2627 defaultunset &= ~checkset
2628
2629 # Merge arguments with remaining defaults, and check for conflicts
2630 checkset |= defaultset
2631 checkunset |= defaultunset
2632 inboth = checkset & checkunset & ~ignore
2633 if inboth:
2634 raise Exception("contradictory set, unset requirements for flags "
2635 "{0:#x}".format(inboth))
2636
2637 # Compare with given msg_flags value
2638 mask = (checkset | checkunset) & ~ignore
2639 self.assertEqual(flags & mask, checkset & mask)
2640
2641
2642class RecvmsgIntoMixin(SendrecvmsgBase):
2643 # Mixin to implement doRecvmsg() using recvmsg_into().
2644
2645 def doRecvmsg(self, sock, bufsize, *args):
2646 buf = bytearray(bufsize)
2647 result = sock.recvmsg_into([buf], *args)
2648 self.registerRecvmsgResult(result)
2649 self.assertGreaterEqual(result[0], 0)
2650 self.assertLessEqual(result[0], bufsize)
2651 return (bytes(buf[:result[0]]),) + result[1:]
2652
2653
2654class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2655 # Defines flags to be checked in msg_flags for datagram sockets.
2656
2657 @property
2658 def msg_flags_non_eor_indicator(self):
2659 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2660
2661
2662class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2663 # Defines flags to be checked in msg_flags for SCTP sockets.
2664
2665 @property
2666 def msg_flags_eor_indicator(self):
2667 return super().msg_flags_eor_indicator | socket.MSG_EOR
2668
2669
2670class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2671 # Base class for tests on connectionless-mode sockets. Users must
2672 # supply sockets on attributes cli and serv to be mapped to
2673 # cli_sock and serv_sock respectively.
2674
2675 @property
2676 def serv_sock(self):
2677 return self.serv
2678
2679 @property
2680 def cli_sock(self):
2681 return self.cli
2682
2683 @property
2684 def sendmsg_to_server_defaults(self):
2685 return ([], [], 0, self.serv_addr)
2686
2687 def sendToServer(self, msg):
2688 return self.cli_sock.sendto(msg, self.serv_addr)
2689
2690
2691class SendrecvmsgConnectedBase(SendrecvmsgBase):
2692 # Base class for tests on connected sockets. Users must supply
2693 # sockets on attributes serv_conn and cli_conn (representing the
2694 # connections *to* the server and the client), to be mapped to
2695 # cli_sock and serv_sock respectively.
2696
2697 @property
2698 def serv_sock(self):
2699 return self.cli_conn
2700
2701 @property
2702 def cli_sock(self):
2703 return self.serv_conn
2704
2705 def checkRecvmsgAddress(self, addr1, addr2):
2706 # Address is currently "unspecified" for a connected socket,
2707 # so we don't examine it
2708 pass
2709
2710
2711class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2712 # Base class to set a timeout on server's socket.
2713
2714 def setUp(self):
2715 super().setUp()
2716 self.serv_sock.settimeout(self.fail_timeout)
2717
2718
2719class SendmsgTests(SendrecvmsgServerTimeoutBase):
2720 # Tests for sendmsg() which can use any socket type and do not
2721 # involve recvmsg() or recvmsg_into().
2722
2723 def testSendmsg(self):
2724 # Send a simple message with sendmsg().
2725 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2726
2727 def _testSendmsg(self):
2728 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2729
2730 def testSendmsgDataGenerator(self):
2731 # Send from buffer obtained from a generator (not a sequence).
2732 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2733
2734 def _testSendmsgDataGenerator(self):
2735 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2736 len(MSG))
2737
2738 def testSendmsgAncillaryGenerator(self):
2739 # Gather (empty) ancillary data from a generator.
2740 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2741
2742 def _testSendmsgAncillaryGenerator(self):
2743 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2744 len(MSG))
2745
2746 def testSendmsgArray(self):
2747 # Send data from an array instead of the usual bytes object.
2748 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2749
2750 def _testSendmsgArray(self):
2751 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2752 len(MSG))
2753
2754 def testSendmsgGather(self):
2755 # Send message data from more than one buffer (gather write).
2756 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2757
2758 def _testSendmsgGather(self):
2759 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2760
2761 def testSendmsgBadArgs(self):
2762 # Check that sendmsg() rejects invalid arguments.
2763 self.assertEqual(self.serv_sock.recv(1000), b"done")
2764
2765 def _testSendmsgBadArgs(self):
2766 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2767 self.assertRaises(TypeError, self.sendmsgToServer,
2768 b"not in an iterable")
2769 self.assertRaises(TypeError, self.sendmsgToServer,
2770 object())
2771 self.assertRaises(TypeError, self.sendmsgToServer,
2772 [object()])
2773 self.assertRaises(TypeError, self.sendmsgToServer,
2774 [MSG, 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], [], 0, object())
2781 self.sendToServer(b"done")
2782
2783 def testSendmsgBadCmsg(self):
2784 # Check that invalid ancillary data items are rejected.
2785 self.assertEqual(self.serv_sock.recv(1000), b"done")
2786
2787 def _testSendmsgBadCmsg(self):
2788 self.assertRaises(TypeError, self.sendmsgToServer,
2789 [MSG], [object()])
2790 self.assertRaises(TypeError, self.sendmsgToServer,
2791 [MSG], [(object(), 0, b"data")])
2792 self.assertRaises(TypeError, self.sendmsgToServer,
2793 [MSG], [(0, object(), b"data")])
2794 self.assertRaises(TypeError, self.sendmsgToServer,
2795 [MSG], [(0, 0, object())])
2796 self.assertRaises(TypeError, self.sendmsgToServer,
2797 [MSG], [(0, 0)])
2798 self.assertRaises(TypeError, self.sendmsgToServer,
2799 [MSG], [(0, 0, b"data", 42)])
2800 self.sendToServer(b"done")
2801
2802 @requireAttrs(socket, "CMSG_SPACE")
2803 def testSendmsgBadMultiCmsg(self):
2804 # Check that invalid ancillary data items are rejected when
2805 # more than one item is present.
2806 self.assertEqual(self.serv_sock.recv(1000), b"done")
2807
2808 @testSendmsgBadMultiCmsg.client_skip
2809 def _testSendmsgBadMultiCmsg(self):
2810 self.assertRaises(TypeError, self.sendmsgToServer,
2811 [MSG], [0, 0, b""])
2812 self.assertRaises(TypeError, self.sendmsgToServer,
2813 [MSG], [(0, 0, b""), object()])
2814 self.sendToServer(b"done")
2815
2816 def testSendmsgExcessCmsgReject(self):
2817 # Check that sendmsg() rejects excess ancillary data items
2818 # when the number that can be sent is limited.
2819 self.assertEqual(self.serv_sock.recv(1000), b"done")
2820
2821 def _testSendmsgExcessCmsgReject(self):
2822 if not hasattr(socket, "CMSG_SPACE"):
2823 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002824 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002825 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2826 self.assertIsNone(cm.exception.errno)
2827 self.sendToServer(b"done")
2828
2829 def testSendmsgAfterClose(self):
2830 # Check that sendmsg() fails on a closed socket.
2831 pass
2832
2833 def _testSendmsgAfterClose(self):
2834 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002835 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002836
2837
2838class SendmsgStreamTests(SendmsgTests):
2839 # Tests for sendmsg() which require a stream socket and do not
2840 # involve recvmsg() or recvmsg_into().
2841
2842 def testSendmsgExplicitNoneAddr(self):
2843 # Check that peer address can be specified as None.
2844 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2845
2846 def _testSendmsgExplicitNoneAddr(self):
2847 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2848
2849 def testSendmsgTimeout(self):
2850 # Check that timeout works with sendmsg().
2851 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2852 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2853
2854 def _testSendmsgTimeout(self):
2855 try:
2856 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002857 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002858 while True:
2859 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002860 except socket.timeout:
2861 pass
2862 except OSError as exc:
2863 if exc.errno != errno.ENOMEM:
2864 raise
2865 # bpo-33937 the test randomly fails on Travis CI with
2866 # "OSError: [Errno 12] Cannot allocate memory"
2867 else:
2868 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002869 finally:
2870 self.misc_event.set()
2871
2872 # XXX: would be nice to have more tests for sendmsg flags argument.
2873
2874 # Linux supports MSG_DONTWAIT when sending, but in general, it
2875 # only works when receiving. Could add other platforms if they
2876 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002877 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002878 "MSG_DONTWAIT not known to work on this platform when "
2879 "sending")
2880 def testSendmsgDontWait(self):
2881 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2882 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2883 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2884
2885 @testSendmsgDontWait.client_skip
2886 def _testSendmsgDontWait(self):
2887 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002888 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002889 while True:
2890 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002891 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2892 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002893 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002894 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002895 finally:
2896 self.misc_event.set()
2897
2898
2899class SendmsgConnectionlessTests(SendmsgTests):
2900 # Tests for sendmsg() which require a connectionless-mode
2901 # (e.g. datagram) socket, and do not involve recvmsg() or
2902 # recvmsg_into().
2903
2904 def testSendmsgNoDestAddr(self):
2905 # Check that sendmsg() fails when no destination address is
2906 # given for unconnected socket.
2907 pass
2908
2909 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002910 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002911 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002912 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002913 [MSG], [], 0, None)
2914
2915
2916class RecvmsgGenericTests(SendrecvmsgBase):
2917 # Tests for recvmsg() which can also be emulated using
2918 # recvmsg_into(), and can use any socket type.
2919
2920 def testRecvmsg(self):
2921 # Receive a simple message with recvmsg[_into]().
2922 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2923 self.assertEqual(msg, MSG)
2924 self.checkRecvmsgAddress(addr, self.cli_addr)
2925 self.assertEqual(ancdata, [])
2926 self.checkFlags(flags, eor=True)
2927
2928 def _testRecvmsg(self):
2929 self.sendToServer(MSG)
2930
2931 def testRecvmsgExplicitDefaults(self):
2932 # Test recvmsg[_into]() with default arguments provided explicitly.
2933 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2934 len(MSG), 0, 0)
2935 self.assertEqual(msg, MSG)
2936 self.checkRecvmsgAddress(addr, self.cli_addr)
2937 self.assertEqual(ancdata, [])
2938 self.checkFlags(flags, eor=True)
2939
2940 def _testRecvmsgExplicitDefaults(self):
2941 self.sendToServer(MSG)
2942
2943 def testRecvmsgShorter(self):
2944 # Receive a message smaller than buffer.
2945 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2946 len(MSG) + 42)
2947 self.assertEqual(msg, MSG)
2948 self.checkRecvmsgAddress(addr, self.cli_addr)
2949 self.assertEqual(ancdata, [])
2950 self.checkFlags(flags, eor=True)
2951
2952 def _testRecvmsgShorter(self):
2953 self.sendToServer(MSG)
2954
2955 def testRecvmsgTrunc(self):
2956 # Receive part of message, check for truncation indicators.
2957 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2958 len(MSG) - 3)
2959 self.assertEqual(msg, MSG[:-3])
2960 self.checkRecvmsgAddress(addr, self.cli_addr)
2961 self.assertEqual(ancdata, [])
2962 self.checkFlags(flags, eor=False)
2963
2964 def _testRecvmsgTrunc(self):
2965 self.sendToServer(MSG)
2966
2967 def testRecvmsgShortAncillaryBuf(self):
2968 # Test ancillary data buffer too small to hold any ancillary data.
2969 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2970 len(MSG), 1)
2971 self.assertEqual(msg, MSG)
2972 self.checkRecvmsgAddress(addr, self.cli_addr)
2973 self.assertEqual(ancdata, [])
2974 self.checkFlags(flags, eor=True)
2975
2976 def _testRecvmsgShortAncillaryBuf(self):
2977 self.sendToServer(MSG)
2978
2979 def testRecvmsgLongAncillaryBuf(self):
2980 # Test large ancillary data buffer.
2981 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2982 len(MSG), 10240)
2983 self.assertEqual(msg, MSG)
2984 self.checkRecvmsgAddress(addr, self.cli_addr)
2985 self.assertEqual(ancdata, [])
2986 self.checkFlags(flags, eor=True)
2987
2988 def _testRecvmsgLongAncillaryBuf(self):
2989 self.sendToServer(MSG)
2990
2991 def testRecvmsgAfterClose(self):
2992 # Check that recvmsg[_into]() fails on a closed socket.
2993 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002994 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002995
2996 def _testRecvmsgAfterClose(self):
2997 pass
2998
2999 def testRecvmsgTimeout(self):
3000 # Check that timeout works.
3001 try:
3002 self.serv_sock.settimeout(0.03)
3003 self.assertRaises(socket.timeout,
3004 self.doRecvmsg, self.serv_sock, len(MSG))
3005 finally:
3006 self.misc_event.set()
3007
3008 def _testRecvmsgTimeout(self):
3009 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3010
3011 @requireAttrs(socket, "MSG_PEEK")
3012 def testRecvmsgPeek(self):
3013 # Check that MSG_PEEK in flags enables examination of pending
3014 # data without consuming it.
3015
3016 # Receive part of data with MSG_PEEK.
3017 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3018 len(MSG) - 3, 0,
3019 socket.MSG_PEEK)
3020 self.assertEqual(msg, MSG[:-3])
3021 self.checkRecvmsgAddress(addr, self.cli_addr)
3022 self.assertEqual(ancdata, [])
3023 # Ignoring MSG_TRUNC here (so this test is the same for stream
3024 # and datagram sockets). Some wording in POSIX seems to
3025 # suggest that it needn't be set when peeking, but that may
3026 # just be a slip.
3027 self.checkFlags(flags, eor=False,
3028 ignore=getattr(socket, "MSG_TRUNC", 0))
3029
3030 # Receive all data with MSG_PEEK.
3031 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3032 len(MSG), 0,
3033 socket.MSG_PEEK)
3034 self.assertEqual(msg, MSG)
3035 self.checkRecvmsgAddress(addr, self.cli_addr)
3036 self.assertEqual(ancdata, [])
3037 self.checkFlags(flags, eor=True)
3038
3039 # Check that the same data can still be received normally.
3040 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3041 self.assertEqual(msg, MSG)
3042 self.checkRecvmsgAddress(addr, self.cli_addr)
3043 self.assertEqual(ancdata, [])
3044 self.checkFlags(flags, eor=True)
3045
3046 @testRecvmsgPeek.client_skip
3047 def _testRecvmsgPeek(self):
3048 self.sendToServer(MSG)
3049
3050 @requireAttrs(socket.socket, "sendmsg")
3051 def testRecvmsgFromSendmsg(self):
3052 # Test receiving with recvmsg[_into]() when message is sent
3053 # using sendmsg().
3054 self.serv_sock.settimeout(self.fail_timeout)
3055 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3056 self.assertEqual(msg, MSG)
3057 self.checkRecvmsgAddress(addr, self.cli_addr)
3058 self.assertEqual(ancdata, [])
3059 self.checkFlags(flags, eor=True)
3060
3061 @testRecvmsgFromSendmsg.client_skip
3062 def _testRecvmsgFromSendmsg(self):
3063 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3064
3065
3066class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3067 # Tests which require a stream socket and can use either recvmsg()
3068 # or recvmsg_into().
3069
3070 def testRecvmsgEOF(self):
3071 # Receive end-of-stream indicator (b"", peer socket closed).
3072 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3073 self.assertEqual(msg, b"")
3074 self.checkRecvmsgAddress(addr, self.cli_addr)
3075 self.assertEqual(ancdata, [])
3076 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3077
3078 def _testRecvmsgEOF(self):
3079 self.cli_sock.close()
3080
3081 def testRecvmsgOverflow(self):
3082 # Receive a message in more than one chunk.
3083 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3084 len(MSG) - 3)
3085 self.checkRecvmsgAddress(addr, self.cli_addr)
3086 self.assertEqual(ancdata, [])
3087 self.checkFlags(flags, eor=False)
3088
3089 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3090 self.checkRecvmsgAddress(addr, self.cli_addr)
3091 self.assertEqual(ancdata, [])
3092 self.checkFlags(flags, eor=True)
3093
3094 msg = seg1 + seg2
3095 self.assertEqual(msg, MSG)
3096
3097 def _testRecvmsgOverflow(self):
3098 self.sendToServer(MSG)
3099
3100
3101class RecvmsgTests(RecvmsgGenericTests):
3102 # Tests for recvmsg() which can use any socket type.
3103
3104 def testRecvmsgBadArgs(self):
3105 # Check that recvmsg() rejects invalid arguments.
3106 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3107 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3108 -1, 0, 0)
3109 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3110 len(MSG), -1, 0)
3111 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3112 [bytearray(10)], 0, 0)
3113 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3114 object(), 0, 0)
3115 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3116 len(MSG), object(), 0)
3117 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3118 len(MSG), 0, object())
3119
3120 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3121 self.assertEqual(msg, MSG)
3122 self.checkRecvmsgAddress(addr, self.cli_addr)
3123 self.assertEqual(ancdata, [])
3124 self.checkFlags(flags, eor=True)
3125
3126 def _testRecvmsgBadArgs(self):
3127 self.sendToServer(MSG)
3128
3129
3130class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3131 # Tests for recvmsg_into() which can use any socket type.
3132
3133 def testRecvmsgIntoBadArgs(self):
3134 # Check that recvmsg_into() rejects invalid arguments.
3135 buf = bytearray(len(MSG))
3136 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3137 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3138 len(MSG), 0, 0)
3139 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3140 buf, 0, 0)
3141 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3142 [object()], 0, 0)
3143 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3144 [b"I'm not writable"], 0, 0)
3145 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3146 [buf, object()], 0, 0)
3147 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3148 [buf], -1, 0)
3149 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3150 [buf], object(), 0)
3151 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3152 [buf], 0, object())
3153
3154 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3155 self.assertEqual(nbytes, len(MSG))
3156 self.assertEqual(buf, bytearray(MSG))
3157 self.checkRecvmsgAddress(addr, self.cli_addr)
3158 self.assertEqual(ancdata, [])
3159 self.checkFlags(flags, eor=True)
3160
3161 def _testRecvmsgIntoBadArgs(self):
3162 self.sendToServer(MSG)
3163
3164 def testRecvmsgIntoGenerator(self):
3165 # Receive into buffer obtained from a generator (not a sequence).
3166 buf = bytearray(len(MSG))
3167 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3168 (o for o in [buf]))
3169 self.assertEqual(nbytes, len(MSG))
3170 self.assertEqual(buf, bytearray(MSG))
3171 self.checkRecvmsgAddress(addr, self.cli_addr)
3172 self.assertEqual(ancdata, [])
3173 self.checkFlags(flags, eor=True)
3174
3175 def _testRecvmsgIntoGenerator(self):
3176 self.sendToServer(MSG)
3177
3178 def testRecvmsgIntoArray(self):
3179 # Receive into an array rather than the usual bytearray.
3180 buf = array.array("B", [0] * len(MSG))
3181 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3182 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003183 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003184 self.checkRecvmsgAddress(addr, self.cli_addr)
3185 self.assertEqual(ancdata, [])
3186 self.checkFlags(flags, eor=True)
3187
3188 def _testRecvmsgIntoArray(self):
3189 self.sendToServer(MSG)
3190
3191 def testRecvmsgIntoScatter(self):
3192 # Receive into multiple buffers (scatter write).
3193 b1 = bytearray(b"----")
3194 b2 = bytearray(b"0123456789")
3195 b3 = bytearray(b"--------------")
3196 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3197 [b1, memoryview(b2)[2:9], b3])
3198 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3199 self.assertEqual(b1, bytearray(b"Mary"))
3200 self.assertEqual(b2, bytearray(b"01 had a 9"))
3201 self.assertEqual(b3, bytearray(b"little lamb---"))
3202 self.checkRecvmsgAddress(addr, self.cli_addr)
3203 self.assertEqual(ancdata, [])
3204 self.checkFlags(flags, eor=True)
3205
3206 def _testRecvmsgIntoScatter(self):
3207 self.sendToServer(b"Mary had a little lamb")
3208
3209
3210class CmsgMacroTests(unittest.TestCase):
3211 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3212 # assumptions used by sendmsg() and recvmsg[_into](), which share
3213 # code with these functions.
3214
3215 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003216 try:
3217 import _testcapi
3218 except ImportError:
3219 socklen_t_limit = 0x7fffffff
3220 else:
3221 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003222
3223 @requireAttrs(socket, "CMSG_LEN")
3224 def testCMSG_LEN(self):
3225 # Test CMSG_LEN() with various valid and invalid values,
3226 # checking the assumptions used by recvmsg() and sendmsg().
3227 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3228 values = list(range(257)) + list(range(toobig - 257, toobig))
3229
3230 # struct cmsghdr has at least three members, two of which are ints
3231 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3232 for n in values:
3233 ret = socket.CMSG_LEN(n)
3234 # This is how recvmsg() calculates the data size
3235 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3236 self.assertLessEqual(ret, self.socklen_t_limit)
3237
3238 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3239 # sendmsg() shares code with these functions, and requires
3240 # that it reject values over the limit.
3241 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3242 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3243
3244 @requireAttrs(socket, "CMSG_SPACE")
3245 def testCMSG_SPACE(self):
3246 # Test CMSG_SPACE() with various valid and invalid values,
3247 # checking the assumptions used by sendmsg().
3248 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3249 values = list(range(257)) + list(range(toobig - 257, toobig))
3250
3251 last = socket.CMSG_SPACE(0)
3252 # struct cmsghdr has at least three members, two of which are ints
3253 self.assertGreater(last, array.array("i").itemsize * 2)
3254 for n in values:
3255 ret = socket.CMSG_SPACE(n)
3256 self.assertGreaterEqual(ret, last)
3257 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3258 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3259 self.assertLessEqual(ret, self.socklen_t_limit)
3260 last = ret
3261
3262 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3263 # sendmsg() shares code with these functions, and requires
3264 # that it reject values over the limit.
3265 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3266 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3267
3268
3269class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3270 # Tests for file descriptor passing on Unix-domain sockets.
3271
3272 # Invalid file descriptor value that's unlikely to evaluate to a
3273 # real FD even if one of its bytes is replaced with a different
3274 # value (which shouldn't actually happen).
3275 badfd = -0x5555
3276
3277 def newFDs(self, n):
3278 # Return a list of n file descriptors for newly-created files
3279 # containing their list indices as ASCII numbers.
3280 fds = []
3281 for i in range(n):
3282 fd, path = tempfile.mkstemp()
3283 self.addCleanup(os.unlink, path)
3284 self.addCleanup(os.close, fd)
3285 os.write(fd, str(i).encode())
3286 fds.append(fd)
3287 return fds
3288
3289 def checkFDs(self, fds):
3290 # Check that the file descriptors in the given list contain
3291 # their correct list indices as ASCII numbers.
3292 for n, fd in enumerate(fds):
3293 os.lseek(fd, 0, os.SEEK_SET)
3294 self.assertEqual(os.read(fd, 1024), str(n).encode())
3295
3296 def registerRecvmsgResult(self, result):
3297 self.addCleanup(self.closeRecvmsgFDs, result)
3298
3299 def closeRecvmsgFDs(self, recvmsg_result):
3300 # Close all file descriptors specified in the ancillary data
3301 # of the given return value from recvmsg() or recvmsg_into().
3302 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3303 if (cmsg_level == socket.SOL_SOCKET and
3304 cmsg_type == socket.SCM_RIGHTS):
3305 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003306 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003307 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3308 for fd in fds:
3309 os.close(fd)
3310
3311 def createAndSendFDs(self, n):
3312 # Send n new file descriptors created by newFDs() to the
3313 # server, with the constant MSG as the non-ancillary data.
3314 self.assertEqual(
3315 self.sendmsgToServer([MSG],
3316 [(socket.SOL_SOCKET,
3317 socket.SCM_RIGHTS,
3318 array.array("i", self.newFDs(n)))]),
3319 len(MSG))
3320
3321 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3322 # Check that constant MSG was received with numfds file
3323 # descriptors in a maximum of maxcmsgs control messages (which
3324 # must contain only complete integers). By default, check
3325 # that MSG_CTRUNC is unset, but ignore any flags in
3326 # ignoreflags.
3327 msg, ancdata, flags, addr = result
3328 self.assertEqual(msg, MSG)
3329 self.checkRecvmsgAddress(addr, self.cli_addr)
3330 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3331 ignore=ignoreflags)
3332
3333 self.assertIsInstance(ancdata, list)
3334 self.assertLessEqual(len(ancdata), maxcmsgs)
3335 fds = array.array("i")
3336 for item in ancdata:
3337 self.assertIsInstance(item, tuple)
3338 cmsg_level, cmsg_type, cmsg_data = item
3339 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3340 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3341 self.assertIsInstance(cmsg_data, bytes)
3342 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003343 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003344
3345 self.assertEqual(len(fds), numfds)
3346 self.checkFDs(fds)
3347
3348 def testFDPassSimple(self):
3349 # Pass a single FD (array read from bytes object).
3350 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3351 len(MSG), 10240))
3352
3353 def _testFDPassSimple(self):
3354 self.assertEqual(
3355 self.sendmsgToServer(
3356 [MSG],
3357 [(socket.SOL_SOCKET,
3358 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003359 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003360 len(MSG))
3361
3362 def testMultipleFDPass(self):
3363 # Pass multiple FDs in a single array.
3364 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3365 len(MSG), 10240))
3366
3367 def _testMultipleFDPass(self):
3368 self.createAndSendFDs(4)
3369
3370 @requireAttrs(socket, "CMSG_SPACE")
3371 def testFDPassCMSG_SPACE(self):
3372 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3373 self.checkRecvmsgFDs(
3374 4, self.doRecvmsg(self.serv_sock, len(MSG),
3375 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3376
3377 @testFDPassCMSG_SPACE.client_skip
3378 def _testFDPassCMSG_SPACE(self):
3379 self.createAndSendFDs(4)
3380
3381 def testFDPassCMSG_LEN(self):
3382 # Test using CMSG_LEN() to calculate ancillary buffer size.
3383 self.checkRecvmsgFDs(1,
3384 self.doRecvmsg(self.serv_sock, len(MSG),
3385 socket.CMSG_LEN(4 * SIZEOF_INT)),
3386 # RFC 3542 says implementations may set
3387 # MSG_CTRUNC if there isn't enough space
3388 # for trailing padding.
3389 ignoreflags=socket.MSG_CTRUNC)
3390
3391 def _testFDPassCMSG_LEN(self):
3392 self.createAndSendFDs(1)
3393
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003394 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003395 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003396 @requireAttrs(socket, "CMSG_SPACE")
3397 def testFDPassSeparate(self):
3398 # Pass two FDs in two separate arrays. Arrays may be combined
3399 # into a single control message by the OS.
3400 self.checkRecvmsgFDs(2,
3401 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3402 maxcmsgs=2)
3403
3404 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003405 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003406 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003407 def _testFDPassSeparate(self):
3408 fd0, fd1 = self.newFDs(2)
3409 self.assertEqual(
3410 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3411 socket.SCM_RIGHTS,
3412 array.array("i", [fd0])),
3413 (socket.SOL_SOCKET,
3414 socket.SCM_RIGHTS,
3415 array.array("i", [fd1]))]),
3416 len(MSG))
3417
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003418 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003419 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003420 @requireAttrs(socket, "CMSG_SPACE")
3421 def testFDPassSeparateMinSpace(self):
3422 # Pass two FDs in two separate arrays, receiving them into the
3423 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003424 num_fds = 2
3425 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003426 self.doRecvmsg(self.serv_sock, len(MSG),
3427 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003428 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003429 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3430
3431 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003432 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003433 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003434 def _testFDPassSeparateMinSpace(self):
3435 fd0, fd1 = self.newFDs(2)
3436 self.assertEqual(
3437 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3438 socket.SCM_RIGHTS,
3439 array.array("i", [fd0])),
3440 (socket.SOL_SOCKET,
3441 socket.SCM_RIGHTS,
3442 array.array("i", [fd1]))]),
3443 len(MSG))
3444
3445 def sendAncillaryIfPossible(self, msg, ancdata):
3446 # Try to send msg and ancdata to server, but if the system
3447 # call fails, just send msg with no ancillary data.
3448 try:
3449 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003450 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451 # Check that it was the system call that failed
3452 self.assertIsInstance(e.errno, int)
3453 nbytes = self.sendmsgToServer([msg])
3454 self.assertEqual(nbytes, len(msg))
3455
Brett Cannon3bbad122015-12-28 17:21:44 -08003456 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003457 def testFDPassEmpty(self):
3458 # Try to pass an empty FD array. Can receive either no array
3459 # or an empty array.
3460 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3461 len(MSG), 10240),
3462 ignoreflags=socket.MSG_CTRUNC)
3463
3464 def _testFDPassEmpty(self):
3465 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3466 socket.SCM_RIGHTS,
3467 b"")])
3468
3469 def testFDPassPartialInt(self):
3470 # Try to pass a truncated FD array.
3471 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3472 len(MSG), 10240)
3473 self.assertEqual(msg, MSG)
3474 self.checkRecvmsgAddress(addr, self.cli_addr)
3475 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3476 self.assertLessEqual(len(ancdata), 1)
3477 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3478 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3479 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3480 self.assertLess(len(cmsg_data), SIZEOF_INT)
3481
3482 def _testFDPassPartialInt(self):
3483 self.sendAncillaryIfPossible(
3484 MSG,
3485 [(socket.SOL_SOCKET,
3486 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003487 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003488
3489 @requireAttrs(socket, "CMSG_SPACE")
3490 def testFDPassPartialIntInMiddle(self):
3491 # Try to pass two FD arrays, the first of which is truncated.
3492 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3493 len(MSG), 10240)
3494 self.assertEqual(msg, MSG)
3495 self.checkRecvmsgAddress(addr, self.cli_addr)
3496 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3497 self.assertLessEqual(len(ancdata), 2)
3498 fds = array.array("i")
3499 # Arrays may have been combined in a single control message
3500 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3501 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3502 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003503 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003504 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3505 self.assertLessEqual(len(fds), 2)
3506 self.checkFDs(fds)
3507
3508 @testFDPassPartialIntInMiddle.client_skip
3509 def _testFDPassPartialIntInMiddle(self):
3510 fd0, fd1 = self.newFDs(2)
3511 self.sendAncillaryIfPossible(
3512 MSG,
3513 [(socket.SOL_SOCKET,
3514 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003515 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003516 (socket.SOL_SOCKET,
3517 socket.SCM_RIGHTS,
3518 array.array("i", [fd1]))])
3519
3520 def checkTruncatedHeader(self, result, ignoreflags=0):
3521 # Check that no ancillary data items are returned when data is
3522 # truncated inside the cmsghdr structure.
3523 msg, ancdata, flags, addr = result
3524 self.assertEqual(msg, MSG)
3525 self.checkRecvmsgAddress(addr, self.cli_addr)
3526 self.assertEqual(ancdata, [])
3527 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3528 ignore=ignoreflags)
3529
3530 def testCmsgTruncNoBufSize(self):
3531 # Check that no ancillary data is received when no buffer size
3532 # is specified.
3533 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3534 # BSD seems to set MSG_CTRUNC only
3535 # if an item has been partially
3536 # received.
3537 ignoreflags=socket.MSG_CTRUNC)
3538
3539 def _testCmsgTruncNoBufSize(self):
3540 self.createAndSendFDs(1)
3541
3542 def testCmsgTrunc0(self):
3543 # Check that no ancillary data is received when buffer size is 0.
3544 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3545 ignoreflags=socket.MSG_CTRUNC)
3546
3547 def _testCmsgTrunc0(self):
3548 self.createAndSendFDs(1)
3549
3550 # Check that no ancillary data is returned for various non-zero
3551 # (but still too small) buffer sizes.
3552
3553 def testCmsgTrunc1(self):
3554 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3555
3556 def _testCmsgTrunc1(self):
3557 self.createAndSendFDs(1)
3558
3559 def testCmsgTrunc2Int(self):
3560 # The cmsghdr structure has at least three members, two of
3561 # which are ints, so we still shouldn't see any ancillary
3562 # data.
3563 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3564 SIZEOF_INT * 2))
3565
3566 def _testCmsgTrunc2Int(self):
3567 self.createAndSendFDs(1)
3568
3569 def testCmsgTruncLen0Minus1(self):
3570 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3571 socket.CMSG_LEN(0) - 1))
3572
3573 def _testCmsgTruncLen0Minus1(self):
3574 self.createAndSendFDs(1)
3575
3576 # The following tests try to truncate the control message in the
3577 # middle of the FD array.
3578
3579 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3580 # Check that file descriptor data is truncated to between
3581 # mindata and maxdata bytes when received with buffer size
3582 # ancbuf, and that any complete file descriptor numbers are
3583 # valid.
3584 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3585 len(MSG), ancbuf)
3586 self.assertEqual(msg, MSG)
3587 self.checkRecvmsgAddress(addr, self.cli_addr)
3588 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3589
3590 if mindata == 0 and ancdata == []:
3591 return
3592 self.assertEqual(len(ancdata), 1)
3593 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3594 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3595 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3596 self.assertGreaterEqual(len(cmsg_data), mindata)
3597 self.assertLessEqual(len(cmsg_data), maxdata)
3598 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003599 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003600 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3601 self.checkFDs(fds)
3602
3603 def testCmsgTruncLen0(self):
3604 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3605
3606 def _testCmsgTruncLen0(self):
3607 self.createAndSendFDs(1)
3608
3609 def testCmsgTruncLen0Plus1(self):
3610 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3611
3612 def _testCmsgTruncLen0Plus1(self):
3613 self.createAndSendFDs(2)
3614
3615 def testCmsgTruncLen1(self):
3616 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3617 maxdata=SIZEOF_INT)
3618
3619 def _testCmsgTruncLen1(self):
3620 self.createAndSendFDs(2)
3621
3622 def testCmsgTruncLen2Minus1(self):
3623 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3624 maxdata=(2 * SIZEOF_INT) - 1)
3625
3626 def _testCmsgTruncLen2Minus1(self):
3627 self.createAndSendFDs(2)
3628
3629
3630class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3631 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3632 # features of the RFC 3542 Advanced Sockets API for IPv6.
3633 # Currently we can only handle certain data items (e.g. traffic
3634 # class, hop limit, MTU discovery and fragmentation settings)
3635 # without resorting to unportable means such as the struct module,
3636 # but the tests here are aimed at testing the ancillary data
3637 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3638 # itself.
3639
3640 # Test value to use when setting hop limit of packet
3641 hop_limit = 2
3642
3643 # Test value to use when setting traffic class of packet.
3644 # -1 means "use kernel default".
3645 traffic_class = -1
3646
3647 def ancillaryMapping(self, ancdata):
3648 # Given ancillary data list ancdata, return a mapping from
3649 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3650 # Check that no (level, type) pair appears more than once.
3651 d = {}
3652 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3653 self.assertNotIn((cmsg_level, cmsg_type), d)
3654 d[(cmsg_level, cmsg_type)] = cmsg_data
3655 return d
3656
3657 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3658 # Receive hop limit into ancbufsize bytes of ancillary data
3659 # space. Check that data is MSG, ancillary data is not
3660 # truncated (but ignore any flags in ignoreflags), and hop
3661 # limit is between 0 and maxhop inclusive.
3662 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3663 socket.IPV6_RECVHOPLIMIT, 1)
3664 self.misc_event.set()
3665 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3666 len(MSG), ancbufsize)
3667
3668 self.assertEqual(msg, MSG)
3669 self.checkRecvmsgAddress(addr, self.cli_addr)
3670 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3671 ignore=ignoreflags)
3672
3673 self.assertEqual(len(ancdata), 1)
3674 self.assertIsInstance(ancdata[0], tuple)
3675 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3676 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3677 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3678 self.assertIsInstance(cmsg_data, bytes)
3679 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3680 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003681 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003682 self.assertGreaterEqual(a[0], 0)
3683 self.assertLessEqual(a[0], maxhop)
3684
3685 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3686 def testRecvHopLimit(self):
3687 # Test receiving the packet hop limit as ancillary data.
3688 self.checkHopLimit(ancbufsize=10240)
3689
3690 @testRecvHopLimit.client_skip
3691 def _testRecvHopLimit(self):
3692 # Need to wait until server has asked to receive ancillary
3693 # data, as implementations are not required to buffer it
3694 # otherwise.
3695 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3696 self.sendToServer(MSG)
3697
3698 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3699 def testRecvHopLimitCMSG_SPACE(self):
3700 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3701 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3702
3703 @testRecvHopLimitCMSG_SPACE.client_skip
3704 def _testRecvHopLimitCMSG_SPACE(self):
3705 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3706 self.sendToServer(MSG)
3707
3708 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3709 # 3542 says portable applications must provide space for trailing
3710 # padding. Implementations may set MSG_CTRUNC if there isn't
3711 # enough space for the padding.
3712
3713 @requireAttrs(socket.socket, "sendmsg")
3714 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3715 def testSetHopLimit(self):
3716 # Test setting hop limit on outgoing packet and receiving it
3717 # at the other end.
3718 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3719
3720 @testSetHopLimit.client_skip
3721 def _testSetHopLimit(self):
3722 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3723 self.assertEqual(
3724 self.sendmsgToServer([MSG],
3725 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3726 array.array("i", [self.hop_limit]))]),
3727 len(MSG))
3728
3729 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3730 ignoreflags=0):
3731 # Receive traffic class and hop limit into ancbufsize bytes of
3732 # ancillary data space. Check that data is MSG, ancillary
3733 # data is not truncated (but ignore any flags in ignoreflags),
3734 # and traffic class and hop limit are in range (hop limit no
3735 # more than maxhop).
3736 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3737 socket.IPV6_RECVHOPLIMIT, 1)
3738 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3739 socket.IPV6_RECVTCLASS, 1)
3740 self.misc_event.set()
3741 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3742 len(MSG), ancbufsize)
3743
3744 self.assertEqual(msg, MSG)
3745 self.checkRecvmsgAddress(addr, self.cli_addr)
3746 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3747 ignore=ignoreflags)
3748 self.assertEqual(len(ancdata), 2)
3749 ancmap = self.ancillaryMapping(ancdata)
3750
3751 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3752 self.assertEqual(len(tcdata), SIZEOF_INT)
3753 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003754 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003755 self.assertGreaterEqual(a[0], 0)
3756 self.assertLessEqual(a[0], 255)
3757
3758 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3759 self.assertEqual(len(hldata), SIZEOF_INT)
3760 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003761 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003762 self.assertGreaterEqual(a[0], 0)
3763 self.assertLessEqual(a[0], maxhop)
3764
3765 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3766 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3767 def testRecvTrafficClassAndHopLimit(self):
3768 # Test receiving traffic class and hop limit as ancillary data.
3769 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3770
3771 @testRecvTrafficClassAndHopLimit.client_skip
3772 def _testRecvTrafficClassAndHopLimit(self):
3773 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3774 self.sendToServer(MSG)
3775
3776 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3777 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3778 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3779 # Test receiving traffic class and hop limit, using
3780 # CMSG_SPACE() to calculate buffer size.
3781 self.checkTrafficClassAndHopLimit(
3782 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3783
3784 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3785 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3786 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3787 self.sendToServer(MSG)
3788
3789 @requireAttrs(socket.socket, "sendmsg")
3790 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3791 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3792 def testSetTrafficClassAndHopLimit(self):
3793 # Test setting traffic class and hop limit on outgoing packet,
3794 # and receiving them at the other end.
3795 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3796 maxhop=self.hop_limit)
3797
3798 @testSetTrafficClassAndHopLimit.client_skip
3799 def _testSetTrafficClassAndHopLimit(self):
3800 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3801 self.assertEqual(
3802 self.sendmsgToServer([MSG],
3803 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3804 array.array("i", [self.traffic_class])),
3805 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3806 array.array("i", [self.hop_limit]))]),
3807 len(MSG))
3808
3809 @requireAttrs(socket.socket, "sendmsg")
3810 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3811 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3812 def testOddCmsgSize(self):
3813 # Try to send ancillary data with first item one byte too
3814 # long. Fall back to sending with correct size if this fails,
3815 # and check that second item was handled correctly.
3816 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3817 maxhop=self.hop_limit)
3818
3819 @testOddCmsgSize.client_skip
3820 def _testOddCmsgSize(self):
3821 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3822 try:
3823 nbytes = self.sendmsgToServer(
3824 [MSG],
3825 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003826 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003827 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3828 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003829 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003830 self.assertIsInstance(e.errno, int)
3831 nbytes = self.sendmsgToServer(
3832 [MSG],
3833 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3834 array.array("i", [self.traffic_class])),
3835 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3836 array.array("i", [self.hop_limit]))])
3837 self.assertEqual(nbytes, len(MSG))
3838
3839 # Tests for proper handling of truncated ancillary data
3840
3841 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3842 # Receive hop limit into ancbufsize bytes of ancillary data
3843 # space, which should be too small to contain the ancillary
3844 # data header (if ancbufsize is None, pass no second argument
3845 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3846 # (unless included in ignoreflags), and no ancillary data is
3847 # returned.
3848 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3849 socket.IPV6_RECVHOPLIMIT, 1)
3850 self.misc_event.set()
3851 args = () if ancbufsize is None else (ancbufsize,)
3852 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3853 len(MSG), *args)
3854
3855 self.assertEqual(msg, MSG)
3856 self.checkRecvmsgAddress(addr, self.cli_addr)
3857 self.assertEqual(ancdata, [])
3858 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3859 ignore=ignoreflags)
3860
3861 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3862 def testCmsgTruncNoBufSize(self):
3863 # Check that no ancillary data is received when no ancillary
3864 # buffer size is provided.
3865 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3866 # BSD seems to set
3867 # MSG_CTRUNC only if an item
3868 # has been partially
3869 # received.
3870 ignoreflags=socket.MSG_CTRUNC)
3871
3872 @testCmsgTruncNoBufSize.client_skip
3873 def _testCmsgTruncNoBufSize(self):
3874 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3875 self.sendToServer(MSG)
3876
3877 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3878 def testSingleCmsgTrunc0(self):
3879 # Check that no ancillary data is received when ancillary
3880 # buffer size is zero.
3881 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3882 ignoreflags=socket.MSG_CTRUNC)
3883
3884 @testSingleCmsgTrunc0.client_skip
3885 def _testSingleCmsgTrunc0(self):
3886 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3887 self.sendToServer(MSG)
3888
3889 # Check that no ancillary data is returned for various non-zero
3890 # (but still too small) buffer sizes.
3891
3892 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3893 def testSingleCmsgTrunc1(self):
3894 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3895
3896 @testSingleCmsgTrunc1.client_skip
3897 def _testSingleCmsgTrunc1(self):
3898 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3899 self.sendToServer(MSG)
3900
3901 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3902 def testSingleCmsgTrunc2Int(self):
3903 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3904
3905 @testSingleCmsgTrunc2Int.client_skip
3906 def _testSingleCmsgTrunc2Int(self):
3907 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3908 self.sendToServer(MSG)
3909
3910 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3911 def testSingleCmsgTruncLen0Minus1(self):
3912 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3913
3914 @testSingleCmsgTruncLen0Minus1.client_skip
3915 def _testSingleCmsgTruncLen0Minus1(self):
3916 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3917 self.sendToServer(MSG)
3918
3919 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3920 def testSingleCmsgTruncInData(self):
3921 # Test truncation of a control message inside its associated
3922 # data. The message may be returned with its data truncated,
3923 # or not returned at all.
3924 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3925 socket.IPV6_RECVHOPLIMIT, 1)
3926 self.misc_event.set()
3927 msg, ancdata, flags, addr = self.doRecvmsg(
3928 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3929
3930 self.assertEqual(msg, MSG)
3931 self.checkRecvmsgAddress(addr, self.cli_addr)
3932 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3933
3934 self.assertLessEqual(len(ancdata), 1)
3935 if ancdata:
3936 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3937 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3938 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3939 self.assertLess(len(cmsg_data), SIZEOF_INT)
3940
3941 @testSingleCmsgTruncInData.client_skip
3942 def _testSingleCmsgTruncInData(self):
3943 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3944 self.sendToServer(MSG)
3945
3946 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3947 # Receive traffic class and hop limit into ancbufsize bytes of
3948 # ancillary data space, which should be large enough to
3949 # contain the first item, but too small to contain the header
3950 # of the second. Check that data is MSG, MSG_CTRUNC is set
3951 # (unless included in ignoreflags), and only one ancillary
3952 # data item is returned.
3953 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3954 socket.IPV6_RECVHOPLIMIT, 1)
3955 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3956 socket.IPV6_RECVTCLASS, 1)
3957 self.misc_event.set()
3958 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3959 len(MSG), ancbufsize)
3960
3961 self.assertEqual(msg, MSG)
3962 self.checkRecvmsgAddress(addr, self.cli_addr)
3963 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3964 ignore=ignoreflags)
3965
3966 self.assertEqual(len(ancdata), 1)
3967 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3968 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3969 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3970 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3971 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003972 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003973 self.assertGreaterEqual(a[0], 0)
3974 self.assertLessEqual(a[0], 255)
3975
3976 # Try the above test with various buffer sizes.
3977
3978 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3979 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3980 def testSecondCmsgTrunc0(self):
3981 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3982 ignoreflags=socket.MSG_CTRUNC)
3983
3984 @testSecondCmsgTrunc0.client_skip
3985 def _testSecondCmsgTrunc0(self):
3986 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3987 self.sendToServer(MSG)
3988
3989 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3990 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3991 def testSecondCmsgTrunc1(self):
3992 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3993
3994 @testSecondCmsgTrunc1.client_skip
3995 def _testSecondCmsgTrunc1(self):
3996 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3997 self.sendToServer(MSG)
3998
3999 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4000 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4001 def testSecondCmsgTrunc2Int(self):
4002 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4003 2 * SIZEOF_INT)
4004
4005 @testSecondCmsgTrunc2Int.client_skip
4006 def _testSecondCmsgTrunc2Int(self):
4007 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4008 self.sendToServer(MSG)
4009
4010 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4011 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4012 def testSecondCmsgTruncLen0Minus1(self):
4013 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
4014 socket.CMSG_LEN(0) - 1)
4015
4016 @testSecondCmsgTruncLen0Minus1.client_skip
4017 def _testSecondCmsgTruncLen0Minus1(self):
4018 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4019 self.sendToServer(MSG)
4020
4021 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
4022 "IPV6_RECVTCLASS", "IPV6_TCLASS")
4023 def testSecomdCmsgTruncInData(self):
4024 # Test truncation of the second of two control messages inside
4025 # its associated data.
4026 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4027 socket.IPV6_RECVHOPLIMIT, 1)
4028 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
4029 socket.IPV6_RECVTCLASS, 1)
4030 self.misc_event.set()
4031 msg, ancdata, flags, addr = self.doRecvmsg(
4032 self.serv_sock, len(MSG),
4033 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
4034
4035 self.assertEqual(msg, MSG)
4036 self.checkRecvmsgAddress(addr, self.cli_addr)
4037 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
4038
4039 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
4040
4041 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4042 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4043 cmsg_types.remove(cmsg_type)
4044 self.assertEqual(len(cmsg_data), SIZEOF_INT)
4045 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02004046 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004047 self.assertGreaterEqual(a[0], 0)
4048 self.assertLessEqual(a[0], 255)
4049
4050 if ancdata:
4051 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
4052 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
4053 cmsg_types.remove(cmsg_type)
4054 self.assertLess(len(cmsg_data), SIZEOF_INT)
4055
4056 self.assertEqual(ancdata, [])
4057
4058 @testSecomdCmsgTruncInData.client_skip
4059 def _testSecomdCmsgTruncInData(self):
4060 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4061 self.sendToServer(MSG)
4062
4063
4064# Derive concrete test classes for different socket types.
4065
4066class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4067 SendrecvmsgConnectionlessBase,
4068 ThreadedSocketTestMixin, UDPTestBase):
4069 pass
4070
4071@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004072class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4073 pass
4074
4075@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004076class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4077 pass
4078
4079@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004080class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4081 pass
4082
4083
4084class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4085 SendrecvmsgConnectionlessBase,
4086 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004087
4088 def checkRecvmsgAddress(self, addr1, addr2):
4089 # Called to compare the received address with the address of
4090 # the peer, ignoring scope ID
4091 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004092
4093@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004094@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004095@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004096class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4097 pass
4098
4099@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004100@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004101@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4103 pass
4104
4105@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004106@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004107@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004108class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4109 pass
4110
4111@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004112@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004113@requireAttrs(socket, "IPPROTO_IPV6")
4114@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004115class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4116 SendrecvmsgUDP6TestBase):
4117 pass
4118
4119@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004120@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004121@requireAttrs(socket, "IPPROTO_IPV6")
4122@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004123class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4124 RFC3542AncillaryTest,
4125 SendrecvmsgUDP6TestBase):
4126 pass
4127
4128
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004129@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4130 'UDPLITE sockets required for this test.')
4131class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4132 SendrecvmsgConnectionlessBase,
4133 ThreadedSocketTestMixin, UDPLITETestBase):
4134 pass
4135
4136@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4137 'UDPLITE sockets required for this test.')
4138@requireAttrs(socket.socket, "sendmsg")
4139class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4140 pass
4141
4142@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4143 'UDPLITE sockets required for this test.')
4144@requireAttrs(socket.socket, "recvmsg")
4145class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4146 pass
4147
4148@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4149 'UDPLITE sockets required for this test.')
4150@requireAttrs(socket.socket, "recvmsg_into")
4151class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4152 pass
4153
4154
4155@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4156 'UDPLITE sockets required for this test.')
4157class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4158 SendrecvmsgConnectionlessBase,
4159 ThreadedSocketTestMixin, UDPLITE6TestBase):
4160
4161 def checkRecvmsgAddress(self, addr1, addr2):
4162 # Called to compare the received address with the address of
4163 # the peer, ignoring scope ID
4164 self.assertEqual(addr1[:-1], addr2[:-1])
4165
4166@requireAttrs(socket.socket, "sendmsg")
4167@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4168@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4169 'UDPLITE sockets required for this test.')
4170@requireSocket("AF_INET6", "SOCK_DGRAM")
4171class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4172 pass
4173
4174@requireAttrs(socket.socket, "recvmsg")
4175@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4176@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4177 'UDPLITE sockets required for this test.')
4178@requireSocket("AF_INET6", "SOCK_DGRAM")
4179class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4180 pass
4181
4182@requireAttrs(socket.socket, "recvmsg_into")
4183@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4184@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4185 'UDPLITE sockets required for this test.')
4186@requireSocket("AF_INET6", "SOCK_DGRAM")
4187class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4188 pass
4189
4190@requireAttrs(socket.socket, "recvmsg")
4191@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4192@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4193 'UDPLITE sockets required for this test.')
4194@requireAttrs(socket, "IPPROTO_IPV6")
4195@requireSocket("AF_INET6", "SOCK_DGRAM")
4196class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4197 SendrecvmsgUDPLITE6TestBase):
4198 pass
4199
4200@requireAttrs(socket.socket, "recvmsg_into")
4201@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4202@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4203 'UDPLITE sockets required for this test.')
4204@requireAttrs(socket, "IPPROTO_IPV6")
4205@requireSocket("AF_INET6", "SOCK_DGRAM")
4206class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4207 RFC3542AncillaryTest,
4208 SendrecvmsgUDPLITE6TestBase):
4209 pass
4210
4211
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004212class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4213 ConnectedStreamTestMixin, TCPTestBase):
4214 pass
4215
4216@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004217class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4218 pass
4219
4220@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4222 SendrecvmsgTCPTestBase):
4223 pass
4224
4225@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004226class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4227 SendrecvmsgTCPTestBase):
4228 pass
4229
4230
4231class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4232 SendrecvmsgConnectedBase,
4233 ConnectedStreamTestMixin, SCTPStreamBase):
4234 pass
4235
4236@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004237@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004238@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004239class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4240 pass
4241
4242@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004243@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004244@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004245class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4246 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004247
4248 def testRecvmsgEOF(self):
4249 try:
4250 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4251 except OSError as e:
4252 if e.errno != errno.ENOTCONN:
4253 raise
4254 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004255
4256@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004257@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004258@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004259class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4260 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004261
4262 def testRecvmsgEOF(self):
4263 try:
4264 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4265 except OSError as e:
4266 if e.errno != errno.ENOTCONN:
4267 raise
4268 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004269
4270
4271class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4272 ConnectedStreamTestMixin, UnixStreamBase):
4273 pass
4274
4275@requireAttrs(socket.socket, "sendmsg")
4276@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004277class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4278 pass
4279
4280@requireAttrs(socket.socket, "recvmsg")
4281@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004282class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4283 SendrecvmsgUnixStreamTestBase):
4284 pass
4285
4286@requireAttrs(socket.socket, "recvmsg_into")
4287@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004288class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4289 SendrecvmsgUnixStreamTestBase):
4290 pass
4291
4292@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4293@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004294class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4295 pass
4296
4297@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4298@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004299class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4300 SendrecvmsgUnixStreamTestBase):
4301 pass
4302
4303
4304# Test interrupting the interruptible send/receive methods with a
4305# signal when a timeout is set. These tests avoid having multiple
4306# threads alive during the test so that the OS cannot deliver the
4307# signal to the wrong one.
4308
4309class InterruptedTimeoutBase(unittest.TestCase):
4310 # Base class for interrupted send/receive tests. Installs an
4311 # empty handler for SIGALRM and removes it on teardown, along with
4312 # any scheduled alarms.
4313
4314 def setUp(self):
4315 super().setUp()
4316 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004317 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004318 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004319
4320 # Timeout for socket operations
4321 timeout = 4.0
4322
4323 # Provide setAlarm() method to schedule delivery of SIGALRM after
4324 # given number of seconds, or cancel it if zero, and an
4325 # appropriate time value to use. Use setitimer() if available.
4326 if hasattr(signal, "setitimer"):
4327 alarm_time = 0.05
4328
4329 def setAlarm(self, seconds):
4330 signal.setitimer(signal.ITIMER_REAL, seconds)
4331 else:
4332 # Old systems may deliver the alarm up to one second early
4333 alarm_time = 2
4334
4335 def setAlarm(self, seconds):
4336 signal.alarm(seconds)
4337
4338
4339# Require siginterrupt() in order to ensure that system calls are
4340# interrupted by default.
4341@requireAttrs(signal, "siginterrupt")
4342@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4343 "Don't have signal.alarm or signal.setitimer")
4344class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4345 # Test interrupting the recv*() methods with signals when a
4346 # timeout is set.
4347
4348 def setUp(self):
4349 super().setUp()
4350 self.serv.settimeout(self.timeout)
4351
4352 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004353 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004354 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004355 try:
4356 self.setAlarm(self.alarm_time)
4357 with self.assertRaises(ZeroDivisionError) as cm:
4358 func(*args, **kwargs)
4359 finally:
4360 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004361
4362 def testInterruptedRecvTimeout(self):
4363 self.checkInterruptedRecv(self.serv.recv, 1024)
4364
4365 def testInterruptedRecvIntoTimeout(self):
4366 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4367
4368 def testInterruptedRecvfromTimeout(self):
4369 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4370
4371 def testInterruptedRecvfromIntoTimeout(self):
4372 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4373
4374 @requireAttrs(socket.socket, "recvmsg")
4375 def testInterruptedRecvmsgTimeout(self):
4376 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4377
4378 @requireAttrs(socket.socket, "recvmsg_into")
4379 def testInterruptedRecvmsgIntoTimeout(self):
4380 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4381
4382
4383# Require siginterrupt() in order to ensure that system calls are
4384# interrupted by default.
4385@requireAttrs(signal, "siginterrupt")
4386@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4387 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004388class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4389 ThreadSafeCleanupTestCase,
4390 SocketListeningTestMixin, TCPTestBase):
4391 # Test interrupting the interruptible send*() methods with signals
4392 # when a timeout is set.
4393
4394 def setUp(self):
4395 super().setUp()
4396 self.serv_conn = self.newSocket()
4397 self.addCleanup(self.serv_conn.close)
4398 # Use a thread to complete the connection, but wait for it to
4399 # terminate before running the test, so that there is only one
4400 # thread to accept the signal.
4401 cli_thread = threading.Thread(target=self.doConnect)
4402 cli_thread.start()
4403 self.cli_conn, addr = self.serv.accept()
4404 self.addCleanup(self.cli_conn.close)
4405 cli_thread.join()
4406 self.serv_conn.settimeout(self.timeout)
4407
4408 def doConnect(self):
4409 self.serv_conn.connect(self.serv_addr)
4410
4411 def checkInterruptedSend(self, func, *args, **kwargs):
4412 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004413 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004414 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004415 try:
4416 with self.assertRaises(ZeroDivisionError) as cm:
4417 while True:
4418 self.setAlarm(self.alarm_time)
4419 func(*args, **kwargs)
4420 finally:
4421 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004422
Ned Deilyc5640382014-02-03 13:58:31 -08004423 # Issue #12958: The following tests have problems on OS X prior to 10.7
4424 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425 def testInterruptedSendTimeout(self):
4426 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4427
Ned Deilyc5640382014-02-03 13:58:31 -08004428 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004429 def testInterruptedSendtoTimeout(self):
4430 # Passing an actual address here as Python's wrapper for
4431 # sendto() doesn't allow passing a zero-length one; POSIX
4432 # requires that the address is ignored since the socket is
4433 # connection-mode, however.
4434 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4435 self.serv_addr)
4436
Ned Deilyc5640382014-02-03 13:58:31 -08004437 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004438 @requireAttrs(socket.socket, "sendmsg")
4439 def testInterruptedSendmsgTimeout(self):
4440 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4441
4442
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004443class TCPCloserTest(ThreadedTCPSocketTest):
4444
4445 def testClose(self):
4446 conn, addr = self.serv.accept()
4447 conn.close()
4448
4449 sd = self.cli
4450 read, write, err = select.select([sd], [], [], 1.0)
4451 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004452 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004453
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004454 # Calling close() many times should be safe.
4455 conn.close()
4456 conn.close()
4457
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004458 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004459 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004460 time.sleep(1.0)
4461
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004462
Dave Cole331708b2004-08-09 04:51:41 +00004463class BasicSocketPairTest(SocketPairTest):
4464
4465 def __init__(self, methodName='runTest'):
4466 SocketPairTest.__init__(self, methodName=methodName)
4467
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004468 def _check_defaults(self, sock):
4469 self.assertIsInstance(sock, socket.socket)
4470 if hasattr(socket, 'AF_UNIX'):
4471 self.assertEqual(sock.family, socket.AF_UNIX)
4472 else:
4473 self.assertEqual(sock.family, socket.AF_INET)
4474 self.assertEqual(sock.type, socket.SOCK_STREAM)
4475 self.assertEqual(sock.proto, 0)
4476
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004477 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004478 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004479
4480 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004481 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004482
Dave Cole331708b2004-08-09 04:51:41 +00004483 def testRecv(self):
4484 msg = self.serv.recv(1024)
4485 self.assertEqual(msg, MSG)
4486
4487 def _testRecv(self):
4488 self.cli.send(MSG)
4489
4490 def testSend(self):
4491 self.serv.send(MSG)
4492
4493 def _testSend(self):
4494 msg = self.cli.recv(1024)
4495 self.assertEqual(msg, MSG)
4496
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004497
Guido van Rossum24e4af82002-06-12 19:18:08 +00004498class NonBlockingTCPTests(ThreadedTCPSocketTest):
4499
4500 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004501 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004502 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4503
Victor Stinner304315d2018-11-30 13:22:44 +01004504 def assert_sock_timeout(self, sock, timeout):
4505 self.assertEqual(self.serv.gettimeout(), timeout)
4506
4507 blocking = (timeout != 0.0)
4508 self.assertEqual(sock.getblocking(), blocking)
4509
4510 if fcntl is not None:
4511 # When a Python socket has a non-zero timeout, it's switched
4512 # internally to a non-blocking mode. Later, sock.sendall(),
4513 # sock.recv(), and other socket operations use a select() call and
4514 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4515 # timeouts are enforced.
4516 fd_blocking = (timeout is None)
4517
4518 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4519 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4520
Guido van Rossum24e4af82002-06-12 19:18:08 +00004521 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004522 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004523 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004524 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004525
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004526 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004527 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004528
4529 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004530 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004531
4532 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004533 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004534
4535 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004536 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004537
4538 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004539 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004540
4541 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004542 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004543
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004544 @support.cpython_only
4545 def testSetBlocking_overflow(self):
4546 # Issue 15989
4547 import _testcapi
4548 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4549 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004550
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004551 self.serv.setblocking(False)
4552 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004553
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004554 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4555 self.assertIsNone(self.serv.gettimeout())
4556
4557 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4558
Serhiy Storchaka43767632013-11-03 21:31:38 +02004559 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4560 'test needs socket.SOCK_NONBLOCK')
4561 @support.requires_linux_version(2, 6, 28)
4562 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004563 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004564 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004565 self.serv = socket.socket(socket.AF_INET,
4566 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4567 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004568
4569 def _testInitNonBlocking(self):
4570 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004571
Victor Stinner304315d2018-11-30 13:22:44 +01004572 def testInheritFlagsBlocking(self):
4573 # bpo-7995: accept() on a listening socket with a timeout and the
4574 # default timeout is None, the resulting socket must be blocking.
4575 with socket_setdefaulttimeout(None):
4576 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004577 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004578 self.addCleanup(conn.close)
4579 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004580
Victor Stinner304315d2018-11-30 13:22:44 +01004581 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004582 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004583
4584 def testInheritFlagsTimeout(self):
4585 # bpo-7995: accept() on a listening socket with a timeout and the
4586 # default timeout is None, the resulting socket must inherit
4587 # the default timeout.
4588 default_timeout = 20.0
4589 with socket_setdefaulttimeout(default_timeout):
4590 self.serv.settimeout(10)
4591 conn, addr = self.serv.accept()
4592 self.addCleanup(conn.close)
4593 self.assertEqual(conn.gettimeout(), default_timeout)
4594
4595 def _testInheritFlagsTimeout(self):
4596 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004597
Guido van Rossum24e4af82002-06-12 19:18:08 +00004598 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004599 # Testing non-blocking accept
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004600 self.serv.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004601
4602 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004603 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004604 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004605 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004606 dt = time.monotonic() - start_time
4607 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004608
4609 self.event.set()
4610
4611 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4612 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004613 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004614
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004615 # connect() completed: non-blocking accept() doesn't block
4616 conn, addr = self.serv.accept()
4617 self.addCleanup(conn.close)
4618 self.assertIsNone(conn.gettimeout())
4619
Guido van Rossum24e4af82002-06-12 19:18:08 +00004620 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004621 # don't connect before event is set to check
4622 # that non-blocking accept() raises BlockingIOError
4623 self.event.wait()
4624
Christian Heimes5e696852008-04-09 08:37:03 +00004625 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004626
Guido van Rossum24e4af82002-06-12 19:18:08 +00004627 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004628 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004629 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004630 self.addCleanup(conn.close)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03004631 conn.setblocking(False)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004632
4633 # the server didn't send data yet: non-blocking recv() fails
4634 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004635 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004636
4637 self.event.set()
4638
4639 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4640 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004641 self.fail("Error during select call to non-blocking socket.")
4642
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004643 # the server sent data yet: non-blocking recv() doesn't block
4644 msg = conn.recv(len(MSG))
4645 self.assertEqual(msg, MSG)
4646
Guido van Rossum24e4af82002-06-12 19:18:08 +00004647 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004648 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004649
4650 # don't send anything before event is set to check
4651 # that non-blocking recv() raises BlockingIOError
4652 self.event.wait()
4653
4654 # send data: recv() will no longer block
4655 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004656
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004657
Guido van Rossum24e4af82002-06-12 19:18:08 +00004658class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004659 """Unit tests for the object returned by socket.makefile()
4660
Antoine Pitrou834bd812010-10-13 16:17:14 +00004661 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004662 the client connection. You can read from this file to
4663 get output from the server.
4664
Antoine Pitrou834bd812010-10-13 16:17:14 +00004665 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004666 server connection. You can write to this file to send output
4667 to the client.
4668 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004669
Guido van Rossume9f66142002-08-07 15:46:19 +00004670 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004671 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004672 errors = 'strict'
4673 newline = None
4674
4675 read_mode = 'rb'
4676 read_msg = MSG
4677 write_mode = 'wb'
4678 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004679
Guido van Rossum24e4af82002-06-12 19:18:08 +00004680 def __init__(self, methodName='runTest'):
4681 SocketConnectedTest.__init__(self, methodName=methodName)
4682
4683 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004684 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4685 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004686 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004687 self.read_file = self.cli_conn.makefile(
4688 self.read_mode, self.bufsize,
4689 encoding = self.encoding,
4690 errors = self.errors,
4691 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004692
4693 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004694 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004695 self.read_file.close()
4696 self.assertTrue(self.read_file.closed)
4697 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004698 SocketConnectedTest.tearDown(self)
4699
4700 def clientSetUp(self):
4701 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004702 self.write_file = self.serv_conn.makefile(
4703 self.write_mode, self.bufsize,
4704 encoding = self.encoding,
4705 errors = self.errors,
4706 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004707
4708 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004709 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004710 self.write_file.close()
4711 self.assertTrue(self.write_file.closed)
4712 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004713 SocketConnectedTest.clientTearDown(self)
4714
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004715 def testReadAfterTimeout(self):
4716 # Issue #7322: A file object must disallow further reads
4717 # after a timeout has occurred.
4718 self.cli_conn.settimeout(1)
4719 self.read_file.read(3)
4720 # First read raises a timeout
4721 self.assertRaises(socket.timeout, self.read_file.read, 1)
4722 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004723 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004724 self.read_file.read(1)
4725 self.assertIn("cannot read from timed out object", str(ctx.exception))
4726
4727 def _testReadAfterTimeout(self):
4728 self.write_file.write(self.write_msg[0:3])
4729 self.write_file.flush()
4730 self.serv_finished.wait()
4731
Guido van Rossum24e4af82002-06-12 19:18:08 +00004732 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004733 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004734 first_seg = self.read_file.read(len(self.read_msg)-3)
4735 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004736 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004737 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004738
4739 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004740 self.write_file.write(self.write_msg)
4741 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004742
Guido van Rossum8c943832002-08-08 01:00:28 +00004743 def testFullRead(self):
4744 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004745 msg = self.read_file.read()
4746 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004747
4748 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004749 self.write_file.write(self.write_msg)
4750 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004751
Guido van Rossum24e4af82002-06-12 19:18:08 +00004752 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004753 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004754 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004755 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004756 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004757 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004758 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004759 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004760 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004761
4762 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004763 self.write_file.write(self.write_msg)
4764 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004765
4766 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004767 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004768 line = self.read_file.readline()
4769 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004770
4771 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004772 self.write_file.write(self.write_msg)
4773 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004774
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004775 def testCloseAfterMakefile(self):
4776 # The file returned by makefile should keep the socket open.
4777 self.cli_conn.close()
4778 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004779 msg = self.read_file.read()
4780 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004781
4782 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004783 self.write_file.write(self.write_msg)
4784 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004785
4786 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004787 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004788 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004789 if isinstance(self.read_msg, str):
4790 msg = msg.decode()
4791 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004792
4793 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004794 self.write_file.write(self.write_msg)
4795 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004796
Tim Peters116d83c2004-03-28 02:20:45 +00004797 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004798 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004799
4800 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004801 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004802
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004803 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004804 self.assertEqual(self.read_file.mode, self.read_mode)
4805 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004806
4807 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004808 self.assertEqual(self.write_file.mode, self.write_mode)
4809 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004810
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004811 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004812 self.read_file.close()
4813 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004814 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004815 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004816
4817 def _testRealClose(self):
4818 pass
4819
4820
Guido van Rossume9f66142002-08-07 15:46:19 +00004821class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4822
4823 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004824
Guido van Rossume9f66142002-08-07 15:46:19 +00004825 In this case (and in this case only), it should be possible to
4826 create a file object, read a line from it, create another file
4827 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004828 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004829 when reading multiple requests from the same socket."""
4830
4831 bufsize = 0 # Use unbuffered mode
4832
4833 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004834 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004835 line = self.read_file.readline() # first line
4836 self.assertEqual(line, b"A. " + self.write_msg) # first line
4837 self.read_file = self.cli_conn.makefile('rb', 0)
4838 line = self.read_file.readline() # second line
4839 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004840
4841 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004842 self.write_file.write(b"A. " + self.write_msg)
4843 self.write_file.write(b"B. " + self.write_msg)
4844 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004845
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004846 def testMakefileClose(self):
4847 # The file returned by makefile should keep the socket open...
4848 self.cli_conn.close()
4849 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004850 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004851 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004852 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004853 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004854
4855 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004856 self.write_file.write(self.write_msg)
4857 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004858
4859 def testMakefileCloseSocketDestroy(self):
4860 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004861 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004862 refcount_after = sys.getrefcount(self.cli_conn)
4863 self.assertEqual(refcount_before - 1, refcount_after)
4864
4865 def _testMakefileCloseSocketDestroy(self):
4866 pass
4867
Antoine Pitrou98b46702010-09-18 22:59:00 +00004868 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004869 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004870 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4871
4872 def testSmallReadNonBlocking(self):
4873 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004874 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4875 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004876 self.evt1.set()
4877 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004878 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004879 if first_seg is None:
4880 # Data not arrived (can happen under Windows), wait a bit
4881 time.sleep(0.5)
4882 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004883 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004884 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004885 self.assertEqual(n, 3)
4886 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004887 self.assertEqual(msg, self.read_msg)
4888 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4889 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004890
4891 def _testSmallReadNonBlocking(self):
4892 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004893 self.write_file.write(self.write_msg)
4894 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004895 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004896 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004897 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4898 self.serv_finished.wait(5.0)
4899
4900 def testWriteNonBlocking(self):
4901 self.cli_finished.wait(5.0)
4902 # The client thread can't skip directly - the SkipTest exception
4903 # would appear as a failure.
4904 if self.serv_skipped:
4905 self.skipTest(self.serv_skipped)
4906
4907 def _testWriteNonBlocking(self):
4908 self.serv_skipped = None
4909 self.serv_conn.setblocking(False)
4910 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004911 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004912 LIMIT = 10
4913 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004914 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004915 self.assertGreater(n, 0)
4916 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004917 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004918 if n is None:
4919 # Succeeded
4920 break
4921 self.assertGreater(n, 0)
4922 else:
4923 # Let us know that this test didn't manage to establish
4924 # the expected conditions. This is not a failure in itself but,
4925 # if it happens repeatedly, the test should be fixed.
4926 self.serv_skipped = "failed to saturate the socket buffer"
4927
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004928
Guido van Rossum8c943832002-08-08 01:00:28 +00004929class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4930
4931 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4932
4933
4934class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4935
4936 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004937
Thomas Woutersb2137042007-02-01 18:02:27 +00004938
Antoine Pitrou834bd812010-10-13 16:17:14 +00004939class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4940 """Tests for socket.makefile() in text mode (rather than binary)"""
4941
4942 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004943 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004944 write_mode = 'wb'
4945 write_msg = MSG
4946 newline = ''
4947
4948
4949class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4950 """Tests for socket.makefile() in text mode (rather than binary)"""
4951
4952 read_mode = 'rb'
4953 read_msg = MSG
4954 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004955 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004956 newline = ''
4957
4958
4959class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4960 """Tests for socket.makefile() in text mode (rather than binary)"""
4961
4962 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004963 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004964 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004965 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004966 newline = ''
4967
4968
Guido van Rossumd8faa362007-04-27 19:54:29 +00004969class NetworkConnectionTest(object):
4970 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004971
Guido van Rossumd8faa362007-04-27 19:54:29 +00004972 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004973 # We're inherited below by BasicTCPTest2, which also inherits
4974 # BasicTCPTest, which defines self.port referenced below.
4975 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004976 self.serv_conn = self.cli
4977
4978class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4979 """Tests that NetworkConnection does not break existing TCP functionality.
4980 """
4981
4982class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004983
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004984 class MockSocket(socket.socket):
4985 def connect(self, *args):
4986 raise socket.timeout('timed out')
4987
4988 @contextlib.contextmanager
4989 def mocked_socket_module(self):
4990 """Return a socket which times out on connect"""
4991 old_socket = socket.socket
4992 socket.socket = self.MockSocket
4993 try:
4994 yield
4995 finally:
4996 socket.socket = old_socket
4997
4998 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004999 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005000 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005001 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005002 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005003 cli.connect((HOST, port))
5004 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
5005
5006 def test_create_connection(self):
5007 # Issue #9792: errors raised by create_connection() should have
5008 # a proper errno attribute.
5009 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02005010 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005011 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04005012
5013 # Issue #16257: create_connection() calls getaddrinfo() against
5014 # 'localhost'. This may result in an IPV6 addr being returned
5015 # as well as an IPV4 one:
5016 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
5017 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
5018 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
5019 #
5020 # create_connection() enumerates through all the addresses returned
5021 # and if it doesn't successfully bind to any of them, it propagates
5022 # the last exception it encountered.
5023 #
5024 # On Solaris, ENETUNREACH is returned in this circumstance instead
5025 # of ECONNREFUSED. So, if that errno exists, add it to our list of
5026 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02005027 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04005028 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005029
5030 def test_create_connection_timeout(self):
5031 # Issue #9792: create_connection() should not recast timeout errors
5032 # as generic socket errors.
5033 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06005034 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005035 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06005036 except socket.timeout:
5037 pass
5038 except OSError as exc:
5039 if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
5040 raise
5041 else:
5042 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00005043
Guido van Rossumd8faa362007-04-27 19:54:29 +00005044
5045class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
5046
5047 def __init__(self, methodName='runTest'):
5048 SocketTCPTest.__init__(self, methodName=methodName)
5049 ThreadableTest.__init__(self)
5050
5051 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00005052 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005053
5054 def clientTearDown(self):
5055 self.cli.close()
5056 self.cli = None
5057 ThreadableTest.clientTearDown(self)
5058
5059 def _justAccept(self):
5060 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005061 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005062
5063 testFamily = _justAccept
5064 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005065 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005066 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005067 self.assertEqual(self.cli.family, 2)
5068
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005069 testSourceAddress = _justAccept
5070 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00005071 self.cli = socket.create_connection((HOST, self.port), timeout=30,
5072 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005073 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005074 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005075 # The port number being used is sufficient to show that the bind()
5076 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005077
Guido van Rossumd8faa362007-04-27 19:54:29 +00005078 testTimeoutDefault = _justAccept
5079 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005080 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005081 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005082 socket.setdefaulttimeout(42)
5083 try:
5084 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005085 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005086 finally:
5087 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005088 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005089
5090 testTimeoutNone = _justAccept
5091 def _testTimeoutNone(self):
5092 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005093 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005094 socket.setdefaulttimeout(30)
5095 try:
5096 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005097 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005098 finally:
5099 socket.setdefaulttimeout(None)
5100 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005101
5102 testTimeoutValueNamed = _justAccept
5103 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005104 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005105 self.assertEqual(self.cli.gettimeout(), 30)
5106
5107 testTimeoutValueNonamed = _justAccept
5108 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005109 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005110 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005111 self.assertEqual(self.cli.gettimeout(), 30)
5112
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005113
Guido van Rossumd8faa362007-04-27 19:54:29 +00005114class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5115
5116 def __init__(self, methodName='runTest'):
5117 SocketTCPTest.__init__(self, methodName=methodName)
5118 ThreadableTest.__init__(self)
5119
5120 def clientSetUp(self):
5121 pass
5122
5123 def clientTearDown(self):
5124 self.cli.close()
5125 self.cli = None
5126 ThreadableTest.clientTearDown(self)
5127
5128 def testInsideTimeout(self):
5129 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005130 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005131 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005132 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005133 testOutsideTimeout = testInsideTimeout
5134
5135 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005136 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005137 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005138 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005139
5140 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005141 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005142 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005143
5144
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005145class TCPTimeoutTest(SocketTCPTest):
5146
5147 def testTCPTimeout(self):
5148 def raise_timeout(*args, **kwargs):
5149 self.serv.settimeout(1.0)
5150 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005151 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005152 "Error generating a timeout exception (TCP)")
5153
5154 def testTimeoutZero(self):
5155 ok = False
5156 try:
5157 self.serv.settimeout(0.0)
5158 foo = self.serv.accept()
5159 except socket.timeout:
5160 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005161 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005162 ok = True
5163 except:
5164 self.fail("caught unexpected exception (TCP)")
5165 if not ok:
5166 self.fail("accept() returned success when we did not expect it")
5167
Serhiy Storchaka43767632013-11-03 21:31:38 +02005168 @unittest.skipUnless(hasattr(signal, 'alarm'),
5169 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005170 def testInterruptedTimeout(self):
5171 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005172 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005173 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005174 self.serv.settimeout(5.0) # must be longer than alarm
5175 class Alarm(Exception):
5176 pass
5177 def alarm_handler(signal, frame):
5178 raise Alarm
5179 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5180 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005181 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005182 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005183 foo = self.serv.accept()
5184 except socket.timeout:
5185 self.fail("caught timeout instead of Alarm")
5186 except Alarm:
5187 pass
5188 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005189 self.fail("caught other exception instead of Alarm:"
5190 " %s(%s):\n%s" %
5191 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005192 else:
5193 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005194 finally:
5195 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005196 except Alarm:
5197 self.fail("got Alarm in wrong place")
5198 finally:
5199 # no alarm can be pending. Safe to restore old handler.
5200 signal.signal(signal.SIGALRM, old_alarm)
5201
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005202class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005203
5204 def testUDPTimeout(self):
5205 def raise_timeout(*args, **kwargs):
5206 self.serv.settimeout(1.0)
5207 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005208 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005209 "Error generating a timeout exception (UDP)")
5210
5211 def testTimeoutZero(self):
5212 ok = False
5213 try:
5214 self.serv.settimeout(0.0)
5215 foo = self.serv.recv(1024)
5216 except socket.timeout:
5217 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005218 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005219 ok = True
5220 except:
5221 self.fail("caught unexpected exception (UDP)")
5222 if not ok:
5223 self.fail("recv() returned success when we did not expect it")
5224
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005225@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5226 'UDPLITE sockets required for this test.')
5227class UDPLITETimeoutTest(SocketUDPLITETest):
5228
5229 def testUDPLITETimeout(self):
5230 def raise_timeout(*args, **kwargs):
5231 self.serv.settimeout(1.0)
5232 self.serv.recv(1024)
5233 self.assertRaises(socket.timeout, raise_timeout,
5234 "Error generating a timeout exception (UDPLITE)")
5235
5236 def testTimeoutZero(self):
5237 ok = False
5238 try:
5239 self.serv.settimeout(0.0)
5240 foo = self.serv.recv(1024)
5241 except socket.timeout:
5242 self.fail("caught timeout instead of error (UDPLITE)")
5243 except OSError:
5244 ok = True
5245 except:
5246 self.fail("caught unexpected exception (UDPLITE)")
5247 if not ok:
5248 self.fail("recv() returned success when we did not expect it")
5249
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005250class TestExceptions(unittest.TestCase):
5251
5252 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005253 self.assertTrue(issubclass(OSError, Exception))
5254 self.assertTrue(issubclass(socket.herror, OSError))
5255 self.assertTrue(issubclass(socket.gaierror, OSError))
5256 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005257
Yury Selivanovfa22b292016-10-18 16:03:52 -04005258 def test_setblocking_invalidfd(self):
5259 # Regression test for issue #28471
5260
5261 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5262 sock = socket.socket(
5263 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5264 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005265 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005266
5267 with self.assertRaises(OSError):
5268 sock.setblocking(False)
5269
5270
Serhiy Storchaka43767632013-11-03 21:31:38 +02005271@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005272class TestLinuxAbstractNamespace(unittest.TestCase):
5273
5274 UNIX_PATH_MAX = 108
5275
5276 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005277 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005278 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5279 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005280 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005281 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5282 s2.connect(s1.getsockname())
5283 with s1.accept()[0] as s3:
5284 self.assertEqual(s1.getsockname(), address)
5285 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005286
5287 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005288 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005289 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5290 s.bind(address)
5291 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005292
5293 def testNameOverflow(self):
5294 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005295 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005296 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005297
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005298 def testStrName(self):
5299 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005300 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5301 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005302 s.bind("\x00python\x00test\x00")
5303 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005304 finally:
5305 s.close()
5306
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005307 def testBytearrayName(self):
5308 # Check that an abstract name can be passed as a bytearray.
5309 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5310 s.bind(bytearray(b"\x00python\x00test\x00"))
5311 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5312
Serhiy Storchaka43767632013-11-03 21:31:38 +02005313@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005314class TestUnixDomain(unittest.TestCase):
5315
5316 def setUp(self):
5317 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5318
5319 def tearDown(self):
5320 self.sock.close()
5321
5322 def encoded(self, path):
5323 # Return the given path encoded in the file system encoding,
5324 # or skip the test if this is not possible.
5325 try:
5326 return os.fsencode(path)
5327 except UnicodeEncodeError:
5328 self.skipTest(
5329 "Pathname {0!a} cannot be represented in file "
5330 "system encoding {1!r}".format(
5331 path, sys.getfilesystemencoding()))
5332
Antoine Pitrou16374872011-12-16 15:04:12 +01005333 def bind(self, sock, path):
5334 # Bind the socket
5335 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005336 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005337 except OSError as e:
5338 if str(e) == "AF_UNIX path too long":
5339 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005340 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005341 .format(path))
5342 else:
5343 raise
5344
Antoine Pitrou495b5022017-05-02 17:20:00 +02005345 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005346 # Issue #30205 (note getsockname() can return None on OS X)
5347 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005348
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005349 def testStrAddr(self):
5350 # Test binding to and retrieving a normal string pathname.
5351 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005352 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005353 self.addCleanup(support.unlink, path)
5354 self.assertEqual(self.sock.getsockname(), path)
5355
5356 def testBytesAddr(self):
5357 # Test binding to a bytes pathname.
5358 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005359 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005360 self.addCleanup(support.unlink, path)
5361 self.assertEqual(self.sock.getsockname(), path)
5362
5363 def testSurrogateescapeBind(self):
5364 # Test binding to a valid non-ASCII pathname, with the
5365 # non-ASCII bytes supplied using surrogateescape encoding.
5366 path = os.path.abspath(support.TESTFN_UNICODE)
5367 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005368 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005369 self.addCleanup(support.unlink, path)
5370 self.assertEqual(self.sock.getsockname(), path)
5371
5372 def testUnencodableAddr(self):
5373 # Test binding to a pathname that cannot be encoded in the
5374 # file system encoding.
5375 if support.TESTFN_UNENCODABLE is None:
5376 self.skipTest("No unencodable filename available")
5377 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005378 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005379 self.addCleanup(support.unlink, path)
5380 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005381
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005382
Thomas Wouters477c8d52006-05-27 19:21:47 +00005383class BufferIOTest(SocketConnectedTest):
5384 """
5385 Test the buffer versions of socket.recv() and socket.send().
5386 """
5387 def __init__(self, methodName='runTest'):
5388 SocketConnectedTest.__init__(self, methodName=methodName)
5389
Antoine Pitrou25480782010-03-17 22:50:28 +00005390 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005391 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005392 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005393 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005394 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005395 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005396 self.assertEqual(msg, MSG)
5397
Antoine Pitrou25480782010-03-17 22:50:28 +00005398 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005399 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005400 self.serv_conn.send(buf)
5401
Antoine Pitrou25480782010-03-17 22:50:28 +00005402 def testRecvIntoBytearray(self):
5403 buf = bytearray(1024)
5404 nbytes = self.cli_conn.recv_into(buf)
5405 self.assertEqual(nbytes, len(MSG))
5406 msg = buf[:len(MSG)]
5407 self.assertEqual(msg, MSG)
5408
5409 _testRecvIntoBytearray = _testRecvIntoArray
5410
5411 def testRecvIntoMemoryview(self):
5412 buf = bytearray(1024)
5413 nbytes = self.cli_conn.recv_into(memoryview(buf))
5414 self.assertEqual(nbytes, len(MSG))
5415 msg = buf[:len(MSG)]
5416 self.assertEqual(msg, MSG)
5417
5418 _testRecvIntoMemoryview = _testRecvIntoArray
5419
5420 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005421 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005422 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005423 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005424 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005425 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005426 self.assertEqual(msg, MSG)
5427
Antoine Pitrou25480782010-03-17 22:50:28 +00005428 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005429 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005430 self.serv_conn.send(buf)
5431
Antoine Pitrou25480782010-03-17 22:50:28 +00005432 def testRecvFromIntoBytearray(self):
5433 buf = bytearray(1024)
5434 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5435 self.assertEqual(nbytes, len(MSG))
5436 msg = buf[:len(MSG)]
5437 self.assertEqual(msg, MSG)
5438
5439 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5440
5441 def testRecvFromIntoMemoryview(self):
5442 buf = bytearray(1024)
5443 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5444 self.assertEqual(nbytes, len(MSG))
5445 msg = buf[:len(MSG)]
5446 self.assertEqual(msg, MSG)
5447
5448 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5449
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005450 def testRecvFromIntoSmallBuffer(self):
5451 # See issue #20246.
5452 buf = bytearray(8)
5453 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5454
5455 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005456 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005457
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005458 def testRecvFromIntoEmptyBuffer(self):
5459 buf = bytearray()
5460 self.cli_conn.recvfrom_into(buf)
5461 self.cli_conn.recvfrom_into(buf, 0)
5462
5463 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5464
Christian Heimes043d6f62008-01-07 17:19:16 +00005465
5466TIPC_STYPE = 2000
5467TIPC_LOWER = 200
5468TIPC_UPPER = 210
5469
5470def isTipcAvailable():
5471 """Check if the TIPC module is loaded
5472
5473 The TIPC module is not loaded automatically on Ubuntu and probably
5474 other Linux distros.
5475 """
5476 if not hasattr(socket, "AF_TIPC"):
5477 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005478 try:
5479 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005480 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005481 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005482 # have not the permission to read it.
5483 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005484 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005485 for line in f:
5486 if line.startswith("tipc "):
5487 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005488 return False
5489
Serhiy Storchaka43767632013-11-03 21:31:38 +02005490@unittest.skipUnless(isTipcAvailable(),
5491 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005492class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005493 def testRDM(self):
5494 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5495 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005496 self.addCleanup(srv.close)
5497 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005498
5499 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5500 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5501 TIPC_LOWER, TIPC_UPPER)
5502 srv.bind(srvaddr)
5503
5504 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5505 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5506 cli.sendto(MSG, sendaddr)
5507
5508 msg, recvaddr = srv.recvfrom(1024)
5509
5510 self.assertEqual(cli.getsockname(), recvaddr)
5511 self.assertEqual(msg, MSG)
5512
5513
Serhiy Storchaka43767632013-11-03 21:31:38 +02005514@unittest.skipUnless(isTipcAvailable(),
5515 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005516class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005517 def __init__(self, methodName = 'runTest'):
5518 unittest.TestCase.__init__(self, methodName = methodName)
5519 ThreadableTest.__init__(self)
5520
5521 def setUp(self):
5522 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005523 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005524 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5525 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5526 TIPC_LOWER, TIPC_UPPER)
5527 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005528 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005529 self.serverExplicitReady()
5530 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005531 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005532
5533 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005534 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005535 # accept() call; sleep a little while to avoid it, otherwise
5536 # we could get an exception
5537 time.sleep(0.1)
5538 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005539 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005540 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5541 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5542 self.cli.connect(addr)
5543 self.cliaddr = self.cli.getsockname()
5544
5545 def testStream(self):
5546 msg = self.conn.recv(1024)
5547 self.assertEqual(msg, MSG)
5548 self.assertEqual(self.cliaddr, self.connaddr)
5549
5550 def _testStream(self):
5551 self.cli.send(MSG)
5552 self.cli.close()
5553
5554
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005555class ContextManagersTest(ThreadedTCPSocketTest):
5556
5557 def _testSocketClass(self):
5558 # base test
5559 with socket.socket() as sock:
5560 self.assertFalse(sock._closed)
5561 self.assertTrue(sock._closed)
5562 # close inside with block
5563 with socket.socket() as sock:
5564 sock.close()
5565 self.assertTrue(sock._closed)
5566 # exception inside with block
5567 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005568 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005569 self.assertTrue(sock._closed)
5570
5571 def testCreateConnectionBase(self):
5572 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005573 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005574 data = conn.recv(1024)
5575 conn.sendall(data)
5576
5577 def _testCreateConnectionBase(self):
5578 address = self.serv.getsockname()
5579 with socket.create_connection(address) as sock:
5580 self.assertFalse(sock._closed)
5581 sock.sendall(b'foo')
5582 self.assertEqual(sock.recv(1024), b'foo')
5583 self.assertTrue(sock._closed)
5584
5585 def testCreateConnectionClose(self):
5586 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005587 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005588 data = conn.recv(1024)
5589 conn.sendall(data)
5590
5591 def _testCreateConnectionClose(self):
5592 address = self.serv.getsockname()
5593 with socket.create_connection(address) as sock:
5594 sock.close()
5595 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005596 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005597
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005598
Victor Stinnerdaf45552013-08-28 00:53:59 +02005599class InheritanceTest(unittest.TestCase):
5600 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5601 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005602 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005603 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005604 with socket.socket(socket.AF_INET,
5605 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005606 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005607 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005608
5609 def test_default_inheritable(self):
5610 sock = socket.socket()
5611 with sock:
5612 self.assertEqual(sock.get_inheritable(), False)
5613
5614 def test_dup(self):
5615 sock = socket.socket()
5616 with sock:
5617 newsock = sock.dup()
5618 sock.close()
5619 with newsock:
5620 self.assertEqual(newsock.get_inheritable(), False)
5621
5622 def test_set_inheritable(self):
5623 sock = socket.socket()
5624 with sock:
5625 sock.set_inheritable(True)
5626 self.assertEqual(sock.get_inheritable(), True)
5627
5628 sock.set_inheritable(False)
5629 self.assertEqual(sock.get_inheritable(), False)
5630
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005631 @unittest.skipIf(fcntl is None, "need fcntl")
5632 def test_get_inheritable_cloexec(self):
5633 sock = socket.socket()
5634 with sock:
5635 fd = sock.fileno()
5636 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005637
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005638 # clear FD_CLOEXEC flag
5639 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5640 flags &= ~fcntl.FD_CLOEXEC
5641 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005642
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005643 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005644
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005645 @unittest.skipIf(fcntl is None, "need fcntl")
5646 def test_set_inheritable_cloexec(self):
5647 sock = socket.socket()
5648 with sock:
5649 fd = sock.fileno()
5650 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5651 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005652
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005653 sock.set_inheritable(True)
5654 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5655 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005656
5657
Victor Stinnerdaf45552013-08-28 00:53:59 +02005658 def test_socketpair(self):
5659 s1, s2 = socket.socketpair()
5660 self.addCleanup(s1.close)
5661 self.addCleanup(s2.close)
5662 self.assertEqual(s1.get_inheritable(), False)
5663 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005664
5665
5666@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5667 "SOCK_NONBLOCK not defined")
5668class NonblockConstantTest(unittest.TestCase):
5669 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5670 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005671 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005672 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005673 self.assertTrue(
5674 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005675 if timeout == 0:
5676 # timeout == 0: means that getblocking() must be False.
5677 self.assertFalse(s.getblocking())
5678 else:
5679 # If timeout > 0, the socket will be in a "blocking" mode
5680 # from the standpoint of the Python API. For Python socket
5681 # object, "blocking" means that operations like 'sock.recv()'
5682 # will block. Internally, file descriptors for
5683 # "blocking" Python sockets *with timeouts* are in a
5684 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5685 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5686 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005687 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005688 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005689 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005690 self.assertFalse(
5691 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005692 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005693
Charles-François Natali239bb962011-06-03 12:55:15 +02005694 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005695 def test_SOCK_NONBLOCK(self):
5696 # a lot of it seems silly and redundant, but I wanted to test that
5697 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005698 with socket.socket(socket.AF_INET,
5699 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5700 self.checkNonblock(s)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005701 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005702 self.checkNonblock(s, nonblock=False)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005703 s.setblocking(False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005704 self.checkNonblock(s)
5705 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005706 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005707 s.settimeout(2.0)
5708 self.checkNonblock(s, timeout=2.0)
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +03005709 s.setblocking(True)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005710 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005711 # defaulttimeout
5712 t = socket.getdefaulttimeout()
5713 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005714 with socket.socket() as s:
5715 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005716 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005717 with socket.socket() as s:
5718 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005719 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005720 with socket.socket() as s:
5721 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005722 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005723 with socket.socket() as s:
5724 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005725 socket.setdefaulttimeout(t)
5726
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005727
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005728@unittest.skipUnless(os.name == "nt", "Windows specific")
5729@unittest.skipUnless(multiprocessing, "need multiprocessing")
5730class TestSocketSharing(SocketTCPTest):
5731 # This must be classmethod and not staticmethod or multiprocessing
5732 # won't be able to bootstrap it.
5733 @classmethod
5734 def remoteProcessServer(cls, q):
5735 # Recreate socket from shared data
5736 sdata = q.get()
5737 message = q.get()
5738
5739 s = socket.fromshare(sdata)
5740 s2, c = s.accept()
5741
5742 # Send the message
5743 s2.sendall(message)
5744 s2.close()
5745 s.close()
5746
5747 def testShare(self):
5748 # Transfer the listening server socket to another process
5749 # and service it from there.
5750
5751 # Create process:
5752 q = multiprocessing.Queue()
5753 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5754 p.start()
5755
5756 # Get the shared socket data
5757 data = self.serv.share(p.pid)
5758
5759 # Pass the shared socket to the other process
5760 addr = self.serv.getsockname()
5761 self.serv.close()
5762 q.put(data)
5763
5764 # The data that the server will send us
5765 message = b"slapmahfro"
5766 q.put(message)
5767
5768 # Connect
5769 s = socket.create_connection(addr)
5770 # listen for the data
5771 m = []
5772 while True:
5773 data = s.recv(100)
5774 if not data:
5775 break
5776 m.append(data)
5777 s.close()
5778 received = b"".join(m)
5779 self.assertEqual(received, message)
5780 p.join()
5781
5782 def testShareLength(self):
5783 data = self.serv.share(os.getpid())
5784 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5785 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5786
5787 def compareSockets(self, org, other):
5788 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005789 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005790 self.assertEqual(org.gettimeout(), None)
5791 self.assertEqual(org.gettimeout(), other.gettimeout())
5792
5793 self.assertEqual(org.family, other.family)
5794 self.assertEqual(org.type, other.type)
5795 # If the user specified "0" for proto, then
5796 # internally windows will have picked the correct value.
5797 # Python introspection on the socket however will still return
5798 # 0. For the shared socket, the python value is recreated
5799 # from the actual value, so it may not compare correctly.
5800 if org.proto != 0:
5801 self.assertEqual(org.proto, other.proto)
5802
5803 def testShareLocal(self):
5804 data = self.serv.share(os.getpid())
5805 s = socket.fromshare(data)
5806 try:
5807 self.compareSockets(self.serv, s)
5808 finally:
5809 s.close()
5810
5811 def testTypes(self):
5812 families = [socket.AF_INET, socket.AF_INET6]
5813 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5814 for f in families:
5815 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005816 try:
5817 source = socket.socket(f, t)
5818 except OSError:
5819 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005820 try:
5821 data = source.share(os.getpid())
5822 shared = socket.fromshare(data)
5823 try:
5824 self.compareSockets(source, shared)
5825 finally:
5826 shared.close()
5827 finally:
5828 source.close()
5829
5830
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005831class SendfileUsingSendTest(ThreadedTCPSocketTest):
5832 """
5833 Test the send() implementation of socket.sendfile().
5834 """
5835
Victor Stinner8c663fd2017-11-08 14:44:44 -08005836 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005837 BUFSIZE = 8192
5838 FILEDATA = b""
Paul Monson52c8c092019-07-14 01:30:28 -07005839 # bpo-37553: This is taking longer than 2 seconds on Windows ARM32 buildbot
5840 TIMEOUT = 10 if sys.platform == 'win32' and platform.machine() == 'ARM' else 2
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005841
5842 @classmethod
5843 def setUpClass(cls):
5844 def chunks(total, step):
5845 assert total >= step
5846 while total > step:
5847 yield step
5848 total -= step
5849 if total:
5850 yield total
5851
5852 chunk = b"".join([random.choice(string.ascii_letters).encode()
5853 for i in range(cls.BUFSIZE)])
5854 with open(support.TESTFN, 'wb') as f:
5855 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5856 f.write(chunk)
5857 with open(support.TESTFN, 'rb') as f:
5858 cls.FILEDATA = f.read()
5859 assert len(cls.FILEDATA) == cls.FILESIZE
5860
5861 @classmethod
5862 def tearDownClass(cls):
5863 support.unlink(support.TESTFN)
5864
5865 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005866 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005867 conn, addr = self.serv.accept()
5868 conn.settimeout(self.TIMEOUT)
5869 self.addCleanup(conn.close)
5870 return conn
5871
5872 def recv_data(self, conn):
5873 received = []
5874 while True:
5875 chunk = conn.recv(self.BUFSIZE)
5876 if not chunk:
5877 break
5878 received.append(chunk)
5879 return b''.join(received)
5880
5881 def meth_from_sock(self, sock):
5882 # Depending on the mixin class being run return either send()
5883 # or sendfile() method implementation.
5884 return getattr(sock, "_sendfile_use_send")
5885
5886 # regular file
5887
5888 def _testRegularFile(self):
5889 address = self.serv.getsockname()
5890 file = open(support.TESTFN, 'rb')
5891 with socket.create_connection(address) as sock, file as file:
5892 meth = self.meth_from_sock(sock)
5893 sent = meth(file)
5894 self.assertEqual(sent, self.FILESIZE)
5895 self.assertEqual(file.tell(), self.FILESIZE)
5896
5897 def testRegularFile(self):
5898 conn = self.accept_conn()
5899 data = self.recv_data(conn)
5900 self.assertEqual(len(data), self.FILESIZE)
5901 self.assertEqual(data, self.FILEDATA)
5902
5903 # non regular file
5904
5905 def _testNonRegularFile(self):
5906 address = self.serv.getsockname()
5907 file = io.BytesIO(self.FILEDATA)
5908 with socket.create_connection(address) as sock, file as file:
5909 sent = sock.sendfile(file)
5910 self.assertEqual(sent, self.FILESIZE)
5911 self.assertEqual(file.tell(), self.FILESIZE)
5912 self.assertRaises(socket._GiveupOnSendfile,
5913 sock._sendfile_use_sendfile, file)
5914
5915 def testNonRegularFile(self):
5916 conn = self.accept_conn()
5917 data = self.recv_data(conn)
5918 self.assertEqual(len(data), self.FILESIZE)
5919 self.assertEqual(data, self.FILEDATA)
5920
5921 # empty file
5922
5923 def _testEmptyFileSend(self):
5924 address = self.serv.getsockname()
5925 filename = support.TESTFN + "2"
5926 with open(filename, 'wb'):
5927 self.addCleanup(support.unlink, filename)
5928 file = open(filename, 'rb')
5929 with socket.create_connection(address) as sock, file as file:
5930 meth = self.meth_from_sock(sock)
5931 sent = meth(file)
5932 self.assertEqual(sent, 0)
5933 self.assertEqual(file.tell(), 0)
5934
5935 def testEmptyFileSend(self):
5936 conn = self.accept_conn()
5937 data = self.recv_data(conn)
5938 self.assertEqual(data, b"")
5939
5940 # offset
5941
5942 def _testOffset(self):
5943 address = self.serv.getsockname()
5944 file = open(support.TESTFN, 'rb')
5945 with socket.create_connection(address) as sock, file as file:
5946 meth = self.meth_from_sock(sock)
5947 sent = meth(file, offset=5000)
5948 self.assertEqual(sent, self.FILESIZE - 5000)
5949 self.assertEqual(file.tell(), self.FILESIZE)
5950
5951 def testOffset(self):
5952 conn = self.accept_conn()
5953 data = self.recv_data(conn)
5954 self.assertEqual(len(data), self.FILESIZE - 5000)
5955 self.assertEqual(data, self.FILEDATA[5000:])
5956
5957 # count
5958
5959 def _testCount(self):
5960 address = self.serv.getsockname()
5961 file = open(support.TESTFN, 'rb')
5962 with socket.create_connection(address, timeout=2) as sock, file as file:
5963 count = 5000007
5964 meth = self.meth_from_sock(sock)
5965 sent = meth(file, count=count)
5966 self.assertEqual(sent, count)
5967 self.assertEqual(file.tell(), count)
5968
5969 def testCount(self):
5970 count = 5000007
5971 conn = self.accept_conn()
5972 data = self.recv_data(conn)
5973 self.assertEqual(len(data), count)
5974 self.assertEqual(data, self.FILEDATA[:count])
5975
5976 # count small
5977
5978 def _testCountSmall(self):
5979 address = self.serv.getsockname()
5980 file = open(support.TESTFN, 'rb')
5981 with socket.create_connection(address, timeout=2) as sock, file as file:
5982 count = 1
5983 meth = self.meth_from_sock(sock)
5984 sent = meth(file, count=count)
5985 self.assertEqual(sent, count)
5986 self.assertEqual(file.tell(), count)
5987
5988 def testCountSmall(self):
5989 count = 1
5990 conn = self.accept_conn()
5991 data = self.recv_data(conn)
5992 self.assertEqual(len(data), count)
5993 self.assertEqual(data, self.FILEDATA[:count])
5994
5995 # count + offset
5996
5997 def _testCountWithOffset(self):
5998 address = self.serv.getsockname()
5999 file = open(support.TESTFN, 'rb')
6000 with socket.create_connection(address, timeout=2) as sock, file as file:
6001 count = 100007
6002 meth = self.meth_from_sock(sock)
6003 sent = meth(file, offset=2007, count=count)
6004 self.assertEqual(sent, count)
6005 self.assertEqual(file.tell(), count + 2007)
6006
6007 def testCountWithOffset(self):
6008 count = 100007
6009 conn = self.accept_conn()
6010 data = self.recv_data(conn)
6011 self.assertEqual(len(data), count)
6012 self.assertEqual(data, self.FILEDATA[2007:count+2007])
6013
6014 # non blocking sockets are not supposed to work
6015
6016 def _testNonBlocking(self):
6017 address = self.serv.getsockname()
6018 file = open(support.TESTFN, 'rb')
6019 with socket.create_connection(address) as sock, file as file:
6020 sock.setblocking(False)
6021 meth = self.meth_from_sock(sock)
6022 self.assertRaises(ValueError, meth, file)
6023 self.assertRaises(ValueError, sock.sendfile, file)
6024
6025 def testNonBlocking(self):
6026 conn = self.accept_conn()
6027 if conn.recv(8192):
6028 self.fail('was not supposed to receive any data')
6029
6030 # timeout (non-triggered)
6031
6032 def _testWithTimeout(self):
6033 address = self.serv.getsockname()
6034 file = open(support.TESTFN, 'rb')
6035 with socket.create_connection(address, timeout=2) as sock, file as file:
6036 meth = self.meth_from_sock(sock)
6037 sent = meth(file)
6038 self.assertEqual(sent, self.FILESIZE)
6039
6040 def testWithTimeout(self):
6041 conn = self.accept_conn()
6042 data = self.recv_data(conn)
6043 self.assertEqual(len(data), self.FILESIZE)
6044 self.assertEqual(data, self.FILEDATA)
6045
6046 # timeout (triggered)
6047
6048 def _testWithTimeoutTriggeredSend(self):
6049 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00006050 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03006051 with socket.create_connection(address) as sock:
6052 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00006053 meth = self.meth_from_sock(sock)
6054 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006055
6056 def testWithTimeoutTriggeredSend(self):
6057 conn = self.accept_conn()
6058 conn.recv(88192)
6059
6060 # errors
6061
6062 def _test_errors(self):
6063 pass
6064
6065 def test_errors(self):
6066 with open(support.TESTFN, 'rb') as file:
6067 with socket.socket(type=socket.SOCK_DGRAM) as s:
6068 meth = self.meth_from_sock(s)
6069 self.assertRaisesRegex(
6070 ValueError, "SOCK_STREAM", meth, file)
6071 with open(support.TESTFN, 'rt') as file:
6072 with socket.socket() as s:
6073 meth = self.meth_from_sock(s)
6074 self.assertRaisesRegex(
6075 ValueError, "binary mode", meth, file)
6076 with open(support.TESTFN, 'rb') as file:
6077 with socket.socket() as s:
6078 meth = self.meth_from_sock(s)
6079 self.assertRaisesRegex(TypeError, "positive integer",
6080 meth, file, count='2')
6081 self.assertRaisesRegex(TypeError, "positive integer",
6082 meth, file, count=0.1)
6083 self.assertRaisesRegex(ValueError, "positive integer",
6084 meth, file, count=0)
6085 self.assertRaisesRegex(ValueError, "positive integer",
6086 meth, file, count=-1)
6087
6088
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006089@unittest.skipUnless(hasattr(os, "sendfile"),
6090 'os.sendfile() required for this test.')
6091class SendfileUsingSendfileTest(SendfileUsingSendTest):
6092 """
6093 Test the sendfile() implementation of socket.sendfile().
6094 """
6095 def meth_from_sock(self, sock):
6096 return getattr(sock, "_sendfile_use_sendfile")
6097
Christian Heimes48371412016-09-06 00:37:46 +02006098
6099@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006100class LinuxKernelCryptoAPI(unittest.TestCase):
6101 # tests for AF_ALG
6102 def create_alg(self, typ, name):
6103 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006104 try:
6105 sock.bind((typ, name))
6106 except FileNotFoundError as e:
6107 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006108 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006109 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006110 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006111 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006112
Victor Stinner86afc1f2017-11-30 13:58:43 +01006113 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6114 # at least on ppc64le architecture
6115 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006116 def test_sha256(self):
6117 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6118 "177a9cb410ff61f20015ad")
6119 with self.create_alg('hash', 'sha256') as algo:
6120 op, _ = algo.accept()
6121 with op:
6122 op.sendall(b"abc")
6123 self.assertEqual(op.recv(512), expected)
6124
6125 op, _ = algo.accept()
6126 with op:
6127 op.send(b'a', socket.MSG_MORE)
6128 op.send(b'b', socket.MSG_MORE)
6129 op.send(b'c', socket.MSG_MORE)
6130 op.send(b'')
6131 self.assertEqual(op.recv(512), expected)
6132
6133 def test_hmac_sha1(self):
6134 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6135 with self.create_alg('hash', 'hmac(sha1)') as algo:
6136 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6137 op, _ = algo.accept()
6138 with op:
6139 op.sendall(b"what do ya want for nothing?")
6140 self.assertEqual(op.recv(512), expected)
6141
Christian Heimese084f842016-09-11 20:11:30 +02006142 # Although it should work with 3.19 and newer the test blocks on
6143 # Ubuntu 15.10 with Kernel 4.2.0-19.
6144 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006145 def test_aes_cbc(self):
6146 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6147 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6148 msg = b"Single block msg"
6149 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6150 msglen = len(msg)
6151 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6152 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6153 op, _ = algo.accept()
6154 with op:
6155 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6156 flags=socket.MSG_MORE)
6157 op.sendall(msg)
6158 self.assertEqual(op.recv(msglen), ciphertext)
6159
6160 op, _ = algo.accept()
6161 with op:
6162 op.sendmsg_afalg([ciphertext],
6163 op=socket.ALG_OP_DECRYPT, iv=iv)
6164 self.assertEqual(op.recv(msglen), msg)
6165
6166 # long message
6167 multiplier = 1024
6168 longmsg = [msg] * multiplier
6169 op, _ = algo.accept()
6170 with op:
6171 op.sendmsg_afalg(longmsg,
6172 op=socket.ALG_OP_ENCRYPT, iv=iv)
6173 enc = op.recv(msglen * multiplier)
6174 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006175 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006176
6177 op, _ = algo.accept()
6178 with op:
6179 op.sendmsg_afalg([enc],
6180 op=socket.ALG_OP_DECRYPT, iv=iv)
6181 dec = op.recv(msglen * multiplier)
6182 self.assertEqual(len(dec), msglen * multiplier)
6183 self.assertEqual(dec, msg * multiplier)
6184
matejcik9764c152017-02-16 14:41:31 +01006185 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006186 def test_aead_aes_gcm(self):
6187 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6188 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6189 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6190 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6191 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6192 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6193
6194 taglen = len(expected_tag)
6195 assoclen = len(assoc)
6196
6197 with self.create_alg('aead', 'gcm(aes)') as algo:
6198 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6199 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6200 None, taglen)
6201
6202 # send assoc, plain and tag buffer in separate steps
6203 op, _ = algo.accept()
6204 with op:
6205 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6206 assoclen=assoclen, flags=socket.MSG_MORE)
6207 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006208 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006209 res = op.recv(assoclen + len(plain) + taglen)
6210 self.assertEqual(expected_ct, res[assoclen:-taglen])
6211 self.assertEqual(expected_tag, res[-taglen:])
6212
6213 # now with msg
6214 op, _ = algo.accept()
6215 with op:
matejcik9764c152017-02-16 14:41:31 +01006216 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006217 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6218 assoclen=assoclen)
6219 res = op.recv(assoclen + len(plain) + taglen)
6220 self.assertEqual(expected_ct, res[assoclen:-taglen])
6221 self.assertEqual(expected_tag, res[-taglen:])
6222
6223 # create anc data manually
6224 pack_uint32 = struct.Struct('I').pack
6225 op, _ = algo.accept()
6226 with op:
matejcik9764c152017-02-16 14:41:31 +01006227 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006228 op.sendmsg(
6229 [msg],
6230 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6231 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6232 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6233 )
6234 )
matejcik9764c152017-02-16 14:41:31 +01006235 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006236 self.assertEqual(expected_ct, res[assoclen:-taglen])
6237 self.assertEqual(expected_tag, res[-taglen:])
6238
6239 # decrypt and verify
6240 op, _ = algo.accept()
6241 with op:
6242 msg = assoc + expected_ct + expected_tag
6243 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6244 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006245 res = op.recv(len(msg) - taglen)
6246 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006247
Christian Heimese084f842016-09-11 20:11:30 +02006248 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006249 def test_drbg_pr_sha256(self):
6250 # deterministic random bit generator, prediction resistance, sha256
6251 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6252 extra_seed = os.urandom(32)
6253 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6254 op, _ = algo.accept()
6255 with op:
6256 rn = op.recv(32)
6257 self.assertEqual(len(rn), 32)
6258
6259 def test_sendmsg_afalg_args(self):
6260 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006261 with sock:
6262 with self.assertRaises(TypeError):
6263 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006264
Christian Heimes02b30352016-09-11 19:49:56 +02006265 with self.assertRaises(TypeError):
6266 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006267
Christian Heimes02b30352016-09-11 19:49:56 +02006268 with self.assertRaises(TypeError):
6269 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006270
Christian Heimes02b30352016-09-11 19:49:56 +02006271 with self.assertRaises(TypeError):
6272 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006273
Christian Heimes02b30352016-09-11 19:49:56 +02006274 with self.assertRaises(TypeError):
6275 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6276
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006277 def test_length_restriction(self):
6278 # bpo-35050, off-by-one error in length check
6279 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6280 self.addCleanup(sock.close)
6281
6282 # salg_type[14]
6283 with self.assertRaises(FileNotFoundError):
6284 sock.bind(("t" * 13, "name"))
6285 with self.assertRaisesRegex(ValueError, "type too long"):
6286 sock.bind(("t" * 14, "name"))
6287
6288 # salg_name[64]
6289 with self.assertRaises(FileNotFoundError):
6290 sock.bind(("type", "n" * 63))
6291 with self.assertRaisesRegex(ValueError, "name too long"):
6292 sock.bind(("type", "n" * 64))
6293
6294
animalize19e7d482018-02-27 02:10:36 +08006295@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6296class TestMSWindowsTCPFlags(unittest.TestCase):
6297 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006298 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006299 'TCP_MAXSEG',
6300 'TCP_NODELAY',
6301 # available starting with Windows 10 1607
6302 'TCP_FASTOPEN',
6303 # available starting with Windows 10 1703
6304 'TCP_KEEPCNT',
6305 # available starting with Windows 10 1709
6306 'TCP_KEEPIDLE',
6307 'TCP_KEEPINTVL'
6308 }
6309
6310 def test_new_tcp_flags(self):
6311 provided = [s for s in dir(socket) if s.startswith('TCP')]
6312 unknown = [s for s in provided if s not in self.knownTCPFlags]
6313
6314 self.assertEqual([], unknown,
6315 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006316
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006317
6318class CreateServerTest(unittest.TestCase):
6319
6320 def test_address(self):
6321 port = support.find_unused_port()
6322 with socket.create_server(("127.0.0.1", port)) as sock:
6323 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6324 self.assertEqual(sock.getsockname()[1], port)
6325 if support.IPV6_ENABLED:
6326 with socket.create_server(("::1", port),
6327 family=socket.AF_INET6) as sock:
6328 self.assertEqual(sock.getsockname()[0], "::1")
6329 self.assertEqual(sock.getsockname()[1], port)
6330
6331 def test_family_and_type(self):
6332 with socket.create_server(("127.0.0.1", 0)) as sock:
6333 self.assertEqual(sock.family, socket.AF_INET)
6334 self.assertEqual(sock.type, socket.SOCK_STREAM)
6335 if support.IPV6_ENABLED:
6336 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6337 self.assertEqual(s.family, socket.AF_INET6)
6338 self.assertEqual(sock.type, socket.SOCK_STREAM)
6339
6340 def test_reuse_port(self):
6341 if not hasattr(socket, "SO_REUSEPORT"):
6342 with self.assertRaises(ValueError):
6343 socket.create_server(("localhost", 0), reuse_port=True)
6344 else:
6345 with socket.create_server(("localhost", 0)) as sock:
6346 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6347 self.assertEqual(opt, 0)
6348 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6349 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6350 self.assertNotEqual(opt, 0)
6351
6352 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6353 not hasattr(_socket, 'IPV6_V6ONLY'),
6354 "IPV6_V6ONLY option not supported")
6355 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6356 def test_ipv6_only_default(self):
6357 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6358 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6359
6360 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6361 "dualstack_ipv6 not supported")
6362 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6363 def test_dualstack_ipv6_family(self):
6364 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6365 dualstack_ipv6=True) as sock:
6366 self.assertEqual(sock.family, socket.AF_INET6)
6367
6368
6369class CreateServerFunctionalTest(unittest.TestCase):
6370 timeout = 3
6371
6372 def setUp(self):
6373 self.thread = None
6374
6375 def tearDown(self):
6376 if self.thread is not None:
6377 self.thread.join(self.timeout)
6378
6379 def echo_server(self, sock):
6380 def run(sock):
6381 with sock:
6382 conn, _ = sock.accept()
6383 with conn:
6384 event.wait(self.timeout)
6385 msg = conn.recv(1024)
6386 if not msg:
6387 return
6388 conn.sendall(msg)
6389
6390 event = threading.Event()
6391 sock.settimeout(self.timeout)
6392 self.thread = threading.Thread(target=run, args=(sock, ))
6393 self.thread.start()
6394 event.set()
6395
6396 def echo_client(self, addr, family):
6397 with socket.socket(family=family) as sock:
6398 sock.settimeout(self.timeout)
6399 sock.connect(addr)
6400 sock.sendall(b'foo')
6401 self.assertEqual(sock.recv(1024), b'foo')
6402
6403 def test_tcp4(self):
6404 port = support.find_unused_port()
6405 with socket.create_server(("", port)) as sock:
6406 self.echo_server(sock)
6407 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6408
6409 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6410 def test_tcp6(self):
6411 port = support.find_unused_port()
6412 with socket.create_server(("", port),
6413 family=socket.AF_INET6) as sock:
6414 self.echo_server(sock)
6415 self.echo_client(("::1", port), socket.AF_INET6)
6416
6417 # --- dual stack tests
6418
6419 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6420 "dualstack_ipv6 not supported")
6421 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6422 def test_dual_stack_client_v4(self):
6423 port = support.find_unused_port()
6424 with socket.create_server(("", port), family=socket.AF_INET6,
6425 dualstack_ipv6=True) as sock:
6426 self.echo_server(sock)
6427 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6428
6429 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6430 "dualstack_ipv6 not supported")
6431 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6432 def test_dual_stack_client_v6(self):
6433 port = support.find_unused_port()
6434 with socket.create_server(("", port), family=socket.AF_INET6,
6435 dualstack_ipv6=True) as sock:
6436 self.echo_server(sock)
6437 self.echo_client(("::1", port), socket.AF_INET6)
6438
6439
Guido van Rossumb995eb72002-07-31 16:08:40 +00006440def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006441 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006442 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
6443 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006444
6445 tests.extend([
6446 NonBlockingTCPTests,
6447 FileObjectClassTestCase,
6448 UnbufferedFileObjectClassTestCase,
6449 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006450 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006451 UnicodeReadFileObjectClassTestCase,
6452 UnicodeWriteFileObjectClassTestCase,
6453 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006454 NetworkConnectionNoServer,
6455 NetworkConnectionAttributesTest,
6456 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006457 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006458 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006459 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006460 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006461 tests.append(BasicSocketPairTest)
6462 tests.append(TestUnixDomain)
6463 tests.append(TestLinuxAbstractNamespace)
6464 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006465 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006466 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006467 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006468 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006469 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006470 BasicVSOCKTest,
6471 ThreadedVSOCKSocketStreamTest,
6472 ])
Greg Bowser8fbece12019-08-02 16:29:52 -04006473 tests.append(BasicBluetoothTest)
caaveryeffc12f2017-09-06 18:18:10 -04006474 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006475 CmsgMacroTests,
6476 SendmsgUDPTest,
6477 RecvmsgUDPTest,
6478 RecvmsgIntoUDPTest,
6479 SendmsgUDP6Test,
6480 RecvmsgUDP6Test,
6481 RecvmsgRFC3542AncillaryUDP6Test,
6482 RecvmsgIntoRFC3542AncillaryUDP6Test,
6483 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006484 SendmsgUDPLITETest,
6485 RecvmsgUDPLITETest,
6486 RecvmsgIntoUDPLITETest,
6487 SendmsgUDPLITE6Test,
6488 RecvmsgUDPLITE6Test,
6489 RecvmsgRFC3542AncillaryUDPLITE6Test,
6490 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6491 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006492 SendmsgTCPTest,
6493 RecvmsgTCPTest,
6494 RecvmsgIntoTCPTest,
6495 SendmsgSCTPStreamTest,
6496 RecvmsgSCTPStreamTest,
6497 RecvmsgIntoSCTPStreamTest,
6498 SendmsgUnixStreamTest,
6499 RecvmsgUnixStreamTest,
6500 RecvmsgIntoUnixStreamTest,
6501 RecvmsgSCMRightsStreamTest,
6502 RecvmsgIntoSCMRightsStreamTest,
6503 # These are slow when setitimer() is not available
6504 InterruptedRecvTimeoutTest,
6505 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006506 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006507 SendfileUsingSendTest,
6508 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006509 ])
animalize19e7d482018-02-27 02:10:36 +08006510 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006511
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006512 thread_info = support.threading_setup()
6513 support.run_unittest(*tests)
6514 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006515
6516if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006517 test_main()