blob: 11b2a38ad76dde27efafaaa7e1958aa9a8c3e356 [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
Victor Stinner304315d2018-11-30 13:22:44 +0100117@contextlib.contextmanager
118def socket_setdefaulttimeout(timeout):
119 old_timeout = socket.getdefaulttimeout()
120 try:
121 socket.setdefaulttimeout(timeout)
122 yield
123 finally:
124 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500125
126
Charles-François Natali47413c12011-10-06 19:47:44 +0200127HAVE_SOCKET_CAN = _have_socket_can()
128
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400129HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
130
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100131HAVE_SOCKET_RDS = _have_socket_rds()
132
Christian Heimes48371412016-09-06 00:37:46 +0200133HAVE_SOCKET_ALG = _have_socket_alg()
134
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700135HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
136
caaveryeffc12f2017-09-06 18:18:10 -0400137HAVE_SOCKET_VSOCK = _have_socket_vsock()
138
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700139HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
140
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000141# Size in bytes of the int type
142SIZEOF_INT = array.array("i").itemsize
143
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000145
Guido van Rossum24e4af82002-06-12 19:18:08 +0000146 def setUp(self):
147 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000148 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100149 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000150
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151 def tearDown(self):
152 self.serv.close()
153 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000154
Guido van Rossum24e4af82002-06-12 19:18:08 +0000155class SocketUDPTest(unittest.TestCase):
156
157 def setUp(self):
158 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000159 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160
161 def tearDown(self):
162 self.serv.close()
163 self.serv = None
164
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700165class SocketUDPLITETest(SocketUDPTest):
166
167 def setUp(self):
168 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
169 self.port = support.bind_port(self.serv)
170
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000171class ThreadSafeCleanupTestCase(unittest.TestCase):
172 """Subclass of unittest.TestCase with thread-safe cleanup methods.
173
174 This subclass protects the addCleanup() and doCleanups() methods
175 with a recursive lock.
176 """
177
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200178 def __init__(self, *args, **kwargs):
179 super().__init__(*args, **kwargs)
180 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000181
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200182 def addCleanup(self, *args, **kwargs):
183 with self._cleanup_lock:
184 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000185
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200186 def doCleanups(self, *args, **kwargs):
187 with self._cleanup_lock:
188 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000189
Charles-François Natali47413c12011-10-06 19:47:44 +0200190class SocketCANTest(unittest.TestCase):
191
192 """To be able to run this test, a `vcan0` CAN interface can be created with
193 the following commands:
194 # modprobe vcan
195 # ip link add dev vcan0 type vcan
196 # ifconfig vcan0 up
197 """
198 interface = 'vcan0'
199 bufsize = 128
200
Charles-François Natali773e42d2013-02-05 19:42:01 +0100201 """The CAN frame structure is defined in <linux/can.h>:
202
203 struct can_frame {
204 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
205 __u8 can_dlc; /* data length code: 0 .. 8 */
206 __u8 data[8] __attribute__((aligned(8)));
207 };
208 """
209 can_frame_fmt = "=IB3x8s"
210 can_frame_size = struct.calcsize(can_frame_fmt)
211
212 """The Broadcast Management Command frame structure is defined
213 in <linux/can/bcm.h>:
214
215 struct bcm_msg_head {
216 __u32 opcode;
217 __u32 flags;
218 __u32 count;
219 struct timeval ival1, ival2;
220 canid_t can_id;
221 __u32 nframes;
222 struct can_frame frames[0];
223 }
224
225 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
226 `struct can_frame` definition). Must use native not standard types for packing.
227 """
228 bcm_cmd_msg_fmt = "@3I4l2I"
229 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
230
Charles-François Natali47413c12011-10-06 19:47:44 +0200231 def setUp(self):
232 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200233 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200234 try:
235 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200236 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200237 self.skipTest('network interface `%s` does not exist' %
238 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200239
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100240
241class SocketRDSTest(unittest.TestCase):
242
243 """To be able to run this test, the `rds` kernel module must be loaded:
244 # modprobe rds
245 """
246 bufsize = 8192
247
248 def setUp(self):
249 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
250 self.addCleanup(self.serv.close)
251 try:
252 self.port = support.bind_port(self.serv)
253 except OSError:
254 self.skipTest('unable to bind RDS socket')
255
256
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000258 """Threadable Test class
259
260 The ThreadableTest class makes it easy to create a threaded
261 client/server pair from an existing unit test. To create a
262 new threaded class from an existing unit test, use multiple
263 inheritance:
264
265 class NewClass (OldClass, ThreadableTest):
266 pass
267
268 This class defines two new fixture functions with obvious
269 purposes for overriding:
270
271 clientSetUp ()
272 clientTearDown ()
273
274 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000275 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000276 '_' to indicate the client portion of the test. Ex:
277
278 def testFoo(self):
279 # Server portion
280
281 def _testFoo(self):
282 # Client portion
283
284 Any exceptions raised by the clients during their tests
285 are caught and transferred to the main thread to alert
286 the testing framework.
287
288 Note, the server setup function cannot call any blocking
289 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000290 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000291 the blocking call (such as in setting up a client/server
292 connection and performing the accept() in setUp().
293 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294
295 def __init__(self):
296 # Swap the true setup function
297 self.__setUp = self.setUp
298 self.__tearDown = self.tearDown
299 self.setUp = self._setUp
300 self.tearDown = self._tearDown
301
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000302 def serverExplicitReady(self):
303 """This method allows the server to explicitly indicate that
304 it wants the client thread to proceed. This is useful if the
305 server is about to execute a blocking routine that is
306 dependent upon the client thread during its setup routine."""
307 self.server_ready.set()
308
Guido van Rossum24e4af82002-06-12 19:18:08 +0000309 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700310 self.wait_threads = support.wait_threads_exit()
311 self.wait_threads.__enter__()
312
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000313 self.server_ready = threading.Event()
314 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000316 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200317 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318
319 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000320 methodname = self.id()
321 i = methodname.rfind('.')
322 methodname = methodname[i+1:]
323 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000324 self.client_thread = thread.start_new_thread(
325 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000326
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200327 try:
328 self.__setUp()
329 except:
330 self.server_crashed = True
331 raise
332 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000333 self.server_ready.set()
334 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000335
336 def _tearDown(self):
337 self.__tearDown()
338 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700339 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000341 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000342 exc = self.queue.get()
343 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000344
345 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000346 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100347 try:
348 self.clientSetUp()
349 except BaseException as e:
350 self.queue.put(e)
351 self.clientTearDown()
352 return
353 finally:
354 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200355 if self.server_crashed:
356 self.clientTearDown()
357 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000358 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000359 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000360 try:
361 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000362 except BaseException as e:
363 self.queue.put(e)
364 finally:
365 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366
367 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000368 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000369
370 def clientTearDown(self):
371 self.done.set()
372 thread.exit()
373
374class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
375
376 def __init__(self, methodName='runTest'):
377 SocketTCPTest.__init__(self, methodName=methodName)
378 ThreadableTest.__init__(self)
379
380 def clientSetUp(self):
381 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
382
383 def clientTearDown(self):
384 self.cli.close()
385 self.cli = None
386 ThreadableTest.clientTearDown(self)
387
388class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
389
390 def __init__(self, methodName='runTest'):
391 SocketUDPTest.__init__(self, methodName=methodName)
392 ThreadableTest.__init__(self)
393
394 def clientSetUp(self):
395 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
396
Brian Curtin3beb38f2010-11-04 03:41:43 +0000397 def clientTearDown(self):
398 self.cli.close()
399 self.cli = None
400 ThreadableTest.clientTearDown(self)
401
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700402@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
403 'UDPLITE sockets required for this test.')
404class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
405
406 def __init__(self, methodName='runTest'):
407 SocketUDPLITETest.__init__(self, methodName=methodName)
408 ThreadableTest.__init__(self)
409
410 def clientSetUp(self):
411 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
412
413 def clientTearDown(self):
414 self.cli.close()
415 self.cli = None
416 ThreadableTest.clientTearDown(self)
417
Charles-François Natali47413c12011-10-06 19:47:44 +0200418class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
419
420 def __init__(self, methodName='runTest'):
421 SocketCANTest.__init__(self, methodName=methodName)
422 ThreadableTest.__init__(self)
423
424 def clientSetUp(self):
425 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
426 try:
427 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200428 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200429 # skipTest should not be called here, and will be called in the
430 # server instead
431 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200432
433 def clientTearDown(self):
434 self.cli.close()
435 self.cli = None
436 ThreadableTest.clientTearDown(self)
437
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100438class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
439
440 def __init__(self, methodName='runTest'):
441 SocketRDSTest.__init__(self, methodName=methodName)
442 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100443
444 def clientSetUp(self):
445 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
446 try:
447 # RDS sockets must be bound explicitly to send or receive data
448 self.cli.bind((HOST, 0))
449 self.cli_addr = self.cli.getsockname()
450 except OSError:
451 # skipTest should not be called here, and will be called in the
452 # server instead
453 pass
454
455 def clientTearDown(self):
456 self.cli.close()
457 self.cli = None
458 ThreadableTest.clientTearDown(self)
459
caaveryeffc12f2017-09-06 18:18:10 -0400460@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400461@unittest.skipUnless(HAVE_SOCKET_VSOCK,
462 'VSOCK sockets required for this test.')
463@unittest.skipUnless(get_cid() != 2,
464 "This test can only be run on a virtual guest.")
465class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
466
467 def __init__(self, methodName='runTest'):
468 unittest.TestCase.__init__(self, methodName=methodName)
469 ThreadableTest.__init__(self)
470
471 def setUp(self):
472 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
473 self.addCleanup(self.serv.close)
474 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
475 self.serv.listen()
476 self.serverExplicitReady()
477 self.conn, self.connaddr = self.serv.accept()
478 self.addCleanup(self.conn.close)
479
480 def clientSetUp(self):
481 time.sleep(0.1)
482 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
483 self.addCleanup(self.cli.close)
484 cid = get_cid()
485 self.cli.connect((cid, VSOCKPORT))
486
487 def testStream(self):
488 msg = self.conn.recv(1024)
489 self.assertEqual(msg, MSG)
490
491 def _testStream(self):
492 self.cli.send(MSG)
493 self.cli.close()
494
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000496 """Socket tests for client-server connection.
497
498 self.cli_conn is a client socket connected to the server. The
499 setUp() method guarantees that it is connected to the server.
500 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000501
502 def __init__(self, methodName='runTest'):
503 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
504
505 def setUp(self):
506 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000507 # Indicate explicitly we're ready for the client thread to
508 # proceed and then perform the blocking call to accept
509 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 conn, addr = self.serv.accept()
511 self.cli_conn = conn
512
513 def tearDown(self):
514 self.cli_conn.close()
515 self.cli_conn = None
516 ThreadedTCPSocketTest.tearDown(self)
517
518 def clientSetUp(self):
519 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000520 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521 self.serv_conn = self.cli
522
523 def clientTearDown(self):
524 self.serv_conn.close()
525 self.serv_conn = None
526 ThreadedTCPSocketTest.clientTearDown(self)
527
Dave Cole331708b2004-08-09 04:51:41 +0000528class SocketPairTest(unittest.TestCase, ThreadableTest):
529
530 def __init__(self, methodName='runTest'):
531 unittest.TestCase.__init__(self, methodName=methodName)
532 ThreadableTest.__init__(self)
533
534 def setUp(self):
535 self.serv, self.cli = socket.socketpair()
536
537 def tearDown(self):
538 self.serv.close()
539 self.serv = None
540
541 def clientSetUp(self):
542 pass
543
544 def clientTearDown(self):
545 self.cli.close()
546 self.cli = None
547 ThreadableTest.clientTearDown(self)
548
Tim Peters494aaee2004-08-09 18:54:11 +0000549
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000550# The following classes are used by the sendmsg()/recvmsg() tests.
551# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
552# gives a drop-in replacement for SocketConnectedTest, but different
553# address families can be used, and the attributes serv_addr and
554# cli_addr will be set to the addresses of the endpoints.
555
556class SocketTestBase(unittest.TestCase):
557 """A base class for socket tests.
558
559 Subclasses must provide methods newSocket() to return a new socket
560 and bindSock(sock) to bind it to an unused address.
561
562 Creates a socket self.serv and sets self.serv_addr to its address.
563 """
564
565 def setUp(self):
566 self.serv = self.newSocket()
567 self.bindServer()
568
569 def bindServer(self):
570 """Bind server socket and set self.serv_addr to its address."""
571 self.bindSock(self.serv)
572 self.serv_addr = self.serv.getsockname()
573
574 def tearDown(self):
575 self.serv.close()
576 self.serv = None
577
578
579class SocketListeningTestMixin(SocketTestBase):
580 """Mixin to listen on the server socket."""
581
582 def setUp(self):
583 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100584 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000585
586
587class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
588 ThreadableTest):
589 """Mixin to add client socket and allow client/server tests.
590
591 Client socket is self.cli and its address is self.cli_addr. See
592 ThreadableTest for usage information.
593 """
594
595 def __init__(self, *args, **kwargs):
596 super().__init__(*args, **kwargs)
597 ThreadableTest.__init__(self)
598
599 def clientSetUp(self):
600 self.cli = self.newClientSocket()
601 self.bindClient()
602
603 def newClientSocket(self):
604 """Return a new socket for use as client."""
605 return self.newSocket()
606
607 def bindClient(self):
608 """Bind client socket and set self.cli_addr to its address."""
609 self.bindSock(self.cli)
610 self.cli_addr = self.cli.getsockname()
611
612 def clientTearDown(self):
613 self.cli.close()
614 self.cli = None
615 ThreadableTest.clientTearDown(self)
616
617
618class ConnectedStreamTestMixin(SocketListeningTestMixin,
619 ThreadedSocketTestMixin):
620 """Mixin to allow client/server stream tests with connected client.
621
622 Server's socket representing connection to client is self.cli_conn
623 and client's connection to server is self.serv_conn. (Based on
624 SocketConnectedTest.)
625 """
626
627 def setUp(self):
628 super().setUp()
629 # Indicate explicitly we're ready for the client thread to
630 # proceed and then perform the blocking call to accept
631 self.serverExplicitReady()
632 conn, addr = self.serv.accept()
633 self.cli_conn = conn
634
635 def tearDown(self):
636 self.cli_conn.close()
637 self.cli_conn = None
638 super().tearDown()
639
640 def clientSetUp(self):
641 super().clientSetUp()
642 self.cli.connect(self.serv_addr)
643 self.serv_conn = self.cli
644
645 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100646 try:
647 self.serv_conn.close()
648 self.serv_conn = None
649 except AttributeError:
650 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000651 super().clientTearDown()
652
653
654class UnixSocketTestBase(SocketTestBase):
655 """Base class for Unix-domain socket tests."""
656
657 # This class is used for file descriptor passing tests, so we
658 # create the sockets in a private directory so that other users
659 # can't send anything that might be problematic for a privileged
660 # user running the tests.
661
662 def setUp(self):
663 self.dir_path = tempfile.mkdtemp()
664 self.addCleanup(os.rmdir, self.dir_path)
665 super().setUp()
666
667 def bindSock(self, sock):
668 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100669 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000670 self.addCleanup(support.unlink, path)
671
672class UnixStreamBase(UnixSocketTestBase):
673 """Base class for Unix-domain SOCK_STREAM tests."""
674
675 def newSocket(self):
676 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
677
678
679class InetTestBase(SocketTestBase):
680 """Base class for IPv4 socket tests."""
681
682 host = HOST
683
684 def setUp(self):
685 super().setUp()
686 self.port = self.serv_addr[1]
687
688 def bindSock(self, sock):
689 support.bind_port(sock, host=self.host)
690
691class TCPTestBase(InetTestBase):
692 """Base class for TCP-over-IPv4 tests."""
693
694 def newSocket(self):
695 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
696
697class UDPTestBase(InetTestBase):
698 """Base class for UDP-over-IPv4 tests."""
699
700 def newSocket(self):
701 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
702
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700703class UDPLITETestBase(InetTestBase):
704 """Base class for UDPLITE-over-IPv4 tests."""
705
706 def newSocket(self):
707 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
708
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000709class SCTPStreamBase(InetTestBase):
710 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
711
712 def newSocket(self):
713 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
714 socket.IPPROTO_SCTP)
715
716
717class Inet6TestBase(InetTestBase):
718 """Base class for IPv6 socket tests."""
719
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200720 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000721
722class UDP6TestBase(Inet6TestBase):
723 """Base class for UDP-over-IPv6 tests."""
724
725 def newSocket(self):
726 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
727
Gabe Appleton2ac3bab2019-06-24 02:58:56 -0700728class UDPLITE6TestBase(Inet6TestBase):
729 """Base class for UDPLITE-over-IPv6 tests."""
730
731 def newSocket(self):
732 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
733
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000734
735# Test-skipping decorators for use with ThreadableTest.
736
737def skipWithClientIf(condition, reason):
738 """Skip decorated test if condition is true, add client_skip decorator.
739
740 If the decorated object is not a class, sets its attribute
741 "client_skip" to a decorator which will return an empty function
742 if the test is to be skipped, or the original function if it is
743 not. This can be used to avoid running the client part of a
744 skipped test when using ThreadableTest.
745 """
746 def client_pass(*args, **kwargs):
747 pass
748 def skipdec(obj):
749 retval = unittest.skip(reason)(obj)
750 if not isinstance(obj, type):
751 retval.client_skip = lambda f: client_pass
752 return retval
753 def noskipdec(obj):
754 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
755 obj.client_skip = lambda f: f
756 return obj
757 return skipdec if condition else noskipdec
758
759
760def requireAttrs(obj, *attributes):
761 """Skip decorated test if obj is missing any of the given attributes.
762
763 Sets client_skip attribute as skipWithClientIf() does.
764 """
765 missing = [name for name in attributes if not hasattr(obj, name)]
766 return skipWithClientIf(
767 missing, "don't have " + ", ".join(name for name in missing))
768
769
770def requireSocket(*args):
771 """Skip decorated test if a socket cannot be created with given arguments.
772
773 When an argument is given as a string, will use the value of that
774 attribute of the socket module, or skip the test if it doesn't
775 exist. Sets client_skip attribute as skipWithClientIf() does.
776 """
777 err = None
778 missing = [obj for obj in args if
779 isinstance(obj, str) and not hasattr(socket, obj)]
780 if missing:
781 err = "don't have " + ", ".join(name for name in missing)
782 else:
783 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
784 for obj in args]
785 try:
786 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200787 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000788 # XXX: check errno?
789 err = str(e)
790 else:
791 s.close()
792 return skipWithClientIf(
793 err is not None,
794 "can't create socket({0}): {1}".format(
795 ", ".join(str(o) for o in args), err))
796
797
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798#######################################################################
799## Begin Tests
800
801class GeneralModuleTests(unittest.TestCase):
802
Ethan Furman7184bac2014-10-14 18:56:53 -0700803 def test_SocketType_is_socketobject(self):
804 import _socket
805 self.assertTrue(socket.SocketType is _socket.socket)
806 s = socket.socket()
807 self.assertIsInstance(s, socket.SocketType)
808 s.close()
809
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000810 def test_repr(self):
811 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200812 with s:
813 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000814 self.assertIn('family=%s' % socket.AF_INET, repr(s))
815 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200816 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200817 self.assertNotIn('raddr', repr(s))
818 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200819 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200820 self.assertIn(str(s.getsockname()), repr(s))
821 self.assertIn('[closed]', repr(s))
822 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000823
Victor Stinnere254e532014-07-26 14:36:55 +0200824 @unittest.skipUnless(_socket is not None, 'need _socket module')
825 def test_csocket_repr(self):
826 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
827 try:
828 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
829 % (s.fileno(), s.family, s.type, s.proto))
830 self.assertEqual(repr(s), expected)
831 finally:
832 s.close()
833 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
834 % (s.family, s.type, s.proto))
835 self.assertEqual(repr(s), expected)
836
Raymond Hettinger027bb632004-05-31 03:09:25 +0000837 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200838 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
839 p = proxy(s)
840 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000841 s = None
842 try:
843 p.fileno()
844 except ReferenceError:
845 pass
846 else:
847 self.fail('Socket proxy still exists')
848
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000850 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300851 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200852 with self.assertRaises(OSError, msg=msg % 'OSError'):
853 raise OSError
854 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200856 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858
Ezio Melotti63e42302011-05-07 19:47:48 +0300859 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000860 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300861 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
862 self.addCleanup(s.close)
863 s.bind(('', 0))
864 sockname = s.getsockname()
865 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300866 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300867 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300868 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400869 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300870 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300871 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300872 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400873 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300874 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300875 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300876 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300877 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300878 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300879 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300880 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400881 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300882 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300883 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300884 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400885 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300886 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300887 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300888 self.assertIn('not NoneType', str(cm.exception))
889 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300890 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300891 self.assertIn('an integer is required', str(cm.exception))
892 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300893 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300894 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300895 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300896 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300897 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300898 self.assertIn('(1 given)', str(cm.exception))
899 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300900 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300901 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300902
Guido van Rossum24e4af82002-06-12 19:18:08 +0000903 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000904 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100906 if socket.has_ipv6:
907 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000908 socket.SOCK_STREAM
909 socket.SOCK_DGRAM
910 socket.SOCK_RAW
911 socket.SOCK_RDM
912 socket.SOCK_SEQPACKET
913 socket.SOL_SOCKET
914 socket.SO_REUSEADDR
915
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100916 def testCrucialIpProtoConstants(self):
917 socket.IPPROTO_TCP
918 socket.IPPROTO_UDP
919 if socket.has_ipv6:
920 socket.IPPROTO_IPV6
921
922 @unittest.skipUnless(os.name == "nt", "Windows specific")
923 def testWindowsSpecificConstants(self):
924 socket.IPPROTO_ICLFXBM
925 socket.IPPROTO_ST
926 socket.IPPROTO_CBT
927 socket.IPPROTO_IGP
928 socket.IPPROTO_RDP
929 socket.IPPROTO_PGM
930 socket.IPPROTO_L2TP
931 socket.IPPROTO_SCTP
932
Guido van Rossum654c11e2002-06-13 20:24:17 +0000933 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000934 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000935 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000936 try:
937 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200938 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000939 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600940 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000941 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000942 try:
943 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200944 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000945 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600946 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000947 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000948 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000949 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000950 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000951
Charles-François Natali0cc86852013-09-13 19:53:08 +0200952 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700953 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200954 self.assertEqual(socket.gethostbyname(addr), addr)
955
956 # we don't test support.HOSTv6 because there's a chance it doesn't have
957 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700958 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200959 self.assertIn(host, socket.gethostbyaddr(host)[2])
960
Xiang Zhangd36a7162017-03-07 11:06:09 +0800961 def test_host_resolution_bad_address(self):
962 # These are all malformed IP addresses and expected not to resolve to
963 # any result. But some ISPs, e.g. AWS, may successfully resolve these
964 # IPs.
965 explanation = (
966 "resolving an invalid IP address did not raise OSError; "
967 "can be caused by a broken DNS server"
968 )
969 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
970 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400971 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800972 socket.gethostbyname(addr)
973 with self.assertRaises(OSError, msg=explanation):
974 socket.gethostbyaddr(addr)
975
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000976 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
977 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
978 def test_sethostname(self):
979 oldhn = socket.gethostname()
980 try:
981 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200982 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000983 if e.errno == errno.EPERM:
984 self.skipTest("test should be run as root")
985 else:
986 raise
987 try:
988 # running test as root!
989 self.assertEqual(socket.gethostname(), 'new')
990 # Should work with bytes objects too
991 socket.sethostname(b'bar')
992 self.assertEqual(socket.gethostname(), 'bar')
993 finally:
994 socket.sethostname(oldhn)
995
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700996 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
997 'socket.if_nameindex() not available.')
998 def testInterfaceNameIndex(self):
999 interfaces = socket.if_nameindex()
1000 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +02001001 self.assertIsInstance(index, int)
1002 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001003 # interface indices are non-zero integers
1004 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001005 _index = socket.if_nametoindex(name)
1006 self.assertIsInstance(_index, int)
1007 self.assertEqual(index, _index)
1008 _name = socket.if_indextoname(index)
1009 self.assertIsInstance(_name, str)
1010 self.assertEqual(name, _name)
1011
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001012 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
1013 'socket.if_indextoname() not available.')
1014 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02001015 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +02001016 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07001017
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001018 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
1019 'socket.if_nametoindex() not available.')
1020 def testInvalidInterfaceNameToIndex(self):
1021 self.assertRaises(TypeError, socket.if_nametoindex, 0)
1022 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
1023
Serhiy Storchaka43767632013-11-03 21:31:38 +02001024 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
1025 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +00001026 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001027 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +02001028 try:
1029 # On some versions, this loses a reference
1030 orig = sys.getrefcount(__name__)
1031 socket.getnameinfo(__name__,0)
1032 except TypeError:
1033 if sys.getrefcount(__name__) != orig:
1034 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001035
Guido van Rossum24e4af82002-06-12 19:18:08 +00001036 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001037 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038 try:
1039 # On some versions, this crashes the interpreter.
1040 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001041 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001042 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001043
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001044 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001045 # This just checks that htons etc. are their own inverse,
1046 # when looking at the lower 16 or 32 bits.
1047 sizes = {socket.htonl: 32, socket.ntohl: 32,
1048 socket.htons: 16, socket.ntohs: 16}
1049 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001050 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001051 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1052 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001053
Guido van Rossuma2627af2002-09-14 00:58:46 +00001054 swapped = func(mask)
1055 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001056 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001057
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001058 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001059 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001060 import _testcapi
1061 s_good_values = [0, 1, 2, 0xffff]
1062 l_good_values = s_good_values + [0xffffffff]
1063 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1064 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1065 _testcapi.INT_MAX + 1]
1066 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1067 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001068 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001069 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001070 for k in l_good_values:
1071 socket.ntohl(k)
1072 socket.htonl(k)
1073 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001074 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001075 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001076 for k in l_bad_values:
1077 self.assertRaises(OverflowError, socket.ntohl, k)
1078 self.assertRaises(OverflowError, socket.htonl, k)
1079 for k in s_deprecated_values:
1080 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1081 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001082
Barry Warsaw11b91a02004-06-28 00:50:43 +00001083 def testGetServBy(self):
1084 eq = self.assertEqual
1085 # Find one service that exists, then check all the related interfaces.
1086 # I've ordered this by protocols that have both a tcp and udp
1087 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001088 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001089 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001090 # avoid the 'echo' service on this platform, as there is an
1091 # assumption breaking non-standard port/protocol entry
1092 services = ('daytime', 'qotd', 'domain')
1093 else:
1094 services = ('echo', 'daytime', 'domain')
1095 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001096 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001097 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001098 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001099 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001100 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001101 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001102 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001103 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001104 # Issue #26936: Android getservbyname() was broken before API 23.
1105 if (not hasattr(sys, 'getandroidapilevel') or
1106 sys.getandroidapilevel() >= 23):
1107 port2 = socket.getservbyname(service)
1108 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001109 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001110 try:
1111 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001112 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001113 udpport = None
1114 else:
1115 eq(udpport, port)
1116 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001117 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001118 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001119 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001120 eq(socket.getservbyport(port, 'tcp'), service)
1121 if udpport is not None:
1122 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001123 # Make sure getservbyport does not accept out of range ports.
1124 self.assertRaises(OverflowError, socket.getservbyport, -1)
1125 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001127 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001128 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001129 # The default timeout should initially be None
1130 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001131 with socket.socket() as s:
1132 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001133
1134 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001135 with socket_setdefaulttimeout(10):
1136 self.assertEqual(socket.getdefaulttimeout(), 10)
1137 with socket.socket() as sock:
1138 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001139
Victor Stinner304315d2018-11-30 13:22:44 +01001140 # Reset the default timeout to None, and see if it propagates
1141 socket.setdefaulttimeout(None)
1142 self.assertEqual(socket.getdefaulttimeout(), None)
1143 with socket.socket() as sock:
1144 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001145
1146 # Check that setting it to an invalid value raises ValueError
1147 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1148
1149 # Check that setting it to an invalid type raises TypeError
1150 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1151
Serhiy Storchaka43767632013-11-03 21:31:38 +02001152 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1153 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001154 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001155 # Test that issue1008086 and issue767150 are fixed.
1156 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001157 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1158 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001159
Serhiy Storchaka43767632013-11-03 21:31:38 +02001160 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1161 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001162 def testIPv4toString(self):
1163 from socket import inet_aton as f, inet_pton, AF_INET
1164 g = lambda a: inet_pton(AF_INET, a)
1165
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001166 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001167 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001168 )
1169
Ezio Melottib3aedd42010-11-20 19:04:17 +00001170 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1171 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1172 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1173 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1174 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001175 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001176 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001177 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001178 assertInvalid(f, '300.0.0.0')
1179 assertInvalid(f, 'a.0.0.0')
1180 assertInvalid(f, '1.2.3.4.5')
1181 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001182
Ezio Melottib3aedd42010-11-20 19:04:17 +00001183 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1184 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1185 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1186 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001187 assertInvalid(g, '0.0.0.')
1188 assertInvalid(g, '300.0.0.0')
1189 assertInvalid(g, 'a.0.0.0')
1190 assertInvalid(g, '1.2.3.4.5')
1191 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001192
Serhiy Storchaka43767632013-11-03 21:31:38 +02001193 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1194 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001195 def testIPv6toString(self):
1196 try:
1197 from socket import inet_pton, AF_INET6, has_ipv6
1198 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001199 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001200 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001201 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001202
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001203 if sys.platform == "win32":
1204 try:
1205 inet_pton(AF_INET6, '::')
1206 except OSError as e:
1207 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001208 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001209
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001210 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001211 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001212 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001213 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001214
Ezio Melottib3aedd42010-11-20 19:04:17 +00001215 self.assertEqual(b'\x00' * 16, f('::'))
1216 self.assertEqual(b'\x00' * 16, f('0::0'))
1217 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1218 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001219 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 +00001220 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1221 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001222 self.assertEqual(
1223 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1224 f('ad42:abc::127:0:254:2')
1225 )
1226 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1227 assertInvalid('0x20::')
1228 assertInvalid(':::')
1229 assertInvalid('::0::')
1230 assertInvalid('1::abc::')
1231 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001232 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001233 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001234 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001235 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001236 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001237 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001238
1239 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1240 f('::254.42.23.64')
1241 )
1242 self.assertEqual(
1243 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1244 f('42::a29b:254.42.23.64')
1245 )
1246 self.assertEqual(
1247 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1248 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1249 )
1250 assertInvalid('255.254.253.252')
1251 assertInvalid('1::260.2.3.0')
1252 assertInvalid('1::0.be.e.0')
1253 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1254 assertInvalid('::1.2.3.4:0')
1255 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001256
Serhiy Storchaka43767632013-11-03 21:31:38 +02001257 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1258 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001259 def testStringToIPv4(self):
1260 from socket import inet_ntoa as f, inet_ntop, AF_INET
1261 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001262 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001263 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001264 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001265
Ezio Melottib3aedd42010-11-20 19:04:17 +00001266 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1267 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1268 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1269 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001270 assertInvalid(f, b'\x00' * 3)
1271 assertInvalid(f, b'\x00' * 5)
1272 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001273 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001274
Ezio Melottib3aedd42010-11-20 19:04:17 +00001275 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1276 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1277 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001278 assertInvalid(g, b'\x00' * 3)
1279 assertInvalid(g, b'\x00' * 5)
1280 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001281 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001282
Serhiy Storchaka43767632013-11-03 21:31:38 +02001283 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1284 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001285 def testStringToIPv6(self):
1286 try:
1287 from socket import inet_ntop, AF_INET6, has_ipv6
1288 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001289 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001290 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001291 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001292
1293 if sys.platform == "win32":
1294 try:
1295 inet_ntop(AF_INET6, b'\x00' * 16)
1296 except OSError as e:
1297 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001298 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001299
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001300 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001301 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001302 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001303 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001304
Ezio Melottib3aedd42010-11-20 19:04:17 +00001305 self.assertEqual('::', f(b'\x00' * 16))
1306 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1307 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001308 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001309 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 +00001310 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001311 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001312
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001313 assertInvalid(b'\x12' * 15)
1314 assertInvalid(b'\x12' * 17)
1315 assertInvalid(b'\x12' * 4)
1316
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001317 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001318
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001319 def testSockName(self):
1320 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001321 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001322 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001323 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001324 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001325 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001326 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1327 # it reasonable to get the host's addr in addition to 0.0.0.0.
1328 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001329 try:
1330 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001331 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001332 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001333 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001334 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001335 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001336
1337 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001338 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001339 # We know a socket should start without reuse==0
1340 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001341 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001342 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001343 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001344
1345 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001346 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001347 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001348 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001349 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1350 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001351 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001352
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001353 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001354 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001355 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1356 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001357 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001358
Martin Panter50ab1a32016-04-11 00:38:12 +00001359 def testCloseException(self):
1360 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001361 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001362 socket.socket(fileno=sock.fileno()).close()
1363 try:
1364 sock.close()
1365 except OSError as err:
1366 # Winsock apparently raises ENOTSOCK
1367 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1368 else:
1369 self.fail("close() should raise EBADF/ENOTSOCK")
1370
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001371 def testNewAttributes(self):
1372 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001373
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001374 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1375 self.assertEqual(sock.family, socket.AF_INET)
1376 if hasattr(socket, 'SOCK_CLOEXEC'):
1377 self.assertIn(sock.type,
1378 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1379 socket.SOCK_STREAM))
1380 else:
1381 self.assertEqual(sock.type, socket.SOCK_STREAM)
1382 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001383
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001384 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001385 sock = socket.socket()
1386 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001387 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001388 big_port = port + 65536
1389 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001390 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1391 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1392 # Since find_unused_port() is inherently subject to race conditions, we
1393 # call it a couple times if necessary.
1394 for i in itertools.count():
1395 port = support.find_unused_port()
1396 try:
1397 sock.bind((HOST, port))
1398 except OSError as e:
1399 if e.errno != errno.EADDRINUSE or i == 5:
1400 raise
1401 else:
1402 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001403
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001404 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001405 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001406 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1407 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1408 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1409 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001410 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1411 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001412 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001413 self.assertRaises(ValueError, s.ioctl, -1, None)
1414 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001415
Steve Dowerea93ac02016-06-17 12:52:18 -07001416 @unittest.skipUnless(os.name == "nt", "Windows specific")
1417 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1418 'Loopback fast path support required for this test')
1419 def test_sio_loopback_fast_path(self):
1420 s = socket.socket()
1421 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001422 try:
1423 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1424 except OSError as exc:
1425 WSAEOPNOTSUPP = 10045
1426 if exc.winerror == WSAEOPNOTSUPP:
1427 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1428 "doesn't implemented in this Windows version")
1429 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001430 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1431
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001432 def testGetaddrinfo(self):
1433 try:
1434 socket.getaddrinfo('localhost', 80)
1435 except socket.gaierror as err:
1436 if err.errno == socket.EAI_SERVICE:
1437 # see http://bugs.python.org/issue1282647
1438 self.skipTest("buggy libc version")
1439 raise
1440 # len of every sequence is supposed to be == 5
1441 for info in socket.getaddrinfo(HOST, None):
1442 self.assertEqual(len(info), 5)
1443 # host can be a domain name, a string representation of an
1444 # IPv4/v6 address or None
1445 socket.getaddrinfo('localhost', 80)
1446 socket.getaddrinfo('127.0.0.1', 80)
1447 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001448 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001449 socket.getaddrinfo('::1', 80)
1450 # port can be a string service name such as "http", a numeric
1451 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001452 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1453 if (not hasattr(sys, 'getandroidapilevel') or
1454 sys.getandroidapilevel() >= 23):
1455 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001456 socket.getaddrinfo(HOST, 80)
1457 socket.getaddrinfo(HOST, None)
1458 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001459 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1460 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001461 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001462 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1463 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001464 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001465 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1466 for _, socktype, _, _, _ in infos:
1467 self.assertEqual(socktype, socket.SOCK_STREAM)
1468 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001469 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001470 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1471 # a server willing to support both IPv4 and IPv6 will
1472 # usually do this
1473 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1474 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001475 # test keyword arguments
1476 a = socket.getaddrinfo(HOST, None)
1477 b = socket.getaddrinfo(host=HOST, port=None)
1478 self.assertEqual(a, b)
1479 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1480 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1481 self.assertEqual(a, b)
1482 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1483 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1484 self.assertEqual(a, b)
1485 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1486 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1487 self.assertEqual(a, b)
1488 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1489 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1490 self.assertEqual(a, b)
1491 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1492 socket.AI_PASSIVE)
1493 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1494 type=socket.SOCK_STREAM, proto=0,
1495 flags=socket.AI_PASSIVE)
1496 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001497 # Issue #6697.
1498 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001499
Ned Deilyb24f4812014-02-13 22:50:42 -08001500 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001501 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001502 try:
1503 # The arguments here are undefined and the call may succeed
1504 # or fail. All we care here is that it doesn't segfault.
1505 socket.getaddrinfo("localhost", None, 0, 0, 0,
1506 socket.AI_NUMERICSERV)
1507 except socket.gaierror:
1508 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001509
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001510 def test_getnameinfo(self):
1511 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001512 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001513
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001514 @unittest.skipUnless(support.is_resource_enabled('network'),
1515 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001516 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001517 # Check for internet access before running test
1518 # (issue #12804, issue #25138).
1519 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001520 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001521
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001522 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001523 domain = 'испытание.pythontest.net'
1524 socket.gethostbyname(domain)
1525 socket.gethostbyname_ex(domain)
1526 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001527 # 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 +00001528 # have a reverse entry yet
1529 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001530
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001531 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001532 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001533 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1534 self.skipTest("signal.alarm and socket.socketpair required for this test")
1535 # Our signal handlers clobber the C errno by calling a math function
1536 # with an invalid domain value.
1537 def ok_handler(*args):
1538 self.assertRaises(ValueError, math.acosh, 0)
1539 def raising_handler(*args):
1540 self.assertRaises(ValueError, math.acosh, 0)
1541 1 // 0
1542 c, s = socket.socketpair()
1543 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1544 try:
1545 if with_timeout:
1546 # Just above the one second minimum for signal.alarm
1547 c.settimeout(1.5)
1548 with self.assertRaises(ZeroDivisionError):
1549 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001550 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001551 if with_timeout:
1552 signal.signal(signal.SIGALRM, ok_handler)
1553 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001554 self.assertRaises(socket.timeout, c.sendall,
1555 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001556 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001557 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001558 signal.signal(signal.SIGALRM, old_alarm)
1559 c.close()
1560 s.close()
1561
1562 def test_sendall_interrupted(self):
1563 self.check_sendall_interrupted(False)
1564
1565 def test_sendall_interrupted_with_timeout(self):
1566 self.check_sendall_interrupted(True)
1567
Antoine Pitroue033e062010-10-29 10:38:18 +00001568 def test_dealloc_warn(self):
1569 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1570 r = repr(sock)
1571 with self.assertWarns(ResourceWarning) as cm:
1572 sock = None
1573 support.gc_collect()
1574 self.assertIn(r, str(cm.warning.args[0]))
1575 # An open socket file object gets dereferenced after the socket
1576 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1577 f = sock.makefile('rb')
1578 r = repr(sock)
1579 sock = None
1580 support.gc_collect()
1581 with self.assertWarns(ResourceWarning):
1582 f = None
1583 support.gc_collect()
1584
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001585 def test_name_closed_socketio(self):
1586 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1587 fp = sock.makefile("rb")
1588 fp.close()
1589 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1590
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001591 def test_unusable_closed_socketio(self):
1592 with socket.socket() as sock:
1593 fp = sock.makefile("rb", buffering=0)
1594 self.assertTrue(fp.readable())
1595 self.assertFalse(fp.writable())
1596 self.assertFalse(fp.seekable())
1597 fp.close()
1598 self.assertRaises(ValueError, fp.readable)
1599 self.assertRaises(ValueError, fp.writable)
1600 self.assertRaises(ValueError, fp.seekable)
1601
Christian Heimesd0e31b92018-01-27 09:54:13 +01001602 def test_socket_close(self):
1603 sock = socket.socket()
1604 try:
1605 sock.bind((HOST, 0))
1606 socket.close(sock.fileno())
1607 with self.assertRaises(OSError):
1608 sock.listen(1)
1609 finally:
1610 with self.assertRaises(OSError):
1611 # sock.close() fails with EBADF
1612 sock.close()
1613 with self.assertRaises(TypeError):
1614 socket.close(None)
1615 with self.assertRaises(OSError):
1616 socket.close(-1)
1617
Berker Peksag3fe64d02016-02-18 17:34:00 +02001618 def test_makefile_mode(self):
1619 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1620 with self.subTest(mode=mode):
1621 with socket.socket() as sock:
1622 with sock.makefile(mode) as fp:
1623 self.assertEqual(fp.mode, mode)
1624
1625 def test_makefile_invalid_mode(self):
1626 for mode in 'rt', 'x', '+', 'a':
1627 with self.subTest(mode=mode):
1628 with socket.socket() as sock:
1629 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1630 sock.makefile(mode)
1631
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001632 def test_pickle(self):
1633 sock = socket.socket()
1634 with sock:
1635 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1636 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001637 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1638 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1639 self.assertEqual(family, socket.AF_INET)
1640 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1641 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001642
Serhiy Storchaka78980432013-01-15 01:12:17 +02001643 def test_listen_backlog(self):
1644 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001645 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1646 srv.bind((HOST, 0))
1647 srv.listen(backlog)
1648
1649 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001650 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001651 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001652
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001653 @support.cpython_only
1654 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001655 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001656 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001657 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1658 srv.bind((HOST, 0))
1659 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001660
Charles-François Natali42663332012-01-02 15:57:30 +01001661 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001662 def test_flowinfo(self):
1663 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001664 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001665 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001666 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001667
Коренберг Марк7766b962018-02-13 00:47:42 +05001668 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1669 def test_getaddrinfo_ipv6_basic(self):
1670 ((*_, sockaddr),) = socket.getaddrinfo(
1671 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1672 1234, socket.AF_INET6,
1673 socket.SOCK_DGRAM,
1674 socket.IPPROTO_UDP
1675 )
1676 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1677
1678 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001679 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001680 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001681 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1682 # Just pick up any network interface (Linux, Mac OS X)
1683 (ifindex, test_interface) = socket.if_nameindex()[0]
1684 ((*_, sockaddr),) = socket.getaddrinfo(
1685 'ff02::1de:c0:face:8D%' + test_interface,
1686 1234, socket.AF_INET6,
1687 socket.SOCK_DGRAM,
1688 socket.IPPROTO_UDP
1689 )
1690 # Note missing interface name part in IPv6 address
1691 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1692
1693 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1694 @unittest.skipUnless(
1695 sys.platform == 'win32',
1696 'Numeric scope id does not work or undocumented')
1697 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1698 # Also works on Linux and Mac OS X, but is not documented (?)
1699 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1700 ifindex = 42
1701 ((*_, sockaddr),) = socket.getaddrinfo(
1702 'ff02::1de:c0:face:8D%' + str(ifindex),
1703 1234, socket.AF_INET6,
1704 socket.SOCK_DGRAM,
1705 socket.IPPROTO_UDP
1706 )
1707 # Note missing interface name part in IPv6 address
1708 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1709
1710 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001711 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001712 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001713 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1714 # Just pick up any network interface.
1715 (ifindex, test_interface) = socket.if_nameindex()[0]
1716 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1717 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1718 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1719
1720 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001721 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001722 'Numeric scope id does not work or undocumented')
1723 def test_getnameinfo_ipv6_scopeid_numeric(self):
1724 # Also works on Linux (undocumented), but does not work on Mac OS X
1725 # Windows and Linux allow nonexistent interface numbers here.
1726 ifindex = 42
1727 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1728 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1729 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1730
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001731 def test_str_for_enums(self):
1732 # Make sure that the AF_* and SOCK_* constants have enum-like string
1733 # reprs.
1734 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1735 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001736 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001737
Yury Selivanov98181422017-12-18 20:02:54 -05001738 def test_socket_consistent_sock_type(self):
1739 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1740 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1741 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1742
1743 with socket.socket(socket.AF_INET, sock_type) as s:
1744 self.assertEqual(s.type, socket.SOCK_STREAM)
1745 s.settimeout(1)
1746 self.assertEqual(s.type, socket.SOCK_STREAM)
1747 s.settimeout(0)
1748 self.assertEqual(s.type, socket.SOCK_STREAM)
1749 s.setblocking(True)
1750 self.assertEqual(s.type, socket.SOCK_STREAM)
1751 s.setblocking(False)
1752 self.assertEqual(s.type, socket.SOCK_STREAM)
1753
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001754 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001755 # Test that when created with a family that's not one of the known
1756 # AF_*/SOCK_* constants, socket.family just returns the number.
1757 #
1758 # To do this we fool socket.socket into believing it already has an
1759 # open fd because on this path it doesn't actually verify the family and
1760 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001761 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1762 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001763 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1764
1765 unknown_type = max(
1766 kind
1767 for name, kind in socket.SocketKind.__members__.items()
1768 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1769 ) + 1
1770
1771 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001772 family=unknown_family, type=unknown_type, proto=23,
1773 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001774 self.assertEqual(s.family, unknown_family)
1775 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001776 # some OS like macOS ignore proto
1777 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001778
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001779 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1780 def test__sendfile_use_sendfile(self):
1781 class File:
1782 def __init__(self, fd):
1783 self.fd = fd
1784
1785 def fileno(self):
1786 return self.fd
1787 with socket.socket() as sock:
1788 fd = os.open(os.curdir, os.O_RDONLY)
1789 os.close(fd)
1790 with self.assertRaises(socket._GiveupOnSendfile):
1791 sock._sendfile_use_sendfile(File(fd))
1792 with self.assertRaises(OverflowError):
1793 sock._sendfile_use_sendfile(File(2**1000))
1794 with self.assertRaises(TypeError):
1795 sock._sendfile_use_sendfile(File(None))
1796
Christian Heimesb6e43af2018-01-29 22:37:58 +01001797 def _test_socket_fileno(self, s, family, stype):
1798 self.assertEqual(s.family, family)
1799 self.assertEqual(s.type, stype)
1800
1801 fd = s.fileno()
1802 s2 = socket.socket(fileno=fd)
1803 self.addCleanup(s2.close)
1804 # detach old fd to avoid double close
1805 s.detach()
1806 self.assertEqual(s2.family, family)
1807 self.assertEqual(s2.type, stype)
1808 self.assertEqual(s2.fileno(), fd)
1809
1810 def test_socket_fileno(self):
1811 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1812 self.addCleanup(s.close)
1813 s.bind((support.HOST, 0))
1814 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1815
1816 if hasattr(socket, "SOCK_DGRAM"):
1817 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1818 self.addCleanup(s.close)
1819 s.bind((support.HOST, 0))
1820 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1821
1822 if support.IPV6_ENABLED:
1823 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1824 self.addCleanup(s.close)
1825 s.bind((support.HOSTv6, 0, 0, 0))
1826 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1827
1828 if hasattr(socket, "AF_UNIX"):
1829 tmpdir = tempfile.mkdtemp()
1830 self.addCleanup(shutil.rmtree, tmpdir)
1831 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1832 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001833 try:
1834 s.bind(os.path.join(tmpdir, 'socket'))
1835 except PermissionError:
1836 pass
1837 else:
1838 self._test_socket_fileno(s, socket.AF_UNIX,
1839 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001840
Dima Tisneke9912702018-12-17 22:07:55 +09001841 def test_socket_fileno_rejects_float(self):
1842 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1843 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1844
1845 def test_socket_fileno_rejects_other_types(self):
1846 with self.assertRaisesRegex(TypeError, "integer is required"):
1847 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1848
1849 def test_socket_fileno_rejects_invalid_socket(self):
1850 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1851 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1852
1853 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1854 def test_socket_fileno_rejects_negative(self):
1855 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1856 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1857
1858 def test_socket_fileno_requires_valid_fd(self):
1859 WSAENOTSOCK = 10038
1860 with self.assertRaises(OSError) as cm:
1861 socket.socket(fileno=support.make_bad_fd())
1862 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1863
1864 with self.assertRaises(OSError) as cm:
1865 socket.socket(
1866 socket.AF_INET,
1867 socket.SOCK_STREAM,
1868 fileno=support.make_bad_fd())
1869 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1870
1871 def test_socket_fileno_requires_socket_fd(self):
1872 with tempfile.NamedTemporaryFile() as afile:
1873 with self.assertRaises(OSError):
1874 socket.socket(fileno=afile.fileno())
1875
1876 with self.assertRaises(OSError) as cm:
1877 socket.socket(
1878 socket.AF_INET,
1879 socket.SOCK_STREAM,
1880 fileno=afile.fileno())
1881 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1882
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001883
Charles-François Natali47413c12011-10-06 19:47:44 +02001884@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1885class BasicCANTest(unittest.TestCase):
1886
1887 def testCrucialConstants(self):
1888 socket.AF_CAN
1889 socket.PF_CAN
1890 socket.CAN_RAW
1891
Charles-François Natali773e42d2013-02-05 19:42:01 +01001892 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1893 'socket.CAN_BCM required for this test.')
1894 def testBCMConstants(self):
1895 socket.CAN_BCM
1896
1897 # opcodes
1898 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1899 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1900 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1901 socket.CAN_BCM_TX_SEND # send one CAN frame
1902 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1903 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1904 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1905 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1906 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1907 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1908 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1909 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1910
karl ding31c4fd22019-07-31 01:47:16 -07001911 # flags
1912 socket.CAN_BCM_SETTIMER
1913 socket.CAN_BCM_STARTTIMER
1914 socket.CAN_BCM_TX_COUNTEVT
1915 socket.CAN_BCM_TX_ANNOUNCE
1916 socket.CAN_BCM_TX_CP_CAN_ID
1917 socket.CAN_BCM_RX_FILTER_ID
1918 socket.CAN_BCM_RX_CHECK_DLC
1919 socket.CAN_BCM_RX_NO_AUTOTIMER
1920 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1921 socket.CAN_BCM_TX_RESET_MULTI_IDX
1922 socket.CAN_BCM_RX_RTR_FRAME
1923
Charles-François Natali47413c12011-10-06 19:47:44 +02001924 def testCreateSocket(self):
1925 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1926 pass
1927
Charles-François Natali773e42d2013-02-05 19:42:01 +01001928 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1929 'socket.CAN_BCM required for this test.')
1930 def testCreateBCMSocket(self):
1931 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1932 pass
1933
Charles-François Natali47413c12011-10-06 19:47:44 +02001934 def testBindAny(self):
1935 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1936 s.bind(('', ))
1937
1938 def testTooLongInterfaceName(self):
1939 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1940 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001941 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001942 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001943
1944 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1945 'socket.CAN_RAW_LOOPBACK required for this test.')
1946 def testLoopback(self):
1947 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1948 for loopback in (0, 1):
1949 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1950 loopback)
1951 self.assertEqual(loopback,
1952 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1953
1954 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1955 'socket.CAN_RAW_FILTER required for this test.')
1956 def testFilter(self):
1957 can_id, can_mask = 0x200, 0x700
1958 can_filter = struct.pack("=II", can_id, can_mask)
1959 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1960 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1961 self.assertEqual(can_filter,
1962 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001963 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001964
1965
1966@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001967class CANTest(ThreadedCANSocketTest):
1968
Charles-François Natali47413c12011-10-06 19:47:44 +02001969 def __init__(self, methodName='runTest'):
1970 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1971
1972 @classmethod
1973 def build_can_frame(cls, can_id, data):
1974 """Build a CAN frame."""
1975 can_dlc = len(data)
1976 data = data.ljust(8, b'\x00')
1977 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1978
1979 @classmethod
1980 def dissect_can_frame(cls, frame):
1981 """Dissect a CAN frame."""
1982 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1983 return (can_id, can_dlc, data[:can_dlc])
1984
1985 def testSendFrame(self):
1986 cf, addr = self.s.recvfrom(self.bufsize)
1987 self.assertEqual(self.cf, cf)
1988 self.assertEqual(addr[0], self.interface)
1989 self.assertEqual(addr[1], socket.AF_CAN)
1990
1991 def _testSendFrame(self):
1992 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1993 self.cli.send(self.cf)
1994
1995 def testSendMaxFrame(self):
1996 cf, addr = self.s.recvfrom(self.bufsize)
1997 self.assertEqual(self.cf, cf)
1998
1999 def _testSendMaxFrame(self):
2000 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
2001 self.cli.send(self.cf)
2002
2003 def testSendMultiFrames(self):
2004 cf, addr = self.s.recvfrom(self.bufsize)
2005 self.assertEqual(self.cf1, cf)
2006
2007 cf, addr = self.s.recvfrom(self.bufsize)
2008 self.assertEqual(self.cf2, cf)
2009
2010 def _testSendMultiFrames(self):
2011 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
2012 self.cli.send(self.cf1)
2013
2014 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2015 self.cli.send(self.cf2)
2016
Charles-François Natali773e42d2013-02-05 19:42:01 +01002017 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2018 'socket.CAN_BCM required for this test.')
2019 def _testBCM(self):
2020 cf, addr = self.cli.recvfrom(self.bufsize)
2021 self.assertEqual(self.cf, cf)
2022 can_id, can_dlc, data = self.dissect_can_frame(cf)
2023 self.assertEqual(self.can_id, can_id)
2024 self.assertEqual(self.data, data)
2025
2026 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2027 'socket.CAN_BCM required for this test.')
2028 def testBCM(self):
2029 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2030 self.addCleanup(bcm.close)
2031 bcm.connect((self.interface,))
2032 self.can_id = 0x123
2033 self.data = bytes([0xc0, 0xff, 0xee])
2034 self.cf = self.build_can_frame(self.can_id, self.data)
2035 opcode = socket.CAN_BCM_TX_SEND
2036 flags = 0
2037 count = 0
2038 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2039 bcm_can_id = 0x0222
2040 nframes = 1
2041 assert len(self.cf) == 16
2042 header = struct.pack(self.bcm_cmd_msg_fmt,
2043 opcode,
2044 flags,
2045 count,
2046 ival1_seconds,
2047 ival1_usec,
2048 ival2_seconds,
2049 ival2_usec,
2050 bcm_can_id,
2051 nframes,
2052 )
2053 header_plus_frame = header + self.cf
2054 bytes_sent = bcm.send(header_plus_frame)
2055 self.assertEqual(bytes_sent, len(header_plus_frame))
2056
Charles-François Natali47413c12011-10-06 19:47:44 +02002057
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002058@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2059class ISOTPTest(unittest.TestCase):
2060
2061 def __init__(self, *args, **kwargs):
2062 super().__init__(*args, **kwargs)
2063 self.interface = "vcan0"
2064
2065 def testCrucialConstants(self):
2066 socket.AF_CAN
2067 socket.PF_CAN
2068 socket.CAN_ISOTP
2069 socket.SOCK_DGRAM
2070
2071 def testCreateSocket(self):
2072 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2073 pass
2074
2075 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2076 'socket.CAN_ISOTP required for this test.')
2077 def testCreateISOTPSocket(self):
2078 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2079 pass
2080
2081 def testTooLongInterfaceName(self):
2082 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2083 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2084 with self.assertRaisesRegex(OSError, 'interface name too long'):
2085 s.bind(('x' * 1024, 1, 2))
2086
2087 def testBind(self):
2088 try:
2089 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2090 addr = self.interface, 0x123, 0x456
2091 s.bind(addr)
2092 self.assertEqual(s.getsockname(), addr)
2093 except OSError as e:
2094 if e.errno == errno.ENODEV:
2095 self.skipTest('network interface `%s` does not exist' %
2096 self.interface)
2097 else:
2098 raise
2099
2100
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002101@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2102class BasicRDSTest(unittest.TestCase):
2103
2104 def testCrucialConstants(self):
2105 socket.AF_RDS
2106 socket.PF_RDS
2107
2108 def testCreateSocket(self):
2109 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2110 pass
2111
2112 def testSocketBufferSize(self):
2113 bufsize = 16384
2114 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2115 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2116 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2117
2118
2119@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002120class RDSTest(ThreadedRDSSocketTest):
2121
2122 def __init__(self, methodName='runTest'):
2123 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2124
Charles-François Natali240c55f2011-11-10 20:33:36 +01002125 def setUp(self):
2126 super().setUp()
2127 self.evt = threading.Event()
2128
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002129 def testSendAndRecv(self):
2130 data, addr = self.serv.recvfrom(self.bufsize)
2131 self.assertEqual(self.data, data)
2132 self.assertEqual(self.cli_addr, addr)
2133
2134 def _testSendAndRecv(self):
2135 self.data = b'spam'
2136 self.cli.sendto(self.data, 0, (HOST, self.port))
2137
2138 def testPeek(self):
2139 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2140 self.assertEqual(self.data, data)
2141 data, addr = self.serv.recvfrom(self.bufsize)
2142 self.assertEqual(self.data, data)
2143
2144 def _testPeek(self):
2145 self.data = b'spam'
2146 self.cli.sendto(self.data, 0, (HOST, self.port))
2147
2148 @requireAttrs(socket.socket, 'recvmsg')
2149 def testSendAndRecvMsg(self):
2150 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2151 self.assertEqual(self.data, data)
2152
2153 @requireAttrs(socket.socket, 'sendmsg')
2154 def _testSendAndRecvMsg(self):
2155 self.data = b'hello ' * 10
2156 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2157
2158 def testSendAndRecvMulti(self):
2159 data, addr = self.serv.recvfrom(self.bufsize)
2160 self.assertEqual(self.data1, data)
2161
2162 data, addr = self.serv.recvfrom(self.bufsize)
2163 self.assertEqual(self.data2, data)
2164
2165 def _testSendAndRecvMulti(self):
2166 self.data1 = b'bacon'
2167 self.cli.sendto(self.data1, 0, (HOST, self.port))
2168
2169 self.data2 = b'egg'
2170 self.cli.sendto(self.data2, 0, (HOST, self.port))
2171
2172 def testSelect(self):
2173 r, w, x = select.select([self.serv], [], [], 3.0)
2174 self.assertIn(self.serv, r)
2175 data, addr = self.serv.recvfrom(self.bufsize)
2176 self.assertEqual(self.data, data)
2177
2178 def _testSelect(self):
2179 self.data = b'select'
2180 self.cli.sendto(self.data, 0, (HOST, self.port))
2181
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002182@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2183 'QIPCRTR sockets required for this test.')
2184class BasicQIPCRTRTest(unittest.TestCase):
2185
2186 def testCrucialConstants(self):
2187 socket.AF_QIPCRTR
2188
2189 def testCreateSocket(self):
2190 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2191 pass
2192
2193 def testUnbound(self):
2194 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2195 self.assertEqual(s.getsockname()[1], 0)
2196
2197 def testBindSock(self):
2198 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2199 support.bind_port(s, host=s.getsockname()[0])
2200 self.assertNotEqual(s.getsockname()[1], 0)
2201
2202 def testInvalidBindSock(self):
2203 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2204 self.assertRaises(OSError, support.bind_port, s, host=-2)
2205
2206 def testAutoBindSock(self):
2207 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2208 s.connect((123, 123))
2209 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002210
caaveryeffc12f2017-09-06 18:18:10 -04002211@unittest.skipIf(fcntl is None, "need fcntl")
2212@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2213 'VSOCK sockets required for this test.')
2214class BasicVSOCKTest(unittest.TestCase):
2215
2216 def testCrucialConstants(self):
2217 socket.AF_VSOCK
2218
2219 def testVSOCKConstants(self):
2220 socket.SO_VM_SOCKETS_BUFFER_SIZE
2221 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2222 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2223 socket.VMADDR_CID_ANY
2224 socket.VMADDR_PORT_ANY
2225 socket.VMADDR_CID_HOST
2226 socket.VM_SOCKETS_INVALID_VERSION
2227 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2228
2229 def testCreateSocket(self):
2230 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2231 pass
2232
2233 def testSocketBufferSize(self):
2234 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2235 orig_max = s.getsockopt(socket.AF_VSOCK,
2236 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2237 orig = s.getsockopt(socket.AF_VSOCK,
2238 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2239 orig_min = s.getsockopt(socket.AF_VSOCK,
2240 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2241
2242 s.setsockopt(socket.AF_VSOCK,
2243 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2244 s.setsockopt(socket.AF_VSOCK,
2245 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2246 s.setsockopt(socket.AF_VSOCK,
2247 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2248
2249 self.assertEqual(orig_max * 2,
2250 s.getsockopt(socket.AF_VSOCK,
2251 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2252 self.assertEqual(orig * 2,
2253 s.getsockopt(socket.AF_VSOCK,
2254 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2255 self.assertEqual(orig_min * 2,
2256 s.getsockopt(socket.AF_VSOCK,
2257 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2258
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002259
Guido van Rossum24e4af82002-06-12 19:18:08 +00002260class BasicTCPTest(SocketConnectedTest):
2261
2262 def __init__(self, methodName='runTest'):
2263 SocketConnectedTest.__init__(self, methodName=methodName)
2264
2265 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002266 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002267 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002268 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002269
2270 def _testRecv(self):
2271 self.serv_conn.send(MSG)
2272
2273 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002274 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002275 seg1 = self.cli_conn.recv(len(MSG) - 3)
2276 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002277 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002278 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002279
2280 def _testOverFlowRecv(self):
2281 self.serv_conn.send(MSG)
2282
2283 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002284 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002285 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002286 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002287
2288 def _testRecvFrom(self):
2289 self.serv_conn.send(MSG)
2290
2291 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002292 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002293 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2294 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002295 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002296 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002297
2298 def _testOverFlowRecvFrom(self):
2299 self.serv_conn.send(MSG)
2300
2301 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002302 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002303 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002304 while 1:
2305 read = self.cli_conn.recv(1024)
2306 if not read:
2307 break
Guido van Rossume531e292002-08-08 20:28:34 +00002308 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002309 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002310
2311 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002312 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002313 self.serv_conn.sendall(big_chunk)
2314
2315 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002316 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002317 fd = self.cli_conn.fileno()
2318 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002319 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002320 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002321 msg = sock.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 _testFromFd(self):
2325 self.serv_conn.send(MSG)
2326
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002327 def testDup(self):
2328 # Testing dup()
2329 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002330 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002331 msg = sock.recv(1024)
2332 self.assertEqual(msg, MSG)
2333
2334 def _testDup(self):
2335 self.serv_conn.send(MSG)
2336
Guido van Rossum24e4af82002-06-12 19:18:08 +00002337 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002338 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002339 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002340 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002341 # wait for _testShutdown to finish: on OS X, when the server
2342 # closes the connection the client also becomes disconnected,
2343 # and the client's shutdown call will fail. (Issue #4397.)
2344 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002345
2346 def _testShutdown(self):
2347 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002348 self.serv_conn.shutdown(2)
2349
2350 testShutdown_overflow = support.cpython_only(testShutdown)
2351
2352 @support.cpython_only
2353 def _testShutdown_overflow(self):
2354 import _testcapi
2355 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002356 # Issue 15989
2357 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2358 _testcapi.INT_MAX + 1)
2359 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2360 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002361 self.serv_conn.shutdown(2)
2362
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002363 def testDetach(self):
2364 # Testing detach()
2365 fileno = self.cli_conn.fileno()
2366 f = self.cli_conn.detach()
2367 self.assertEqual(f, fileno)
2368 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002369 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002370 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002371 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002372 # ...but we can create another socket using the (still open)
2373 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002374 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002375 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002376 msg = sock.recv(1024)
2377 self.assertEqual(msg, MSG)
2378
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002379 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002380 self.serv_conn.send(MSG)
2381
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002382
Guido van Rossum24e4af82002-06-12 19:18:08 +00002383class BasicUDPTest(ThreadedUDPSocketTest):
2384
2385 def __init__(self, methodName='runTest'):
2386 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2387
2388 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002389 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002390 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002391 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002392
2393 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002394 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002395
Guido van Rossum1c938012002-06-12 21:17:20 +00002396 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002397 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002398 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002399 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002400
Guido van Rossum1c938012002-06-12 21:17:20 +00002401 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002402 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002403
Guido van Rossumd8faa362007-04-27 19:54:29 +00002404 def testRecvFromNegative(self):
2405 # Negative lengths passed to recvfrom should give ValueError.
2406 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2407
2408 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002409 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002410
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002411
2412@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2413 'UDPLITE sockets required for this test.')
2414class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2415
2416 def __init__(self, methodName='runTest'):
2417 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2418
2419 def testSendtoAndRecv(self):
2420 # Testing sendto() and Recv() over UDPLITE
2421 msg = self.serv.recv(len(MSG))
2422 self.assertEqual(msg, MSG)
2423
2424 def _testSendtoAndRecv(self):
2425 self.cli.sendto(MSG, 0, (HOST, self.port))
2426
2427 def testRecvFrom(self):
2428 # Testing recvfrom() over UDPLITE
2429 msg, addr = self.serv.recvfrom(len(MSG))
2430 self.assertEqual(msg, MSG)
2431
2432 def _testRecvFrom(self):
2433 self.cli.sendto(MSG, 0, (HOST, self.port))
2434
2435 def testRecvFromNegative(self):
2436 # Negative lengths passed to recvfrom should give ValueError.
2437 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2438
2439 def _testRecvFromNegative(self):
2440 self.cli.sendto(MSG, 0, (HOST, self.port))
2441
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002442# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2443# same test code is used with different families and types of socket
2444# (e.g. stream, datagram), and tests using recvmsg() are repeated
2445# using recvmsg_into().
2446#
2447# The generic test classes such as SendmsgTests and
2448# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2449# supplied with sockets cli_sock and serv_sock representing the
2450# client's and the server's end of the connection respectively, and
2451# attributes cli_addr and serv_addr holding their (numeric where
2452# appropriate) addresses.
2453#
2454# The final concrete test classes combine these with subclasses of
2455# SocketTestBase which set up client and server sockets of a specific
2456# type, and with subclasses of SendrecvmsgBase such as
2457# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2458# sockets to cli_sock and serv_sock and override the methods and
2459# attributes of SendrecvmsgBase to fill in destination addresses if
2460# needed when sending, check for specific flags in msg_flags, etc.
2461#
2462# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2463# recvmsg_into().
2464
2465# XXX: like the other datagram (UDP) tests in this module, the code
2466# here assumes that datagram delivery on the local machine will be
2467# reliable.
2468
2469class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2470 # Base class for sendmsg()/recvmsg() tests.
2471
2472 # Time in seconds to wait before considering a test failed, or
2473 # None for no timeout. Not all tests actually set a timeout.
2474 fail_timeout = 3.0
2475
2476 def setUp(self):
2477 self.misc_event = threading.Event()
2478 super().setUp()
2479
2480 def sendToServer(self, msg):
2481 # Send msg to the server.
2482 return self.cli_sock.send(msg)
2483
2484 # Tuple of alternative default arguments for sendmsg() when called
2485 # via sendmsgToServer() (e.g. to include a destination address).
2486 sendmsg_to_server_defaults = ()
2487
2488 def sendmsgToServer(self, *args):
2489 # Call sendmsg() on self.cli_sock with the given arguments,
2490 # filling in any arguments which are not supplied with the
2491 # corresponding items of self.sendmsg_to_server_defaults, if
2492 # any.
2493 return self.cli_sock.sendmsg(
2494 *(args + self.sendmsg_to_server_defaults[len(args):]))
2495
2496 def doRecvmsg(self, sock, bufsize, *args):
2497 # Call recvmsg() on sock with given arguments and return its
2498 # result. Should be used for tests which can use either
2499 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2500 # this method with one which emulates it using recvmsg_into(),
2501 # thus allowing the same test to be used for both methods.
2502 result = sock.recvmsg(bufsize, *args)
2503 self.registerRecvmsgResult(result)
2504 return result
2505
2506 def registerRecvmsgResult(self, result):
2507 # Called by doRecvmsg() with the return value of recvmsg() or
2508 # recvmsg_into(). Can be overridden to arrange cleanup based
2509 # on the returned ancillary data, for instance.
2510 pass
2511
2512 def checkRecvmsgAddress(self, addr1, addr2):
2513 # Called to compare the received address with the address of
2514 # the peer.
2515 self.assertEqual(addr1, addr2)
2516
2517 # Flags that are normally unset in msg_flags
2518 msg_flags_common_unset = 0
2519 for name in ("MSG_CTRUNC", "MSG_OOB"):
2520 msg_flags_common_unset |= getattr(socket, name, 0)
2521
2522 # Flags that are normally set
2523 msg_flags_common_set = 0
2524
2525 # Flags set when a complete record has been received (e.g. MSG_EOR
2526 # for SCTP)
2527 msg_flags_eor_indicator = 0
2528
2529 # Flags set when a complete record has not been received
2530 # (e.g. MSG_TRUNC for datagram sockets)
2531 msg_flags_non_eor_indicator = 0
2532
2533 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2534 # Method to check the value of msg_flags returned by recvmsg[_into]().
2535 #
2536 # Checks that all bits in msg_flags_common_set attribute are
2537 # set in "flags" and all bits in msg_flags_common_unset are
2538 # unset.
2539 #
2540 # The "eor" argument specifies whether the flags should
2541 # indicate that a full record (or datagram) has been received.
2542 # If "eor" is None, no checks are done; otherwise, checks
2543 # that:
2544 #
2545 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2546 # set and all bits in msg_flags_non_eor_indicator are unset
2547 #
2548 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2549 # are set and all bits in msg_flags_eor_indicator are unset
2550 #
2551 # If "checkset" and/or "checkunset" are supplied, they require
2552 # the given bits to be set or unset respectively, overriding
2553 # what the attributes require for those bits.
2554 #
2555 # If any bits are set in "ignore", they will not be checked,
2556 # regardless of the other inputs.
2557 #
2558 # Will raise Exception if the inputs require a bit to be both
2559 # set and unset, and it is not ignored.
2560
2561 defaultset = self.msg_flags_common_set
2562 defaultunset = self.msg_flags_common_unset
2563
2564 if eor:
2565 defaultset |= self.msg_flags_eor_indicator
2566 defaultunset |= self.msg_flags_non_eor_indicator
2567 elif eor is not None:
2568 defaultset |= self.msg_flags_non_eor_indicator
2569 defaultunset |= self.msg_flags_eor_indicator
2570
2571 # Function arguments override defaults
2572 defaultset &= ~checkunset
2573 defaultunset &= ~checkset
2574
2575 # Merge arguments with remaining defaults, and check for conflicts
2576 checkset |= defaultset
2577 checkunset |= defaultunset
2578 inboth = checkset & checkunset & ~ignore
2579 if inboth:
2580 raise Exception("contradictory set, unset requirements for flags "
2581 "{0:#x}".format(inboth))
2582
2583 # Compare with given msg_flags value
2584 mask = (checkset | checkunset) & ~ignore
2585 self.assertEqual(flags & mask, checkset & mask)
2586
2587
2588class RecvmsgIntoMixin(SendrecvmsgBase):
2589 # Mixin to implement doRecvmsg() using recvmsg_into().
2590
2591 def doRecvmsg(self, sock, bufsize, *args):
2592 buf = bytearray(bufsize)
2593 result = sock.recvmsg_into([buf], *args)
2594 self.registerRecvmsgResult(result)
2595 self.assertGreaterEqual(result[0], 0)
2596 self.assertLessEqual(result[0], bufsize)
2597 return (bytes(buf[:result[0]]),) + result[1:]
2598
2599
2600class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2601 # Defines flags to be checked in msg_flags for datagram sockets.
2602
2603 @property
2604 def msg_flags_non_eor_indicator(self):
2605 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2606
2607
2608class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2609 # Defines flags to be checked in msg_flags for SCTP sockets.
2610
2611 @property
2612 def msg_flags_eor_indicator(self):
2613 return super().msg_flags_eor_indicator | socket.MSG_EOR
2614
2615
2616class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2617 # Base class for tests on connectionless-mode sockets. Users must
2618 # supply sockets on attributes cli and serv to be mapped to
2619 # cli_sock and serv_sock respectively.
2620
2621 @property
2622 def serv_sock(self):
2623 return self.serv
2624
2625 @property
2626 def cli_sock(self):
2627 return self.cli
2628
2629 @property
2630 def sendmsg_to_server_defaults(self):
2631 return ([], [], 0, self.serv_addr)
2632
2633 def sendToServer(self, msg):
2634 return self.cli_sock.sendto(msg, self.serv_addr)
2635
2636
2637class SendrecvmsgConnectedBase(SendrecvmsgBase):
2638 # Base class for tests on connected sockets. Users must supply
2639 # sockets on attributes serv_conn and cli_conn (representing the
2640 # connections *to* the server and the client), to be mapped to
2641 # cli_sock and serv_sock respectively.
2642
2643 @property
2644 def serv_sock(self):
2645 return self.cli_conn
2646
2647 @property
2648 def cli_sock(self):
2649 return self.serv_conn
2650
2651 def checkRecvmsgAddress(self, addr1, addr2):
2652 # Address is currently "unspecified" for a connected socket,
2653 # so we don't examine it
2654 pass
2655
2656
2657class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2658 # Base class to set a timeout on server's socket.
2659
2660 def setUp(self):
2661 super().setUp()
2662 self.serv_sock.settimeout(self.fail_timeout)
2663
2664
2665class SendmsgTests(SendrecvmsgServerTimeoutBase):
2666 # Tests for sendmsg() which can use any socket type and do not
2667 # involve recvmsg() or recvmsg_into().
2668
2669 def testSendmsg(self):
2670 # Send a simple message with sendmsg().
2671 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2672
2673 def _testSendmsg(self):
2674 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2675
2676 def testSendmsgDataGenerator(self):
2677 # Send from buffer obtained from a generator (not a sequence).
2678 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2679
2680 def _testSendmsgDataGenerator(self):
2681 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2682 len(MSG))
2683
2684 def testSendmsgAncillaryGenerator(self):
2685 # Gather (empty) ancillary data from a generator.
2686 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2687
2688 def _testSendmsgAncillaryGenerator(self):
2689 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2690 len(MSG))
2691
2692 def testSendmsgArray(self):
2693 # Send data from an array instead of the usual bytes object.
2694 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2695
2696 def _testSendmsgArray(self):
2697 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2698 len(MSG))
2699
2700 def testSendmsgGather(self):
2701 # Send message data from more than one buffer (gather write).
2702 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2703
2704 def _testSendmsgGather(self):
2705 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2706
2707 def testSendmsgBadArgs(self):
2708 # Check that sendmsg() rejects invalid arguments.
2709 self.assertEqual(self.serv_sock.recv(1000), b"done")
2710
2711 def _testSendmsgBadArgs(self):
2712 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2713 self.assertRaises(TypeError, self.sendmsgToServer,
2714 b"not in an iterable")
2715 self.assertRaises(TypeError, self.sendmsgToServer,
2716 object())
2717 self.assertRaises(TypeError, self.sendmsgToServer,
2718 [object()])
2719 self.assertRaises(TypeError, self.sendmsgToServer,
2720 [MSG, object()])
2721 self.assertRaises(TypeError, self.sendmsgToServer,
2722 [MSG], object())
2723 self.assertRaises(TypeError, self.sendmsgToServer,
2724 [MSG], [], object())
2725 self.assertRaises(TypeError, self.sendmsgToServer,
2726 [MSG], [], 0, object())
2727 self.sendToServer(b"done")
2728
2729 def testSendmsgBadCmsg(self):
2730 # Check that invalid ancillary data items are rejected.
2731 self.assertEqual(self.serv_sock.recv(1000), b"done")
2732
2733 def _testSendmsgBadCmsg(self):
2734 self.assertRaises(TypeError, self.sendmsgToServer,
2735 [MSG], [object()])
2736 self.assertRaises(TypeError, self.sendmsgToServer,
2737 [MSG], [(object(), 0, b"data")])
2738 self.assertRaises(TypeError, self.sendmsgToServer,
2739 [MSG], [(0, object(), b"data")])
2740 self.assertRaises(TypeError, self.sendmsgToServer,
2741 [MSG], [(0, 0, object())])
2742 self.assertRaises(TypeError, self.sendmsgToServer,
2743 [MSG], [(0, 0)])
2744 self.assertRaises(TypeError, self.sendmsgToServer,
2745 [MSG], [(0, 0, b"data", 42)])
2746 self.sendToServer(b"done")
2747
2748 @requireAttrs(socket, "CMSG_SPACE")
2749 def testSendmsgBadMultiCmsg(self):
2750 # Check that invalid ancillary data items are rejected when
2751 # more than one item is present.
2752 self.assertEqual(self.serv_sock.recv(1000), b"done")
2753
2754 @testSendmsgBadMultiCmsg.client_skip
2755 def _testSendmsgBadMultiCmsg(self):
2756 self.assertRaises(TypeError, self.sendmsgToServer,
2757 [MSG], [0, 0, b""])
2758 self.assertRaises(TypeError, self.sendmsgToServer,
2759 [MSG], [(0, 0, b""), object()])
2760 self.sendToServer(b"done")
2761
2762 def testSendmsgExcessCmsgReject(self):
2763 # Check that sendmsg() rejects excess ancillary data items
2764 # when the number that can be sent is limited.
2765 self.assertEqual(self.serv_sock.recv(1000), b"done")
2766
2767 def _testSendmsgExcessCmsgReject(self):
2768 if not hasattr(socket, "CMSG_SPACE"):
2769 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002770 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002771 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2772 self.assertIsNone(cm.exception.errno)
2773 self.sendToServer(b"done")
2774
2775 def testSendmsgAfterClose(self):
2776 # Check that sendmsg() fails on a closed socket.
2777 pass
2778
2779 def _testSendmsgAfterClose(self):
2780 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002781 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002782
2783
2784class SendmsgStreamTests(SendmsgTests):
2785 # Tests for sendmsg() which require a stream socket and do not
2786 # involve recvmsg() or recvmsg_into().
2787
2788 def testSendmsgExplicitNoneAddr(self):
2789 # Check that peer address can be specified as None.
2790 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2791
2792 def _testSendmsgExplicitNoneAddr(self):
2793 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2794
2795 def testSendmsgTimeout(self):
2796 # Check that timeout works with sendmsg().
2797 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2798 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2799
2800 def _testSendmsgTimeout(self):
2801 try:
2802 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002803 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002804 while True:
2805 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002806 except socket.timeout:
2807 pass
2808 except OSError as exc:
2809 if exc.errno != errno.ENOMEM:
2810 raise
2811 # bpo-33937 the test randomly fails on Travis CI with
2812 # "OSError: [Errno 12] Cannot allocate memory"
2813 else:
2814 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002815 finally:
2816 self.misc_event.set()
2817
2818 # XXX: would be nice to have more tests for sendmsg flags argument.
2819
2820 # Linux supports MSG_DONTWAIT when sending, but in general, it
2821 # only works when receiving. Could add other platforms if they
2822 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002823 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002824 "MSG_DONTWAIT not known to work on this platform when "
2825 "sending")
2826 def testSendmsgDontWait(self):
2827 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2828 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2829 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2830
2831 @testSendmsgDontWait.client_skip
2832 def _testSendmsgDontWait(self):
2833 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002834 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002835 while True:
2836 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002837 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2838 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002839 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002840 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002841 finally:
2842 self.misc_event.set()
2843
2844
2845class SendmsgConnectionlessTests(SendmsgTests):
2846 # Tests for sendmsg() which require a connectionless-mode
2847 # (e.g. datagram) socket, and do not involve recvmsg() or
2848 # recvmsg_into().
2849
2850 def testSendmsgNoDestAddr(self):
2851 # Check that sendmsg() fails when no destination address is
2852 # given for unconnected socket.
2853 pass
2854
2855 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002856 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002857 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002858 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002859 [MSG], [], 0, None)
2860
2861
2862class RecvmsgGenericTests(SendrecvmsgBase):
2863 # Tests for recvmsg() which can also be emulated using
2864 # recvmsg_into(), and can use any socket type.
2865
2866 def testRecvmsg(self):
2867 # Receive a simple message with recvmsg[_into]().
2868 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2869 self.assertEqual(msg, MSG)
2870 self.checkRecvmsgAddress(addr, self.cli_addr)
2871 self.assertEqual(ancdata, [])
2872 self.checkFlags(flags, eor=True)
2873
2874 def _testRecvmsg(self):
2875 self.sendToServer(MSG)
2876
2877 def testRecvmsgExplicitDefaults(self):
2878 # Test recvmsg[_into]() with default arguments provided explicitly.
2879 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2880 len(MSG), 0, 0)
2881 self.assertEqual(msg, MSG)
2882 self.checkRecvmsgAddress(addr, self.cli_addr)
2883 self.assertEqual(ancdata, [])
2884 self.checkFlags(flags, eor=True)
2885
2886 def _testRecvmsgExplicitDefaults(self):
2887 self.sendToServer(MSG)
2888
2889 def testRecvmsgShorter(self):
2890 # Receive a message smaller than buffer.
2891 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2892 len(MSG) + 42)
2893 self.assertEqual(msg, MSG)
2894 self.checkRecvmsgAddress(addr, self.cli_addr)
2895 self.assertEqual(ancdata, [])
2896 self.checkFlags(flags, eor=True)
2897
2898 def _testRecvmsgShorter(self):
2899 self.sendToServer(MSG)
2900
2901 def testRecvmsgTrunc(self):
2902 # Receive part of message, check for truncation indicators.
2903 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2904 len(MSG) - 3)
2905 self.assertEqual(msg, MSG[:-3])
2906 self.checkRecvmsgAddress(addr, self.cli_addr)
2907 self.assertEqual(ancdata, [])
2908 self.checkFlags(flags, eor=False)
2909
2910 def _testRecvmsgTrunc(self):
2911 self.sendToServer(MSG)
2912
2913 def testRecvmsgShortAncillaryBuf(self):
2914 # Test ancillary data buffer too small to hold any ancillary data.
2915 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2916 len(MSG), 1)
2917 self.assertEqual(msg, MSG)
2918 self.checkRecvmsgAddress(addr, self.cli_addr)
2919 self.assertEqual(ancdata, [])
2920 self.checkFlags(flags, eor=True)
2921
2922 def _testRecvmsgShortAncillaryBuf(self):
2923 self.sendToServer(MSG)
2924
2925 def testRecvmsgLongAncillaryBuf(self):
2926 # Test large ancillary data buffer.
2927 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2928 len(MSG), 10240)
2929 self.assertEqual(msg, MSG)
2930 self.checkRecvmsgAddress(addr, self.cli_addr)
2931 self.assertEqual(ancdata, [])
2932 self.checkFlags(flags, eor=True)
2933
2934 def _testRecvmsgLongAncillaryBuf(self):
2935 self.sendToServer(MSG)
2936
2937 def testRecvmsgAfterClose(self):
2938 # Check that recvmsg[_into]() fails on a closed socket.
2939 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002940 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002941
2942 def _testRecvmsgAfterClose(self):
2943 pass
2944
2945 def testRecvmsgTimeout(self):
2946 # Check that timeout works.
2947 try:
2948 self.serv_sock.settimeout(0.03)
2949 self.assertRaises(socket.timeout,
2950 self.doRecvmsg, self.serv_sock, len(MSG))
2951 finally:
2952 self.misc_event.set()
2953
2954 def _testRecvmsgTimeout(self):
2955 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2956
2957 @requireAttrs(socket, "MSG_PEEK")
2958 def testRecvmsgPeek(self):
2959 # Check that MSG_PEEK in flags enables examination of pending
2960 # data without consuming it.
2961
2962 # Receive part of data with MSG_PEEK.
2963 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2964 len(MSG) - 3, 0,
2965 socket.MSG_PEEK)
2966 self.assertEqual(msg, MSG[:-3])
2967 self.checkRecvmsgAddress(addr, self.cli_addr)
2968 self.assertEqual(ancdata, [])
2969 # Ignoring MSG_TRUNC here (so this test is the same for stream
2970 # and datagram sockets). Some wording in POSIX seems to
2971 # suggest that it needn't be set when peeking, but that may
2972 # just be a slip.
2973 self.checkFlags(flags, eor=False,
2974 ignore=getattr(socket, "MSG_TRUNC", 0))
2975
2976 # Receive all data with MSG_PEEK.
2977 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2978 len(MSG), 0,
2979 socket.MSG_PEEK)
2980 self.assertEqual(msg, MSG)
2981 self.checkRecvmsgAddress(addr, self.cli_addr)
2982 self.assertEqual(ancdata, [])
2983 self.checkFlags(flags, eor=True)
2984
2985 # Check that the same data can still be received normally.
2986 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2987 self.assertEqual(msg, MSG)
2988 self.checkRecvmsgAddress(addr, self.cli_addr)
2989 self.assertEqual(ancdata, [])
2990 self.checkFlags(flags, eor=True)
2991
2992 @testRecvmsgPeek.client_skip
2993 def _testRecvmsgPeek(self):
2994 self.sendToServer(MSG)
2995
2996 @requireAttrs(socket.socket, "sendmsg")
2997 def testRecvmsgFromSendmsg(self):
2998 # Test receiving with recvmsg[_into]() when message is sent
2999 # using sendmsg().
3000 self.serv_sock.settimeout(self.fail_timeout)
3001 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
3002 self.assertEqual(msg, MSG)
3003 self.checkRecvmsgAddress(addr, self.cli_addr)
3004 self.assertEqual(ancdata, [])
3005 self.checkFlags(flags, eor=True)
3006
3007 @testRecvmsgFromSendmsg.client_skip
3008 def _testRecvmsgFromSendmsg(self):
3009 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
3010
3011
3012class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3013 # Tests which require a stream socket and can use either recvmsg()
3014 # or recvmsg_into().
3015
3016 def testRecvmsgEOF(self):
3017 # Receive end-of-stream indicator (b"", peer socket closed).
3018 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3019 self.assertEqual(msg, b"")
3020 self.checkRecvmsgAddress(addr, self.cli_addr)
3021 self.assertEqual(ancdata, [])
3022 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3023
3024 def _testRecvmsgEOF(self):
3025 self.cli_sock.close()
3026
3027 def testRecvmsgOverflow(self):
3028 # Receive a message in more than one chunk.
3029 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3030 len(MSG) - 3)
3031 self.checkRecvmsgAddress(addr, self.cli_addr)
3032 self.assertEqual(ancdata, [])
3033 self.checkFlags(flags, eor=False)
3034
3035 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3036 self.checkRecvmsgAddress(addr, self.cli_addr)
3037 self.assertEqual(ancdata, [])
3038 self.checkFlags(flags, eor=True)
3039
3040 msg = seg1 + seg2
3041 self.assertEqual(msg, MSG)
3042
3043 def _testRecvmsgOverflow(self):
3044 self.sendToServer(MSG)
3045
3046
3047class RecvmsgTests(RecvmsgGenericTests):
3048 # Tests for recvmsg() which can use any socket type.
3049
3050 def testRecvmsgBadArgs(self):
3051 # Check that recvmsg() rejects invalid arguments.
3052 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3053 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3054 -1, 0, 0)
3055 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3056 len(MSG), -1, 0)
3057 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3058 [bytearray(10)], 0, 0)
3059 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3060 object(), 0, 0)
3061 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3062 len(MSG), object(), 0)
3063 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3064 len(MSG), 0, object())
3065
3066 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3067 self.assertEqual(msg, MSG)
3068 self.checkRecvmsgAddress(addr, self.cli_addr)
3069 self.assertEqual(ancdata, [])
3070 self.checkFlags(flags, eor=True)
3071
3072 def _testRecvmsgBadArgs(self):
3073 self.sendToServer(MSG)
3074
3075
3076class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3077 # Tests for recvmsg_into() which can use any socket type.
3078
3079 def testRecvmsgIntoBadArgs(self):
3080 # Check that recvmsg_into() rejects invalid arguments.
3081 buf = bytearray(len(MSG))
3082 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3083 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3084 len(MSG), 0, 0)
3085 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3086 buf, 0, 0)
3087 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3088 [object()], 0, 0)
3089 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3090 [b"I'm not writable"], 0, 0)
3091 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3092 [buf, object()], 0, 0)
3093 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3094 [buf], -1, 0)
3095 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3096 [buf], object(), 0)
3097 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3098 [buf], 0, object())
3099
3100 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3101 self.assertEqual(nbytes, len(MSG))
3102 self.assertEqual(buf, bytearray(MSG))
3103 self.checkRecvmsgAddress(addr, self.cli_addr)
3104 self.assertEqual(ancdata, [])
3105 self.checkFlags(flags, eor=True)
3106
3107 def _testRecvmsgIntoBadArgs(self):
3108 self.sendToServer(MSG)
3109
3110 def testRecvmsgIntoGenerator(self):
3111 # Receive into buffer obtained from a generator (not a sequence).
3112 buf = bytearray(len(MSG))
3113 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3114 (o for o in [buf]))
3115 self.assertEqual(nbytes, len(MSG))
3116 self.assertEqual(buf, bytearray(MSG))
3117 self.checkRecvmsgAddress(addr, self.cli_addr)
3118 self.assertEqual(ancdata, [])
3119 self.checkFlags(flags, eor=True)
3120
3121 def _testRecvmsgIntoGenerator(self):
3122 self.sendToServer(MSG)
3123
3124 def testRecvmsgIntoArray(self):
3125 # Receive into an array rather than the usual bytearray.
3126 buf = array.array("B", [0] * len(MSG))
3127 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3128 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003129 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003130 self.checkRecvmsgAddress(addr, self.cli_addr)
3131 self.assertEqual(ancdata, [])
3132 self.checkFlags(flags, eor=True)
3133
3134 def _testRecvmsgIntoArray(self):
3135 self.sendToServer(MSG)
3136
3137 def testRecvmsgIntoScatter(self):
3138 # Receive into multiple buffers (scatter write).
3139 b1 = bytearray(b"----")
3140 b2 = bytearray(b"0123456789")
3141 b3 = bytearray(b"--------------")
3142 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3143 [b1, memoryview(b2)[2:9], b3])
3144 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3145 self.assertEqual(b1, bytearray(b"Mary"))
3146 self.assertEqual(b2, bytearray(b"01 had a 9"))
3147 self.assertEqual(b3, bytearray(b"little lamb---"))
3148 self.checkRecvmsgAddress(addr, self.cli_addr)
3149 self.assertEqual(ancdata, [])
3150 self.checkFlags(flags, eor=True)
3151
3152 def _testRecvmsgIntoScatter(self):
3153 self.sendToServer(b"Mary had a little lamb")
3154
3155
3156class CmsgMacroTests(unittest.TestCase):
3157 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3158 # assumptions used by sendmsg() and recvmsg[_into](), which share
3159 # code with these functions.
3160
3161 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003162 try:
3163 import _testcapi
3164 except ImportError:
3165 socklen_t_limit = 0x7fffffff
3166 else:
3167 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003168
3169 @requireAttrs(socket, "CMSG_LEN")
3170 def testCMSG_LEN(self):
3171 # Test CMSG_LEN() with various valid and invalid values,
3172 # checking the assumptions used by recvmsg() and sendmsg().
3173 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3174 values = list(range(257)) + list(range(toobig - 257, toobig))
3175
3176 # struct cmsghdr has at least three members, two of which are ints
3177 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3178 for n in values:
3179 ret = socket.CMSG_LEN(n)
3180 # This is how recvmsg() calculates the data size
3181 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3182 self.assertLessEqual(ret, self.socklen_t_limit)
3183
3184 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3185 # sendmsg() shares code with these functions, and requires
3186 # that it reject values over the limit.
3187 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3188 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3189
3190 @requireAttrs(socket, "CMSG_SPACE")
3191 def testCMSG_SPACE(self):
3192 # Test CMSG_SPACE() with various valid and invalid values,
3193 # checking the assumptions used by sendmsg().
3194 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3195 values = list(range(257)) + list(range(toobig - 257, toobig))
3196
3197 last = socket.CMSG_SPACE(0)
3198 # struct cmsghdr has at least three members, two of which are ints
3199 self.assertGreater(last, array.array("i").itemsize * 2)
3200 for n in values:
3201 ret = socket.CMSG_SPACE(n)
3202 self.assertGreaterEqual(ret, last)
3203 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3204 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3205 self.assertLessEqual(ret, self.socklen_t_limit)
3206 last = ret
3207
3208 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3209 # sendmsg() shares code with these functions, and requires
3210 # that it reject values over the limit.
3211 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3212 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3213
3214
3215class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3216 # Tests for file descriptor passing on Unix-domain sockets.
3217
3218 # Invalid file descriptor value that's unlikely to evaluate to a
3219 # real FD even if one of its bytes is replaced with a different
3220 # value (which shouldn't actually happen).
3221 badfd = -0x5555
3222
3223 def newFDs(self, n):
3224 # Return a list of n file descriptors for newly-created files
3225 # containing their list indices as ASCII numbers.
3226 fds = []
3227 for i in range(n):
3228 fd, path = tempfile.mkstemp()
3229 self.addCleanup(os.unlink, path)
3230 self.addCleanup(os.close, fd)
3231 os.write(fd, str(i).encode())
3232 fds.append(fd)
3233 return fds
3234
3235 def checkFDs(self, fds):
3236 # Check that the file descriptors in the given list contain
3237 # their correct list indices as ASCII numbers.
3238 for n, fd in enumerate(fds):
3239 os.lseek(fd, 0, os.SEEK_SET)
3240 self.assertEqual(os.read(fd, 1024), str(n).encode())
3241
3242 def registerRecvmsgResult(self, result):
3243 self.addCleanup(self.closeRecvmsgFDs, result)
3244
3245 def closeRecvmsgFDs(self, recvmsg_result):
3246 # Close all file descriptors specified in the ancillary data
3247 # of the given return value from recvmsg() or recvmsg_into().
3248 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3249 if (cmsg_level == socket.SOL_SOCKET and
3250 cmsg_type == socket.SCM_RIGHTS):
3251 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003252 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003253 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3254 for fd in fds:
3255 os.close(fd)
3256
3257 def createAndSendFDs(self, n):
3258 # Send n new file descriptors created by newFDs() to the
3259 # server, with the constant MSG as the non-ancillary data.
3260 self.assertEqual(
3261 self.sendmsgToServer([MSG],
3262 [(socket.SOL_SOCKET,
3263 socket.SCM_RIGHTS,
3264 array.array("i", self.newFDs(n)))]),
3265 len(MSG))
3266
3267 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3268 # Check that constant MSG was received with numfds file
3269 # descriptors in a maximum of maxcmsgs control messages (which
3270 # must contain only complete integers). By default, check
3271 # that MSG_CTRUNC is unset, but ignore any flags in
3272 # ignoreflags.
3273 msg, ancdata, flags, addr = result
3274 self.assertEqual(msg, MSG)
3275 self.checkRecvmsgAddress(addr, self.cli_addr)
3276 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3277 ignore=ignoreflags)
3278
3279 self.assertIsInstance(ancdata, list)
3280 self.assertLessEqual(len(ancdata), maxcmsgs)
3281 fds = array.array("i")
3282 for item in ancdata:
3283 self.assertIsInstance(item, tuple)
3284 cmsg_level, cmsg_type, cmsg_data = item
3285 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3286 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3287 self.assertIsInstance(cmsg_data, bytes)
3288 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003289 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003290
3291 self.assertEqual(len(fds), numfds)
3292 self.checkFDs(fds)
3293
3294 def testFDPassSimple(self):
3295 # Pass a single FD (array read from bytes object).
3296 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3297 len(MSG), 10240))
3298
3299 def _testFDPassSimple(self):
3300 self.assertEqual(
3301 self.sendmsgToServer(
3302 [MSG],
3303 [(socket.SOL_SOCKET,
3304 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003305 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003306 len(MSG))
3307
3308 def testMultipleFDPass(self):
3309 # Pass multiple FDs in a single array.
3310 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3311 len(MSG), 10240))
3312
3313 def _testMultipleFDPass(self):
3314 self.createAndSendFDs(4)
3315
3316 @requireAttrs(socket, "CMSG_SPACE")
3317 def testFDPassCMSG_SPACE(self):
3318 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3319 self.checkRecvmsgFDs(
3320 4, self.doRecvmsg(self.serv_sock, len(MSG),
3321 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3322
3323 @testFDPassCMSG_SPACE.client_skip
3324 def _testFDPassCMSG_SPACE(self):
3325 self.createAndSendFDs(4)
3326
3327 def testFDPassCMSG_LEN(self):
3328 # Test using CMSG_LEN() to calculate ancillary buffer size.
3329 self.checkRecvmsgFDs(1,
3330 self.doRecvmsg(self.serv_sock, len(MSG),
3331 socket.CMSG_LEN(4 * SIZEOF_INT)),
3332 # RFC 3542 says implementations may set
3333 # MSG_CTRUNC if there isn't enough space
3334 # for trailing padding.
3335 ignoreflags=socket.MSG_CTRUNC)
3336
3337 def _testFDPassCMSG_LEN(self):
3338 self.createAndSendFDs(1)
3339
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003340 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003341 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003342 @requireAttrs(socket, "CMSG_SPACE")
3343 def testFDPassSeparate(self):
3344 # Pass two FDs in two separate arrays. Arrays may be combined
3345 # into a single control message by the OS.
3346 self.checkRecvmsgFDs(2,
3347 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3348 maxcmsgs=2)
3349
3350 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003351 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003352 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003353 def _testFDPassSeparate(self):
3354 fd0, fd1 = self.newFDs(2)
3355 self.assertEqual(
3356 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3357 socket.SCM_RIGHTS,
3358 array.array("i", [fd0])),
3359 (socket.SOL_SOCKET,
3360 socket.SCM_RIGHTS,
3361 array.array("i", [fd1]))]),
3362 len(MSG))
3363
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003364 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003365 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003366 @requireAttrs(socket, "CMSG_SPACE")
3367 def testFDPassSeparateMinSpace(self):
3368 # Pass two FDs in two separate arrays, receiving them into the
3369 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003370 num_fds = 2
3371 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003372 self.doRecvmsg(self.serv_sock, len(MSG),
3373 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003374 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003375 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3376
3377 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003378 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003379 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003380 def _testFDPassSeparateMinSpace(self):
3381 fd0, fd1 = self.newFDs(2)
3382 self.assertEqual(
3383 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3384 socket.SCM_RIGHTS,
3385 array.array("i", [fd0])),
3386 (socket.SOL_SOCKET,
3387 socket.SCM_RIGHTS,
3388 array.array("i", [fd1]))]),
3389 len(MSG))
3390
3391 def sendAncillaryIfPossible(self, msg, ancdata):
3392 # Try to send msg and ancdata to server, but if the system
3393 # call fails, just send msg with no ancillary data.
3394 try:
3395 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003396 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003397 # Check that it was the system call that failed
3398 self.assertIsInstance(e.errno, int)
3399 nbytes = self.sendmsgToServer([msg])
3400 self.assertEqual(nbytes, len(msg))
3401
Brett Cannon3bbad122015-12-28 17:21:44 -08003402 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003403 def testFDPassEmpty(self):
3404 # Try to pass an empty FD array. Can receive either no array
3405 # or an empty array.
3406 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3407 len(MSG), 10240),
3408 ignoreflags=socket.MSG_CTRUNC)
3409
3410 def _testFDPassEmpty(self):
3411 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3412 socket.SCM_RIGHTS,
3413 b"")])
3414
3415 def testFDPassPartialInt(self):
3416 # Try to pass a truncated FD array.
3417 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3418 len(MSG), 10240)
3419 self.assertEqual(msg, MSG)
3420 self.checkRecvmsgAddress(addr, self.cli_addr)
3421 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3422 self.assertLessEqual(len(ancdata), 1)
3423 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3424 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3425 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3426 self.assertLess(len(cmsg_data), SIZEOF_INT)
3427
3428 def _testFDPassPartialInt(self):
3429 self.sendAncillaryIfPossible(
3430 MSG,
3431 [(socket.SOL_SOCKET,
3432 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003433 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003434
3435 @requireAttrs(socket, "CMSG_SPACE")
3436 def testFDPassPartialIntInMiddle(self):
3437 # Try to pass two FD arrays, the first of which is truncated.
3438 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3439 len(MSG), 10240)
3440 self.assertEqual(msg, MSG)
3441 self.checkRecvmsgAddress(addr, self.cli_addr)
3442 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3443 self.assertLessEqual(len(ancdata), 2)
3444 fds = array.array("i")
3445 # Arrays may have been combined in a single control message
3446 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3447 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3448 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003449 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3451 self.assertLessEqual(len(fds), 2)
3452 self.checkFDs(fds)
3453
3454 @testFDPassPartialIntInMiddle.client_skip
3455 def _testFDPassPartialIntInMiddle(self):
3456 fd0, fd1 = self.newFDs(2)
3457 self.sendAncillaryIfPossible(
3458 MSG,
3459 [(socket.SOL_SOCKET,
3460 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003461 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003462 (socket.SOL_SOCKET,
3463 socket.SCM_RIGHTS,
3464 array.array("i", [fd1]))])
3465
3466 def checkTruncatedHeader(self, result, ignoreflags=0):
3467 # Check that no ancillary data items are returned when data is
3468 # truncated inside the cmsghdr structure.
3469 msg, ancdata, flags, addr = result
3470 self.assertEqual(msg, MSG)
3471 self.checkRecvmsgAddress(addr, self.cli_addr)
3472 self.assertEqual(ancdata, [])
3473 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3474 ignore=ignoreflags)
3475
3476 def testCmsgTruncNoBufSize(self):
3477 # Check that no ancillary data is received when no buffer size
3478 # is specified.
3479 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3480 # BSD seems to set MSG_CTRUNC only
3481 # if an item has been partially
3482 # received.
3483 ignoreflags=socket.MSG_CTRUNC)
3484
3485 def _testCmsgTruncNoBufSize(self):
3486 self.createAndSendFDs(1)
3487
3488 def testCmsgTrunc0(self):
3489 # Check that no ancillary data is received when buffer size is 0.
3490 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3491 ignoreflags=socket.MSG_CTRUNC)
3492
3493 def _testCmsgTrunc0(self):
3494 self.createAndSendFDs(1)
3495
3496 # Check that no ancillary data is returned for various non-zero
3497 # (but still too small) buffer sizes.
3498
3499 def testCmsgTrunc1(self):
3500 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3501
3502 def _testCmsgTrunc1(self):
3503 self.createAndSendFDs(1)
3504
3505 def testCmsgTrunc2Int(self):
3506 # The cmsghdr structure has at least three members, two of
3507 # which are ints, so we still shouldn't see any ancillary
3508 # data.
3509 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3510 SIZEOF_INT * 2))
3511
3512 def _testCmsgTrunc2Int(self):
3513 self.createAndSendFDs(1)
3514
3515 def testCmsgTruncLen0Minus1(self):
3516 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3517 socket.CMSG_LEN(0) - 1))
3518
3519 def _testCmsgTruncLen0Minus1(self):
3520 self.createAndSendFDs(1)
3521
3522 # The following tests try to truncate the control message in the
3523 # middle of the FD array.
3524
3525 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3526 # Check that file descriptor data is truncated to between
3527 # mindata and maxdata bytes when received with buffer size
3528 # ancbuf, and that any complete file descriptor numbers are
3529 # valid.
3530 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3531 len(MSG), ancbuf)
3532 self.assertEqual(msg, MSG)
3533 self.checkRecvmsgAddress(addr, self.cli_addr)
3534 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3535
3536 if mindata == 0 and ancdata == []:
3537 return
3538 self.assertEqual(len(ancdata), 1)
3539 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3540 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3541 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3542 self.assertGreaterEqual(len(cmsg_data), mindata)
3543 self.assertLessEqual(len(cmsg_data), maxdata)
3544 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003545 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003546 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3547 self.checkFDs(fds)
3548
3549 def testCmsgTruncLen0(self):
3550 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3551
3552 def _testCmsgTruncLen0(self):
3553 self.createAndSendFDs(1)
3554
3555 def testCmsgTruncLen0Plus1(self):
3556 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3557
3558 def _testCmsgTruncLen0Plus1(self):
3559 self.createAndSendFDs(2)
3560
3561 def testCmsgTruncLen1(self):
3562 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3563 maxdata=SIZEOF_INT)
3564
3565 def _testCmsgTruncLen1(self):
3566 self.createAndSendFDs(2)
3567
3568 def testCmsgTruncLen2Minus1(self):
3569 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3570 maxdata=(2 * SIZEOF_INT) - 1)
3571
3572 def _testCmsgTruncLen2Minus1(self):
3573 self.createAndSendFDs(2)
3574
3575
3576class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3577 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3578 # features of the RFC 3542 Advanced Sockets API for IPv6.
3579 # Currently we can only handle certain data items (e.g. traffic
3580 # class, hop limit, MTU discovery and fragmentation settings)
3581 # without resorting to unportable means such as the struct module,
3582 # but the tests here are aimed at testing the ancillary data
3583 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3584 # itself.
3585
3586 # Test value to use when setting hop limit of packet
3587 hop_limit = 2
3588
3589 # Test value to use when setting traffic class of packet.
3590 # -1 means "use kernel default".
3591 traffic_class = -1
3592
3593 def ancillaryMapping(self, ancdata):
3594 # Given ancillary data list ancdata, return a mapping from
3595 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3596 # Check that no (level, type) pair appears more than once.
3597 d = {}
3598 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3599 self.assertNotIn((cmsg_level, cmsg_type), d)
3600 d[(cmsg_level, cmsg_type)] = cmsg_data
3601 return d
3602
3603 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3604 # Receive hop limit into ancbufsize bytes of ancillary data
3605 # space. Check that data is MSG, ancillary data is not
3606 # truncated (but ignore any flags in ignoreflags), and hop
3607 # limit is between 0 and maxhop inclusive.
3608 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3609 socket.IPV6_RECVHOPLIMIT, 1)
3610 self.misc_event.set()
3611 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3612 len(MSG), ancbufsize)
3613
3614 self.assertEqual(msg, MSG)
3615 self.checkRecvmsgAddress(addr, self.cli_addr)
3616 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3617 ignore=ignoreflags)
3618
3619 self.assertEqual(len(ancdata), 1)
3620 self.assertIsInstance(ancdata[0], tuple)
3621 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3622 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3623 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3624 self.assertIsInstance(cmsg_data, bytes)
3625 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3626 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003627 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003628 self.assertGreaterEqual(a[0], 0)
3629 self.assertLessEqual(a[0], maxhop)
3630
3631 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3632 def testRecvHopLimit(self):
3633 # Test receiving the packet hop limit as ancillary data.
3634 self.checkHopLimit(ancbufsize=10240)
3635
3636 @testRecvHopLimit.client_skip
3637 def _testRecvHopLimit(self):
3638 # Need to wait until server has asked to receive ancillary
3639 # data, as implementations are not required to buffer it
3640 # otherwise.
3641 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3642 self.sendToServer(MSG)
3643
3644 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3645 def testRecvHopLimitCMSG_SPACE(self):
3646 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3647 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3648
3649 @testRecvHopLimitCMSG_SPACE.client_skip
3650 def _testRecvHopLimitCMSG_SPACE(self):
3651 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3652 self.sendToServer(MSG)
3653
3654 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3655 # 3542 says portable applications must provide space for trailing
3656 # padding. Implementations may set MSG_CTRUNC if there isn't
3657 # enough space for the padding.
3658
3659 @requireAttrs(socket.socket, "sendmsg")
3660 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3661 def testSetHopLimit(self):
3662 # Test setting hop limit on outgoing packet and receiving it
3663 # at the other end.
3664 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3665
3666 @testSetHopLimit.client_skip
3667 def _testSetHopLimit(self):
3668 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3669 self.assertEqual(
3670 self.sendmsgToServer([MSG],
3671 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3672 array.array("i", [self.hop_limit]))]),
3673 len(MSG))
3674
3675 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3676 ignoreflags=0):
3677 # Receive traffic class and hop limit into ancbufsize bytes of
3678 # ancillary data space. Check that data is MSG, ancillary
3679 # data is not truncated (but ignore any flags in ignoreflags),
3680 # and traffic class and hop limit are in range (hop limit no
3681 # more than maxhop).
3682 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3683 socket.IPV6_RECVHOPLIMIT, 1)
3684 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3685 socket.IPV6_RECVTCLASS, 1)
3686 self.misc_event.set()
3687 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3688 len(MSG), ancbufsize)
3689
3690 self.assertEqual(msg, MSG)
3691 self.checkRecvmsgAddress(addr, self.cli_addr)
3692 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3693 ignore=ignoreflags)
3694 self.assertEqual(len(ancdata), 2)
3695 ancmap = self.ancillaryMapping(ancdata)
3696
3697 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3698 self.assertEqual(len(tcdata), SIZEOF_INT)
3699 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003700 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003701 self.assertGreaterEqual(a[0], 0)
3702 self.assertLessEqual(a[0], 255)
3703
3704 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3705 self.assertEqual(len(hldata), SIZEOF_INT)
3706 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003707 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708 self.assertGreaterEqual(a[0], 0)
3709 self.assertLessEqual(a[0], maxhop)
3710
3711 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3712 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3713 def testRecvTrafficClassAndHopLimit(self):
3714 # Test receiving traffic class and hop limit as ancillary data.
3715 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3716
3717 @testRecvTrafficClassAndHopLimit.client_skip
3718 def _testRecvTrafficClassAndHopLimit(self):
3719 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3720 self.sendToServer(MSG)
3721
3722 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3723 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3724 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3725 # Test receiving traffic class and hop limit, using
3726 # CMSG_SPACE() to calculate buffer size.
3727 self.checkTrafficClassAndHopLimit(
3728 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3729
3730 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3731 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3732 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3733 self.sendToServer(MSG)
3734
3735 @requireAttrs(socket.socket, "sendmsg")
3736 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3737 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3738 def testSetTrafficClassAndHopLimit(self):
3739 # Test setting traffic class and hop limit on outgoing packet,
3740 # and receiving them at the other end.
3741 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3742 maxhop=self.hop_limit)
3743
3744 @testSetTrafficClassAndHopLimit.client_skip
3745 def _testSetTrafficClassAndHopLimit(self):
3746 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3747 self.assertEqual(
3748 self.sendmsgToServer([MSG],
3749 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3750 array.array("i", [self.traffic_class])),
3751 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3752 array.array("i", [self.hop_limit]))]),
3753 len(MSG))
3754
3755 @requireAttrs(socket.socket, "sendmsg")
3756 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3757 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3758 def testOddCmsgSize(self):
3759 # Try to send ancillary data with first item one byte too
3760 # long. Fall back to sending with correct size if this fails,
3761 # and check that second item was handled correctly.
3762 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3763 maxhop=self.hop_limit)
3764
3765 @testOddCmsgSize.client_skip
3766 def _testOddCmsgSize(self):
3767 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3768 try:
3769 nbytes = self.sendmsgToServer(
3770 [MSG],
3771 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003772 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003773 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3774 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003775 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003776 self.assertIsInstance(e.errno, int)
3777 nbytes = self.sendmsgToServer(
3778 [MSG],
3779 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3780 array.array("i", [self.traffic_class])),
3781 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3782 array.array("i", [self.hop_limit]))])
3783 self.assertEqual(nbytes, len(MSG))
3784
3785 # Tests for proper handling of truncated ancillary data
3786
3787 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3788 # Receive hop limit into ancbufsize bytes of ancillary data
3789 # space, which should be too small to contain the ancillary
3790 # data header (if ancbufsize is None, pass no second argument
3791 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3792 # (unless included in ignoreflags), and no ancillary data is
3793 # returned.
3794 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3795 socket.IPV6_RECVHOPLIMIT, 1)
3796 self.misc_event.set()
3797 args = () if ancbufsize is None else (ancbufsize,)
3798 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3799 len(MSG), *args)
3800
3801 self.assertEqual(msg, MSG)
3802 self.checkRecvmsgAddress(addr, self.cli_addr)
3803 self.assertEqual(ancdata, [])
3804 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3805 ignore=ignoreflags)
3806
3807 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3808 def testCmsgTruncNoBufSize(self):
3809 # Check that no ancillary data is received when no ancillary
3810 # buffer size is provided.
3811 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3812 # BSD seems to set
3813 # MSG_CTRUNC only if an item
3814 # has been partially
3815 # received.
3816 ignoreflags=socket.MSG_CTRUNC)
3817
3818 @testCmsgTruncNoBufSize.client_skip
3819 def _testCmsgTruncNoBufSize(self):
3820 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3821 self.sendToServer(MSG)
3822
3823 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3824 def testSingleCmsgTrunc0(self):
3825 # Check that no ancillary data is received when ancillary
3826 # buffer size is zero.
3827 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3828 ignoreflags=socket.MSG_CTRUNC)
3829
3830 @testSingleCmsgTrunc0.client_skip
3831 def _testSingleCmsgTrunc0(self):
3832 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3833 self.sendToServer(MSG)
3834
3835 # Check that no ancillary data is returned for various non-zero
3836 # (but still too small) buffer sizes.
3837
3838 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3839 def testSingleCmsgTrunc1(self):
3840 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3841
3842 @testSingleCmsgTrunc1.client_skip
3843 def _testSingleCmsgTrunc1(self):
3844 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3845 self.sendToServer(MSG)
3846
3847 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3848 def testSingleCmsgTrunc2Int(self):
3849 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3850
3851 @testSingleCmsgTrunc2Int.client_skip
3852 def _testSingleCmsgTrunc2Int(self):
3853 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3854 self.sendToServer(MSG)
3855
3856 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3857 def testSingleCmsgTruncLen0Minus1(self):
3858 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3859
3860 @testSingleCmsgTruncLen0Minus1.client_skip
3861 def _testSingleCmsgTruncLen0Minus1(self):
3862 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3863 self.sendToServer(MSG)
3864
3865 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3866 def testSingleCmsgTruncInData(self):
3867 # Test truncation of a control message inside its associated
3868 # data. The message may be returned with its data truncated,
3869 # or not returned at all.
3870 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3871 socket.IPV6_RECVHOPLIMIT, 1)
3872 self.misc_event.set()
3873 msg, ancdata, flags, addr = self.doRecvmsg(
3874 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3875
3876 self.assertEqual(msg, MSG)
3877 self.checkRecvmsgAddress(addr, self.cli_addr)
3878 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3879
3880 self.assertLessEqual(len(ancdata), 1)
3881 if ancdata:
3882 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3883 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3884 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3885 self.assertLess(len(cmsg_data), SIZEOF_INT)
3886
3887 @testSingleCmsgTruncInData.client_skip
3888 def _testSingleCmsgTruncInData(self):
3889 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3890 self.sendToServer(MSG)
3891
3892 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3893 # Receive traffic class and hop limit into ancbufsize bytes of
3894 # ancillary data space, which should be large enough to
3895 # contain the first item, but too small to contain the header
3896 # of the second. Check that data is MSG, MSG_CTRUNC is set
3897 # (unless included in ignoreflags), and only one ancillary
3898 # data item is returned.
3899 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3900 socket.IPV6_RECVHOPLIMIT, 1)
3901 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3902 socket.IPV6_RECVTCLASS, 1)
3903 self.misc_event.set()
3904 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3905 len(MSG), ancbufsize)
3906
3907 self.assertEqual(msg, MSG)
3908 self.checkRecvmsgAddress(addr, self.cli_addr)
3909 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3910 ignore=ignoreflags)
3911
3912 self.assertEqual(len(ancdata), 1)
3913 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3914 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3915 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3916 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3917 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003918 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003919 self.assertGreaterEqual(a[0], 0)
3920 self.assertLessEqual(a[0], 255)
3921
3922 # Try the above test with various buffer sizes.
3923
3924 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3925 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3926 def testSecondCmsgTrunc0(self):
3927 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3928 ignoreflags=socket.MSG_CTRUNC)
3929
3930 @testSecondCmsgTrunc0.client_skip
3931 def _testSecondCmsgTrunc0(self):
3932 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3933 self.sendToServer(MSG)
3934
3935 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3936 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3937 def testSecondCmsgTrunc1(self):
3938 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3939
3940 @testSecondCmsgTrunc1.client_skip
3941 def _testSecondCmsgTrunc1(self):
3942 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3943 self.sendToServer(MSG)
3944
3945 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3946 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3947 def testSecondCmsgTrunc2Int(self):
3948 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3949 2 * SIZEOF_INT)
3950
3951 @testSecondCmsgTrunc2Int.client_skip
3952 def _testSecondCmsgTrunc2Int(self):
3953 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3954 self.sendToServer(MSG)
3955
3956 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3957 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3958 def testSecondCmsgTruncLen0Minus1(self):
3959 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3960 socket.CMSG_LEN(0) - 1)
3961
3962 @testSecondCmsgTruncLen0Minus1.client_skip
3963 def _testSecondCmsgTruncLen0Minus1(self):
3964 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3965 self.sendToServer(MSG)
3966
3967 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3968 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3969 def testSecomdCmsgTruncInData(self):
3970 # Test truncation of the second of two control messages inside
3971 # its associated data.
3972 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3973 socket.IPV6_RECVHOPLIMIT, 1)
3974 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3975 socket.IPV6_RECVTCLASS, 1)
3976 self.misc_event.set()
3977 msg, ancdata, flags, addr = self.doRecvmsg(
3978 self.serv_sock, len(MSG),
3979 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3980
3981 self.assertEqual(msg, MSG)
3982 self.checkRecvmsgAddress(addr, self.cli_addr)
3983 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3984
3985 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3986
3987 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3988 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3989 cmsg_types.remove(cmsg_type)
3990 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3991 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003992 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003993 self.assertGreaterEqual(a[0], 0)
3994 self.assertLessEqual(a[0], 255)
3995
3996 if ancdata:
3997 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3998 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3999 cmsg_types.remove(cmsg_type)
4000 self.assertLess(len(cmsg_data), SIZEOF_INT)
4001
4002 self.assertEqual(ancdata, [])
4003
4004 @testSecomdCmsgTruncInData.client_skip
4005 def _testSecomdCmsgTruncInData(self):
4006 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
4007 self.sendToServer(MSG)
4008
4009
4010# Derive concrete test classes for different socket types.
4011
4012class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4013 SendrecvmsgConnectionlessBase,
4014 ThreadedSocketTestMixin, UDPTestBase):
4015 pass
4016
4017@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004018class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4019 pass
4020
4021@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004022class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4023 pass
4024
4025@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004026class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4027 pass
4028
4029
4030class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4031 SendrecvmsgConnectionlessBase,
4032 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004033
4034 def checkRecvmsgAddress(self, addr1, addr2):
4035 # Called to compare the received address with the address of
4036 # the peer, ignoring scope ID
4037 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004038
4039@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004040@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004041@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004042class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4043 pass
4044
4045@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004046@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004047@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004048class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4049 pass
4050
4051@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004052@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004053@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4055 pass
4056
4057@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004058@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004059@requireAttrs(socket, "IPPROTO_IPV6")
4060@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004061class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4062 SendrecvmsgUDP6TestBase):
4063 pass
4064
4065@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004066@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004067@requireAttrs(socket, "IPPROTO_IPV6")
4068@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004069class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4070 RFC3542AncillaryTest,
4071 SendrecvmsgUDP6TestBase):
4072 pass
4073
4074
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004075@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4076 'UDPLITE sockets required for this test.')
4077class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4078 SendrecvmsgConnectionlessBase,
4079 ThreadedSocketTestMixin, UDPLITETestBase):
4080 pass
4081
4082@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4083 'UDPLITE sockets required for this test.')
4084@requireAttrs(socket.socket, "sendmsg")
4085class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4086 pass
4087
4088@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4089 'UDPLITE sockets required for this test.')
4090@requireAttrs(socket.socket, "recvmsg")
4091class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4092 pass
4093
4094@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4095 'UDPLITE sockets required for this test.')
4096@requireAttrs(socket.socket, "recvmsg_into")
4097class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4098 pass
4099
4100
4101@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4102 'UDPLITE sockets required for this test.')
4103class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4104 SendrecvmsgConnectionlessBase,
4105 ThreadedSocketTestMixin, UDPLITE6TestBase):
4106
4107 def checkRecvmsgAddress(self, addr1, addr2):
4108 # Called to compare the received address with the address of
4109 # the peer, ignoring scope ID
4110 self.assertEqual(addr1[:-1], addr2[:-1])
4111
4112@requireAttrs(socket.socket, "sendmsg")
4113@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4114@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4115 'UDPLITE sockets required for this test.')
4116@requireSocket("AF_INET6", "SOCK_DGRAM")
4117class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4118 pass
4119
4120@requireAttrs(socket.socket, "recvmsg")
4121@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4122@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4123 'UDPLITE sockets required for this test.')
4124@requireSocket("AF_INET6", "SOCK_DGRAM")
4125class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4126 pass
4127
4128@requireAttrs(socket.socket, "recvmsg_into")
4129@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4130@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4131 'UDPLITE sockets required for this test.')
4132@requireSocket("AF_INET6", "SOCK_DGRAM")
4133class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4134 pass
4135
4136@requireAttrs(socket.socket, "recvmsg")
4137@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4138@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4139 'UDPLITE sockets required for this test.')
4140@requireAttrs(socket, "IPPROTO_IPV6")
4141@requireSocket("AF_INET6", "SOCK_DGRAM")
4142class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4143 SendrecvmsgUDPLITE6TestBase):
4144 pass
4145
4146@requireAttrs(socket.socket, "recvmsg_into")
4147@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4148@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4149 'UDPLITE sockets required for this test.')
4150@requireAttrs(socket, "IPPROTO_IPV6")
4151@requireSocket("AF_INET6", "SOCK_DGRAM")
4152class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4153 RFC3542AncillaryTest,
4154 SendrecvmsgUDPLITE6TestBase):
4155 pass
4156
4157
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004158class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4159 ConnectedStreamTestMixin, TCPTestBase):
4160 pass
4161
4162@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004163class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4164 pass
4165
4166@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004167class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4168 SendrecvmsgTCPTestBase):
4169 pass
4170
4171@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004172class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4173 SendrecvmsgTCPTestBase):
4174 pass
4175
4176
4177class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4178 SendrecvmsgConnectedBase,
4179 ConnectedStreamTestMixin, SCTPStreamBase):
4180 pass
4181
4182@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004183@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004184@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004185class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4186 pass
4187
4188@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004189@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004190@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004191class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4192 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004193
4194 def testRecvmsgEOF(self):
4195 try:
4196 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4197 except OSError as e:
4198 if e.errno != errno.ENOTCONN:
4199 raise
4200 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004201
4202@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004203@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004204@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004205class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4206 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004207
4208 def testRecvmsgEOF(self):
4209 try:
4210 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4211 except OSError as e:
4212 if e.errno != errno.ENOTCONN:
4213 raise
4214 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004215
4216
4217class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4218 ConnectedStreamTestMixin, UnixStreamBase):
4219 pass
4220
4221@requireAttrs(socket.socket, "sendmsg")
4222@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004223class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4224 pass
4225
4226@requireAttrs(socket.socket, "recvmsg")
4227@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004228class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4229 SendrecvmsgUnixStreamTestBase):
4230 pass
4231
4232@requireAttrs(socket.socket, "recvmsg_into")
4233@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004234class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4235 SendrecvmsgUnixStreamTestBase):
4236 pass
4237
4238@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4239@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004240class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4241 pass
4242
4243@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4244@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004245class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4246 SendrecvmsgUnixStreamTestBase):
4247 pass
4248
4249
4250# Test interrupting the interruptible send/receive methods with a
4251# signal when a timeout is set. These tests avoid having multiple
4252# threads alive during the test so that the OS cannot deliver the
4253# signal to the wrong one.
4254
4255class InterruptedTimeoutBase(unittest.TestCase):
4256 # Base class for interrupted send/receive tests. Installs an
4257 # empty handler for SIGALRM and removes it on teardown, along with
4258 # any scheduled alarms.
4259
4260 def setUp(self):
4261 super().setUp()
4262 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004263 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004264 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004265
4266 # Timeout for socket operations
4267 timeout = 4.0
4268
4269 # Provide setAlarm() method to schedule delivery of SIGALRM after
4270 # given number of seconds, or cancel it if zero, and an
4271 # appropriate time value to use. Use setitimer() if available.
4272 if hasattr(signal, "setitimer"):
4273 alarm_time = 0.05
4274
4275 def setAlarm(self, seconds):
4276 signal.setitimer(signal.ITIMER_REAL, seconds)
4277 else:
4278 # Old systems may deliver the alarm up to one second early
4279 alarm_time = 2
4280
4281 def setAlarm(self, seconds):
4282 signal.alarm(seconds)
4283
4284
4285# Require siginterrupt() in order to ensure that system calls are
4286# interrupted by default.
4287@requireAttrs(signal, "siginterrupt")
4288@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4289 "Don't have signal.alarm or signal.setitimer")
4290class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4291 # Test interrupting the recv*() methods with signals when a
4292 # timeout is set.
4293
4294 def setUp(self):
4295 super().setUp()
4296 self.serv.settimeout(self.timeout)
4297
4298 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004299 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004300 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004301 try:
4302 self.setAlarm(self.alarm_time)
4303 with self.assertRaises(ZeroDivisionError) as cm:
4304 func(*args, **kwargs)
4305 finally:
4306 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004307
4308 def testInterruptedRecvTimeout(self):
4309 self.checkInterruptedRecv(self.serv.recv, 1024)
4310
4311 def testInterruptedRecvIntoTimeout(self):
4312 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4313
4314 def testInterruptedRecvfromTimeout(self):
4315 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4316
4317 def testInterruptedRecvfromIntoTimeout(self):
4318 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4319
4320 @requireAttrs(socket.socket, "recvmsg")
4321 def testInterruptedRecvmsgTimeout(self):
4322 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4323
4324 @requireAttrs(socket.socket, "recvmsg_into")
4325 def testInterruptedRecvmsgIntoTimeout(self):
4326 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4327
4328
4329# Require siginterrupt() in order to ensure that system calls are
4330# interrupted by default.
4331@requireAttrs(signal, "siginterrupt")
4332@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4333 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004334class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4335 ThreadSafeCleanupTestCase,
4336 SocketListeningTestMixin, TCPTestBase):
4337 # Test interrupting the interruptible send*() methods with signals
4338 # when a timeout is set.
4339
4340 def setUp(self):
4341 super().setUp()
4342 self.serv_conn = self.newSocket()
4343 self.addCleanup(self.serv_conn.close)
4344 # Use a thread to complete the connection, but wait for it to
4345 # terminate before running the test, so that there is only one
4346 # thread to accept the signal.
4347 cli_thread = threading.Thread(target=self.doConnect)
4348 cli_thread.start()
4349 self.cli_conn, addr = self.serv.accept()
4350 self.addCleanup(self.cli_conn.close)
4351 cli_thread.join()
4352 self.serv_conn.settimeout(self.timeout)
4353
4354 def doConnect(self):
4355 self.serv_conn.connect(self.serv_addr)
4356
4357 def checkInterruptedSend(self, func, *args, **kwargs):
4358 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004359 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004360 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004361 try:
4362 with self.assertRaises(ZeroDivisionError) as cm:
4363 while True:
4364 self.setAlarm(self.alarm_time)
4365 func(*args, **kwargs)
4366 finally:
4367 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004368
Ned Deilyc5640382014-02-03 13:58:31 -08004369 # Issue #12958: The following tests have problems on OS X prior to 10.7
4370 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004371 def testInterruptedSendTimeout(self):
4372 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4373
Ned Deilyc5640382014-02-03 13:58:31 -08004374 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004375 def testInterruptedSendtoTimeout(self):
4376 # Passing an actual address here as Python's wrapper for
4377 # sendto() doesn't allow passing a zero-length one; POSIX
4378 # requires that the address is ignored since the socket is
4379 # connection-mode, however.
4380 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4381 self.serv_addr)
4382
Ned Deilyc5640382014-02-03 13:58:31 -08004383 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004384 @requireAttrs(socket.socket, "sendmsg")
4385 def testInterruptedSendmsgTimeout(self):
4386 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4387
4388
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004389class TCPCloserTest(ThreadedTCPSocketTest):
4390
4391 def testClose(self):
4392 conn, addr = self.serv.accept()
4393 conn.close()
4394
4395 sd = self.cli
4396 read, write, err = select.select([sd], [], [], 1.0)
4397 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004398 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004399
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004400 # Calling close() many times should be safe.
4401 conn.close()
4402 conn.close()
4403
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004404 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004405 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004406 time.sleep(1.0)
4407
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004408
Dave Cole331708b2004-08-09 04:51:41 +00004409class BasicSocketPairTest(SocketPairTest):
4410
4411 def __init__(self, methodName='runTest'):
4412 SocketPairTest.__init__(self, methodName=methodName)
4413
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004414 def _check_defaults(self, sock):
4415 self.assertIsInstance(sock, socket.socket)
4416 if hasattr(socket, 'AF_UNIX'):
4417 self.assertEqual(sock.family, socket.AF_UNIX)
4418 else:
4419 self.assertEqual(sock.family, socket.AF_INET)
4420 self.assertEqual(sock.type, socket.SOCK_STREAM)
4421 self.assertEqual(sock.proto, 0)
4422
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004423 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004424 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004425
4426 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004427 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004428
Dave Cole331708b2004-08-09 04:51:41 +00004429 def testRecv(self):
4430 msg = self.serv.recv(1024)
4431 self.assertEqual(msg, MSG)
4432
4433 def _testRecv(self):
4434 self.cli.send(MSG)
4435
4436 def testSend(self):
4437 self.serv.send(MSG)
4438
4439 def _testSend(self):
4440 msg = self.cli.recv(1024)
4441 self.assertEqual(msg, MSG)
4442
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004443
Guido van Rossum24e4af82002-06-12 19:18:08 +00004444class NonBlockingTCPTests(ThreadedTCPSocketTest):
4445
4446 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004447 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004448 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4449
Victor Stinner304315d2018-11-30 13:22:44 +01004450 def assert_sock_timeout(self, sock, timeout):
4451 self.assertEqual(self.serv.gettimeout(), timeout)
4452
4453 blocking = (timeout != 0.0)
4454 self.assertEqual(sock.getblocking(), blocking)
4455
4456 if fcntl is not None:
4457 # When a Python socket has a non-zero timeout, it's switched
4458 # internally to a non-blocking mode. Later, sock.sendall(),
4459 # sock.recv(), and other socket operations use a select() call and
4460 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4461 # timeouts are enforced.
4462 fd_blocking = (timeout is None)
4463
4464 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4465 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4466
Guido van Rossum24e4af82002-06-12 19:18:08 +00004467 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004468 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004469 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004470 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004471
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004472 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004473 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004474
4475 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004476 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004477
4478 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004479 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004480
4481 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004482 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004483
4484 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004485 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004486
4487 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004488 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004489
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004490 @support.cpython_only
4491 def testSetBlocking_overflow(self):
4492 # Issue 15989
4493 import _testcapi
4494 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4495 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004496
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004497 self.serv.setblocking(False)
4498 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004499
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004500 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4501 self.assertIsNone(self.serv.gettimeout())
4502
4503 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4504
Serhiy Storchaka43767632013-11-03 21:31:38 +02004505 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4506 'test needs socket.SOCK_NONBLOCK')
4507 @support.requires_linux_version(2, 6, 28)
4508 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004509 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004510 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004511 self.serv = socket.socket(socket.AF_INET,
4512 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4513 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004514
4515 def _testInitNonBlocking(self):
4516 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004517
Victor Stinner304315d2018-11-30 13:22:44 +01004518 def testInheritFlagsBlocking(self):
4519 # bpo-7995: accept() on a listening socket with a timeout and the
4520 # default timeout is None, the resulting socket must be blocking.
4521 with socket_setdefaulttimeout(None):
4522 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004523 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004524 self.addCleanup(conn.close)
4525 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004526
Victor Stinner304315d2018-11-30 13:22:44 +01004527 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004528 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004529
4530 def testInheritFlagsTimeout(self):
4531 # bpo-7995: accept() on a listening socket with a timeout and the
4532 # default timeout is None, the resulting socket must inherit
4533 # the default timeout.
4534 default_timeout = 20.0
4535 with socket_setdefaulttimeout(default_timeout):
4536 self.serv.settimeout(10)
4537 conn, addr = self.serv.accept()
4538 self.addCleanup(conn.close)
4539 self.assertEqual(conn.gettimeout(), default_timeout)
4540
4541 def _testInheritFlagsTimeout(self):
4542 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004543
Guido van Rossum24e4af82002-06-12 19:18:08 +00004544 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004545 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004546 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004547
4548 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004549 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004550 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004551 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004552 dt = time.monotonic() - start_time
4553 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004554
4555 self.event.set()
4556
4557 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4558 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004559 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004560
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004561 # connect() completed: non-blocking accept() doesn't block
4562 conn, addr = self.serv.accept()
4563 self.addCleanup(conn.close)
4564 self.assertIsNone(conn.gettimeout())
4565
Guido van Rossum24e4af82002-06-12 19:18:08 +00004566 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004567 # don't connect before event is set to check
4568 # that non-blocking accept() raises BlockingIOError
4569 self.event.wait()
4570
Christian Heimes5e696852008-04-09 08:37:03 +00004571 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004572
Guido van Rossum24e4af82002-06-12 19:18:08 +00004573 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004574 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004575 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004576 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004577 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004578
4579 # the server didn't send data yet: non-blocking recv() fails
4580 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004581 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004582
4583 self.event.set()
4584
4585 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4586 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004587 self.fail("Error during select call to non-blocking socket.")
4588
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004589 # the server sent data yet: non-blocking recv() doesn't block
4590 msg = conn.recv(len(MSG))
4591 self.assertEqual(msg, MSG)
4592
Guido van Rossum24e4af82002-06-12 19:18:08 +00004593 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004594 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004595
4596 # don't send anything before event is set to check
4597 # that non-blocking recv() raises BlockingIOError
4598 self.event.wait()
4599
4600 # send data: recv() will no longer block
4601 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004602
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004603
Guido van Rossum24e4af82002-06-12 19:18:08 +00004604class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004605 """Unit tests for the object returned by socket.makefile()
4606
Antoine Pitrou834bd812010-10-13 16:17:14 +00004607 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004608 the client connection. You can read from this file to
4609 get output from the server.
4610
Antoine Pitrou834bd812010-10-13 16:17:14 +00004611 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004612 server connection. You can write to this file to send output
4613 to the client.
4614 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004615
Guido van Rossume9f66142002-08-07 15:46:19 +00004616 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004617 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004618 errors = 'strict'
4619 newline = None
4620
4621 read_mode = 'rb'
4622 read_msg = MSG
4623 write_mode = 'wb'
4624 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004625
Guido van Rossum24e4af82002-06-12 19:18:08 +00004626 def __init__(self, methodName='runTest'):
4627 SocketConnectedTest.__init__(self, methodName=methodName)
4628
4629 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004630 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4631 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004632 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004633 self.read_file = self.cli_conn.makefile(
4634 self.read_mode, self.bufsize,
4635 encoding = self.encoding,
4636 errors = self.errors,
4637 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004638
4639 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004640 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004641 self.read_file.close()
4642 self.assertTrue(self.read_file.closed)
4643 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004644 SocketConnectedTest.tearDown(self)
4645
4646 def clientSetUp(self):
4647 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004648 self.write_file = self.serv_conn.makefile(
4649 self.write_mode, self.bufsize,
4650 encoding = self.encoding,
4651 errors = self.errors,
4652 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004653
4654 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004655 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004656 self.write_file.close()
4657 self.assertTrue(self.write_file.closed)
4658 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004659 SocketConnectedTest.clientTearDown(self)
4660
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004661 def testReadAfterTimeout(self):
4662 # Issue #7322: A file object must disallow further reads
4663 # after a timeout has occurred.
4664 self.cli_conn.settimeout(1)
4665 self.read_file.read(3)
4666 # First read raises a timeout
4667 self.assertRaises(socket.timeout, self.read_file.read, 1)
4668 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004669 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004670 self.read_file.read(1)
4671 self.assertIn("cannot read from timed out object", str(ctx.exception))
4672
4673 def _testReadAfterTimeout(self):
4674 self.write_file.write(self.write_msg[0:3])
4675 self.write_file.flush()
4676 self.serv_finished.wait()
4677
Guido van Rossum24e4af82002-06-12 19:18:08 +00004678 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004679 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004680 first_seg = self.read_file.read(len(self.read_msg)-3)
4681 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004682 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004683 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004684
4685 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004686 self.write_file.write(self.write_msg)
4687 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004688
Guido van Rossum8c943832002-08-08 01:00:28 +00004689 def testFullRead(self):
4690 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004691 msg = self.read_file.read()
4692 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004693
4694 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004695 self.write_file.write(self.write_msg)
4696 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004697
Guido van Rossum24e4af82002-06-12 19:18:08 +00004698 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004699 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004700 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004701 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004702 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004703 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004704 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004705 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004706 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004707
4708 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004709 self.write_file.write(self.write_msg)
4710 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004711
4712 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004713 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004714 line = self.read_file.readline()
4715 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004716
4717 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004718 self.write_file.write(self.write_msg)
4719 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004720
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004721 def testCloseAfterMakefile(self):
4722 # The file returned by makefile should keep the socket open.
4723 self.cli_conn.close()
4724 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004725 msg = self.read_file.read()
4726 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004727
4728 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004729 self.write_file.write(self.write_msg)
4730 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004731
4732 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004733 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004734 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004735 if isinstance(self.read_msg, str):
4736 msg = msg.decode()
4737 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004738
4739 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004740 self.write_file.write(self.write_msg)
4741 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004742
Tim Peters116d83c2004-03-28 02:20:45 +00004743 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004744 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004745
4746 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004747 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004748
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004749 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004750 self.assertEqual(self.read_file.mode, self.read_mode)
4751 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004752
4753 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004754 self.assertEqual(self.write_file.mode, self.write_mode)
4755 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004756
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004757 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004758 self.read_file.close()
4759 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004760 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004761 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004762
4763 def _testRealClose(self):
4764 pass
4765
4766
Guido van Rossume9f66142002-08-07 15:46:19 +00004767class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4768
4769 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004770
Guido van Rossume9f66142002-08-07 15:46:19 +00004771 In this case (and in this case only), it should be possible to
4772 create a file object, read a line from it, create another file
4773 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004774 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004775 when reading multiple requests from the same socket."""
4776
4777 bufsize = 0 # Use unbuffered mode
4778
4779 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004780 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004781 line = self.read_file.readline() # first line
4782 self.assertEqual(line, b"A. " + self.write_msg) # first line
4783 self.read_file = self.cli_conn.makefile('rb', 0)
4784 line = self.read_file.readline() # second line
4785 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004786
4787 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004788 self.write_file.write(b"A. " + self.write_msg)
4789 self.write_file.write(b"B. " + self.write_msg)
4790 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004791
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004792 def testMakefileClose(self):
4793 # The file returned by makefile should keep the socket open...
4794 self.cli_conn.close()
4795 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004796 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004797 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004798 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004799 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004800
4801 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004802 self.write_file.write(self.write_msg)
4803 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004804
4805 def testMakefileCloseSocketDestroy(self):
4806 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004807 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004808 refcount_after = sys.getrefcount(self.cli_conn)
4809 self.assertEqual(refcount_before - 1, refcount_after)
4810
4811 def _testMakefileCloseSocketDestroy(self):
4812 pass
4813
Antoine Pitrou98b46702010-09-18 22:59:00 +00004814 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004815 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004816 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4817
4818 def testSmallReadNonBlocking(self):
4819 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004820 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4821 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004822 self.evt1.set()
4823 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004824 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004825 if first_seg is None:
4826 # Data not arrived (can happen under Windows), wait a bit
4827 time.sleep(0.5)
4828 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004829 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004830 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004831 self.assertEqual(n, 3)
4832 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004833 self.assertEqual(msg, self.read_msg)
4834 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4835 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004836
4837 def _testSmallReadNonBlocking(self):
4838 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004839 self.write_file.write(self.write_msg)
4840 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004841 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004842 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004843 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4844 self.serv_finished.wait(5.0)
4845
4846 def testWriteNonBlocking(self):
4847 self.cli_finished.wait(5.0)
4848 # The client thread can't skip directly - the SkipTest exception
4849 # would appear as a failure.
4850 if self.serv_skipped:
4851 self.skipTest(self.serv_skipped)
4852
4853 def _testWriteNonBlocking(self):
4854 self.serv_skipped = None
4855 self.serv_conn.setblocking(False)
4856 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004857 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004858 LIMIT = 10
4859 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004860 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004861 self.assertGreater(n, 0)
4862 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004863 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004864 if n is None:
4865 # Succeeded
4866 break
4867 self.assertGreater(n, 0)
4868 else:
4869 # Let us know that this test didn't manage to establish
4870 # the expected conditions. This is not a failure in itself but,
4871 # if it happens repeatedly, the test should be fixed.
4872 self.serv_skipped = "failed to saturate the socket buffer"
4873
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004874
Guido van Rossum8c943832002-08-08 01:00:28 +00004875class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4876
4877 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4878
4879
4880class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4881
4882 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004883
Thomas Woutersb2137042007-02-01 18:02:27 +00004884
Antoine Pitrou834bd812010-10-13 16:17:14 +00004885class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4886 """Tests for socket.makefile() in text mode (rather than binary)"""
4887
4888 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004889 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004890 write_mode = 'wb'
4891 write_msg = MSG
4892 newline = ''
4893
4894
4895class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4896 """Tests for socket.makefile() in text mode (rather than binary)"""
4897
4898 read_mode = 'rb'
4899 read_msg = MSG
4900 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004901 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004902 newline = ''
4903
4904
4905class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4906 """Tests for socket.makefile() in text mode (rather than binary)"""
4907
4908 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004909 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004910 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004911 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004912 newline = ''
4913
4914
Guido van Rossumd8faa362007-04-27 19:54:29 +00004915class NetworkConnectionTest(object):
4916 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004917
Guido van Rossumd8faa362007-04-27 19:54:29 +00004918 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004919 # We're inherited below by BasicTCPTest2, which also inherits
4920 # BasicTCPTest, which defines self.port referenced below.
4921 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004922 self.serv_conn = self.cli
4923
4924class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4925 """Tests that NetworkConnection does not break existing TCP functionality.
4926 """
4927
4928class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004929
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004930 class MockSocket(socket.socket):
4931 def connect(self, *args):
4932 raise socket.timeout('timed out')
4933
4934 @contextlib.contextmanager
4935 def mocked_socket_module(self):
4936 """Return a socket which times out on connect"""
4937 old_socket = socket.socket
4938 socket.socket = self.MockSocket
4939 try:
4940 yield
4941 finally:
4942 socket.socket = old_socket
4943
4944 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004945 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004946 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004947 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004948 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004949 cli.connect((HOST, port))
4950 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4951
4952 def test_create_connection(self):
4953 # Issue #9792: errors raised by create_connection() should have
4954 # a proper errno attribute.
4955 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004956 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004957 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004958
4959 # Issue #16257: create_connection() calls getaddrinfo() against
4960 # 'localhost'. This may result in an IPV6 addr being returned
4961 # as well as an IPV4 one:
4962 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4963 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4964 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4965 #
4966 # create_connection() enumerates through all the addresses returned
4967 # and if it doesn't successfully bind to any of them, it propagates
4968 # the last exception it encountered.
4969 #
4970 # On Solaris, ENETUNREACH is returned in this circumstance instead
4971 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4972 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02004973 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04004974 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004975
4976 def test_create_connection_timeout(self):
4977 # Issue #9792: create_connection() should not recast timeout errors
4978 # as generic socket errors.
4979 with self.mocked_socket_module():
Zackery Spytzc2cda632019-06-30 09:24:43 -06004980 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004981 socket.create_connection((HOST, 1234))
Zackery Spytzc2cda632019-06-30 09:24:43 -06004982 except socket.timeout:
4983 pass
4984 except OSError as exc:
4985 if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
4986 raise
4987 else:
4988 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004989
Guido van Rossumd8faa362007-04-27 19:54:29 +00004990
4991class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4992
4993 def __init__(self, methodName='runTest'):
4994 SocketTCPTest.__init__(self, methodName=methodName)
4995 ThreadableTest.__init__(self)
4996
4997 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004998 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004999
5000 def clientTearDown(self):
5001 self.cli.close()
5002 self.cli = None
5003 ThreadableTest.clientTearDown(self)
5004
5005 def _justAccept(self):
5006 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005007 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00005008
5009 testFamily = _justAccept
5010 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005011 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005012 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005013 self.assertEqual(self.cli.family, 2)
5014
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005015 testSourceAddress = _justAccept
5016 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00005017 self.cli = socket.create_connection((HOST, self.port), timeout=30,
5018 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005019 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005020 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005021 # The port number being used is sufficient to show that the bind()
5022 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005023
Guido van Rossumd8faa362007-04-27 19:54:29 +00005024 testTimeoutDefault = _justAccept
5025 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005026 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005027 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005028 socket.setdefaulttimeout(42)
5029 try:
5030 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005031 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005032 finally:
5033 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005034 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005035
5036 testTimeoutNone = _justAccept
5037 def _testTimeoutNone(self):
5038 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005039 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005040 socket.setdefaulttimeout(30)
5041 try:
5042 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005043 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005044 finally:
5045 socket.setdefaulttimeout(None)
5046 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005047
5048 testTimeoutValueNamed = _justAccept
5049 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005050 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005051 self.assertEqual(self.cli.gettimeout(), 30)
5052
5053 testTimeoutValueNonamed = _justAccept
5054 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005055 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005056 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005057 self.assertEqual(self.cli.gettimeout(), 30)
5058
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005059
Guido van Rossumd8faa362007-04-27 19:54:29 +00005060class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5061
5062 def __init__(self, methodName='runTest'):
5063 SocketTCPTest.__init__(self, methodName=methodName)
5064 ThreadableTest.__init__(self)
5065
5066 def clientSetUp(self):
5067 pass
5068
5069 def clientTearDown(self):
5070 self.cli.close()
5071 self.cli = None
5072 ThreadableTest.clientTearDown(self)
5073
5074 def testInsideTimeout(self):
5075 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005076 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005077 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005078 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005079 testOutsideTimeout = testInsideTimeout
5080
5081 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005082 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005083 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005084 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005085
5086 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005087 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005088 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005089
5090
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005091class TCPTimeoutTest(SocketTCPTest):
5092
5093 def testTCPTimeout(self):
5094 def raise_timeout(*args, **kwargs):
5095 self.serv.settimeout(1.0)
5096 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005097 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005098 "Error generating a timeout exception (TCP)")
5099
5100 def testTimeoutZero(self):
5101 ok = False
5102 try:
5103 self.serv.settimeout(0.0)
5104 foo = self.serv.accept()
5105 except socket.timeout:
5106 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005107 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005108 ok = True
5109 except:
5110 self.fail("caught unexpected exception (TCP)")
5111 if not ok:
5112 self.fail("accept() returned success when we did not expect it")
5113
Serhiy Storchaka43767632013-11-03 21:31:38 +02005114 @unittest.skipUnless(hasattr(signal, 'alarm'),
5115 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005116 def testInterruptedTimeout(self):
5117 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005118 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005119 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005120 self.serv.settimeout(5.0) # must be longer than alarm
5121 class Alarm(Exception):
5122 pass
5123 def alarm_handler(signal, frame):
5124 raise Alarm
5125 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5126 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005127 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005128 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005129 foo = self.serv.accept()
5130 except socket.timeout:
5131 self.fail("caught timeout instead of Alarm")
5132 except Alarm:
5133 pass
5134 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005135 self.fail("caught other exception instead of Alarm:"
5136 " %s(%s):\n%s" %
5137 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005138 else:
5139 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005140 finally:
5141 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005142 except Alarm:
5143 self.fail("got Alarm in wrong place")
5144 finally:
5145 # no alarm can be pending. Safe to restore old handler.
5146 signal.signal(signal.SIGALRM, old_alarm)
5147
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005148class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005149
5150 def testUDPTimeout(self):
5151 def raise_timeout(*args, **kwargs):
5152 self.serv.settimeout(1.0)
5153 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005154 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005155 "Error generating a timeout exception (UDP)")
5156
5157 def testTimeoutZero(self):
5158 ok = False
5159 try:
5160 self.serv.settimeout(0.0)
5161 foo = self.serv.recv(1024)
5162 except socket.timeout:
5163 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005164 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005165 ok = True
5166 except:
5167 self.fail("caught unexpected exception (UDP)")
5168 if not ok:
5169 self.fail("recv() returned success when we did not expect it")
5170
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005171@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5172 'UDPLITE sockets required for this test.')
5173class UDPLITETimeoutTest(SocketUDPLITETest):
5174
5175 def testUDPLITETimeout(self):
5176 def raise_timeout(*args, **kwargs):
5177 self.serv.settimeout(1.0)
5178 self.serv.recv(1024)
5179 self.assertRaises(socket.timeout, raise_timeout,
5180 "Error generating a timeout exception (UDPLITE)")
5181
5182 def testTimeoutZero(self):
5183 ok = False
5184 try:
5185 self.serv.settimeout(0.0)
5186 foo = self.serv.recv(1024)
5187 except socket.timeout:
5188 self.fail("caught timeout instead of error (UDPLITE)")
5189 except OSError:
5190 ok = True
5191 except:
5192 self.fail("caught unexpected exception (UDPLITE)")
5193 if not ok:
5194 self.fail("recv() returned success when we did not expect it")
5195
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005196class TestExceptions(unittest.TestCase):
5197
5198 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005199 self.assertTrue(issubclass(OSError, Exception))
5200 self.assertTrue(issubclass(socket.herror, OSError))
5201 self.assertTrue(issubclass(socket.gaierror, OSError))
5202 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005203
Yury Selivanovfa22b292016-10-18 16:03:52 -04005204 def test_setblocking_invalidfd(self):
5205 # Regression test for issue #28471
5206
5207 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5208 sock = socket.socket(
5209 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5210 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005211 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005212
5213 with self.assertRaises(OSError):
5214 sock.setblocking(False)
5215
5216
Serhiy Storchaka43767632013-11-03 21:31:38 +02005217@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005218class TestLinuxAbstractNamespace(unittest.TestCase):
5219
5220 UNIX_PATH_MAX = 108
5221
5222 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005223 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005224 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5225 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005226 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005227 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5228 s2.connect(s1.getsockname())
5229 with s1.accept()[0] as s3:
5230 self.assertEqual(s1.getsockname(), address)
5231 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005232
5233 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005234 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005235 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5236 s.bind(address)
5237 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005238
5239 def testNameOverflow(self):
5240 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005241 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005242 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005243
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005244 def testStrName(self):
5245 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005246 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5247 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005248 s.bind("\x00python\x00test\x00")
5249 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005250 finally:
5251 s.close()
5252
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005253 def testBytearrayName(self):
5254 # Check that an abstract name can be passed as a bytearray.
5255 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5256 s.bind(bytearray(b"\x00python\x00test\x00"))
5257 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5258
Serhiy Storchaka43767632013-11-03 21:31:38 +02005259@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005260class TestUnixDomain(unittest.TestCase):
5261
5262 def setUp(self):
5263 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5264
5265 def tearDown(self):
5266 self.sock.close()
5267
5268 def encoded(self, path):
5269 # Return the given path encoded in the file system encoding,
5270 # or skip the test if this is not possible.
5271 try:
5272 return os.fsencode(path)
5273 except UnicodeEncodeError:
5274 self.skipTest(
5275 "Pathname {0!a} cannot be represented in file "
5276 "system encoding {1!r}".format(
5277 path, sys.getfilesystemencoding()))
5278
Antoine Pitrou16374872011-12-16 15:04:12 +01005279 def bind(self, sock, path):
5280 # Bind the socket
5281 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005282 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005283 except OSError as e:
5284 if str(e) == "AF_UNIX path too long":
5285 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005286 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005287 .format(path))
5288 else:
5289 raise
5290
Antoine Pitrou495b5022017-05-02 17:20:00 +02005291 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005292 # Issue #30205 (note getsockname() can return None on OS X)
5293 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005294
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005295 def testStrAddr(self):
5296 # Test binding to and retrieving a normal string pathname.
5297 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005298 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005299 self.addCleanup(support.unlink, path)
5300 self.assertEqual(self.sock.getsockname(), path)
5301
5302 def testBytesAddr(self):
5303 # Test binding to a bytes pathname.
5304 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005305 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005306 self.addCleanup(support.unlink, path)
5307 self.assertEqual(self.sock.getsockname(), path)
5308
5309 def testSurrogateescapeBind(self):
5310 # Test binding to a valid non-ASCII pathname, with the
5311 # non-ASCII bytes supplied using surrogateescape encoding.
5312 path = os.path.abspath(support.TESTFN_UNICODE)
5313 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005314 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005315 self.addCleanup(support.unlink, path)
5316 self.assertEqual(self.sock.getsockname(), path)
5317
5318 def testUnencodableAddr(self):
5319 # Test binding to a pathname that cannot be encoded in the
5320 # file system encoding.
5321 if support.TESTFN_UNENCODABLE is None:
5322 self.skipTest("No unencodable filename available")
5323 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005324 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005325 self.addCleanup(support.unlink, path)
5326 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005327
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005328
Thomas Wouters477c8d52006-05-27 19:21:47 +00005329class BufferIOTest(SocketConnectedTest):
5330 """
5331 Test the buffer versions of socket.recv() and socket.send().
5332 """
5333 def __init__(self, methodName='runTest'):
5334 SocketConnectedTest.__init__(self, methodName=methodName)
5335
Antoine Pitrou25480782010-03-17 22:50:28 +00005336 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005337 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005338 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005339 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005340 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005341 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005342 self.assertEqual(msg, MSG)
5343
Antoine Pitrou25480782010-03-17 22:50:28 +00005344 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005345 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005346 self.serv_conn.send(buf)
5347
Antoine Pitrou25480782010-03-17 22:50:28 +00005348 def testRecvIntoBytearray(self):
5349 buf = bytearray(1024)
5350 nbytes = self.cli_conn.recv_into(buf)
5351 self.assertEqual(nbytes, len(MSG))
5352 msg = buf[:len(MSG)]
5353 self.assertEqual(msg, MSG)
5354
5355 _testRecvIntoBytearray = _testRecvIntoArray
5356
5357 def testRecvIntoMemoryview(self):
5358 buf = bytearray(1024)
5359 nbytes = self.cli_conn.recv_into(memoryview(buf))
5360 self.assertEqual(nbytes, len(MSG))
5361 msg = buf[:len(MSG)]
5362 self.assertEqual(msg, MSG)
5363
5364 _testRecvIntoMemoryview = _testRecvIntoArray
5365
5366 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005367 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005368 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005369 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005370 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005371 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005372 self.assertEqual(msg, MSG)
5373
Antoine Pitrou25480782010-03-17 22:50:28 +00005374 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005375 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005376 self.serv_conn.send(buf)
5377
Antoine Pitrou25480782010-03-17 22:50:28 +00005378 def testRecvFromIntoBytearray(self):
5379 buf = bytearray(1024)
5380 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5381 self.assertEqual(nbytes, len(MSG))
5382 msg = buf[:len(MSG)]
5383 self.assertEqual(msg, MSG)
5384
5385 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5386
5387 def testRecvFromIntoMemoryview(self):
5388 buf = bytearray(1024)
5389 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5390 self.assertEqual(nbytes, len(MSG))
5391 msg = buf[:len(MSG)]
5392 self.assertEqual(msg, MSG)
5393
5394 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5395
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005396 def testRecvFromIntoSmallBuffer(self):
5397 # See issue #20246.
5398 buf = bytearray(8)
5399 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5400
5401 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005402 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005403
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005404 def testRecvFromIntoEmptyBuffer(self):
5405 buf = bytearray()
5406 self.cli_conn.recvfrom_into(buf)
5407 self.cli_conn.recvfrom_into(buf, 0)
5408
5409 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5410
Christian Heimes043d6f62008-01-07 17:19:16 +00005411
5412TIPC_STYPE = 2000
5413TIPC_LOWER = 200
5414TIPC_UPPER = 210
5415
5416def isTipcAvailable():
5417 """Check if the TIPC module is loaded
5418
5419 The TIPC module is not loaded automatically on Ubuntu and probably
5420 other Linux distros.
5421 """
5422 if not hasattr(socket, "AF_TIPC"):
5423 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005424 try:
5425 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005426 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005427 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005428 # have not the permission to read it.
5429 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005430 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005431 for line in f:
5432 if line.startswith("tipc "):
5433 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005434 return False
5435
Serhiy Storchaka43767632013-11-03 21:31:38 +02005436@unittest.skipUnless(isTipcAvailable(),
5437 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005438class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005439 def testRDM(self):
5440 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5441 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005442 self.addCleanup(srv.close)
5443 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005444
5445 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5446 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5447 TIPC_LOWER, TIPC_UPPER)
5448 srv.bind(srvaddr)
5449
5450 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5451 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5452 cli.sendto(MSG, sendaddr)
5453
5454 msg, recvaddr = srv.recvfrom(1024)
5455
5456 self.assertEqual(cli.getsockname(), recvaddr)
5457 self.assertEqual(msg, MSG)
5458
5459
Serhiy Storchaka43767632013-11-03 21:31:38 +02005460@unittest.skipUnless(isTipcAvailable(),
5461 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005462class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005463 def __init__(self, methodName = 'runTest'):
5464 unittest.TestCase.__init__(self, methodName = methodName)
5465 ThreadableTest.__init__(self)
5466
5467 def setUp(self):
5468 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005469 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005470 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5471 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5472 TIPC_LOWER, TIPC_UPPER)
5473 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005474 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005475 self.serverExplicitReady()
5476 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005477 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005478
5479 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005480 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005481 # accept() call; sleep a little while to avoid it, otherwise
5482 # we could get an exception
5483 time.sleep(0.1)
5484 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005485 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005486 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5487 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5488 self.cli.connect(addr)
5489 self.cliaddr = self.cli.getsockname()
5490
5491 def testStream(self):
5492 msg = self.conn.recv(1024)
5493 self.assertEqual(msg, MSG)
5494 self.assertEqual(self.cliaddr, self.connaddr)
5495
5496 def _testStream(self):
5497 self.cli.send(MSG)
5498 self.cli.close()
5499
5500
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005501class ContextManagersTest(ThreadedTCPSocketTest):
5502
5503 def _testSocketClass(self):
5504 # base test
5505 with socket.socket() as sock:
5506 self.assertFalse(sock._closed)
5507 self.assertTrue(sock._closed)
5508 # close inside with block
5509 with socket.socket() as sock:
5510 sock.close()
5511 self.assertTrue(sock._closed)
5512 # exception inside with block
5513 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005514 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005515 self.assertTrue(sock._closed)
5516
5517 def testCreateConnectionBase(self):
5518 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005519 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005520 data = conn.recv(1024)
5521 conn.sendall(data)
5522
5523 def _testCreateConnectionBase(self):
5524 address = self.serv.getsockname()
5525 with socket.create_connection(address) as sock:
5526 self.assertFalse(sock._closed)
5527 sock.sendall(b'foo')
5528 self.assertEqual(sock.recv(1024), b'foo')
5529 self.assertTrue(sock._closed)
5530
5531 def testCreateConnectionClose(self):
5532 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005533 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005534 data = conn.recv(1024)
5535 conn.sendall(data)
5536
5537 def _testCreateConnectionClose(self):
5538 address = self.serv.getsockname()
5539 with socket.create_connection(address) as sock:
5540 sock.close()
5541 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005542 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005543
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005544
Victor Stinnerdaf45552013-08-28 00:53:59 +02005545class InheritanceTest(unittest.TestCase):
5546 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5547 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005548 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005549 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005550 with socket.socket(socket.AF_INET,
5551 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005552 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005553 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005554
5555 def test_default_inheritable(self):
5556 sock = socket.socket()
5557 with sock:
5558 self.assertEqual(sock.get_inheritable(), False)
5559
5560 def test_dup(self):
5561 sock = socket.socket()
5562 with sock:
5563 newsock = sock.dup()
5564 sock.close()
5565 with newsock:
5566 self.assertEqual(newsock.get_inheritable(), False)
5567
5568 def test_set_inheritable(self):
5569 sock = socket.socket()
5570 with sock:
5571 sock.set_inheritable(True)
5572 self.assertEqual(sock.get_inheritable(), True)
5573
5574 sock.set_inheritable(False)
5575 self.assertEqual(sock.get_inheritable(), False)
5576
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005577 @unittest.skipIf(fcntl is None, "need fcntl")
5578 def test_get_inheritable_cloexec(self):
5579 sock = socket.socket()
5580 with sock:
5581 fd = sock.fileno()
5582 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005583
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005584 # clear FD_CLOEXEC flag
5585 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5586 flags &= ~fcntl.FD_CLOEXEC
5587 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005588
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005589 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005590
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005591 @unittest.skipIf(fcntl is None, "need fcntl")
5592 def test_set_inheritable_cloexec(self):
5593 sock = socket.socket()
5594 with sock:
5595 fd = sock.fileno()
5596 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5597 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005598
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005599 sock.set_inheritable(True)
5600 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5601 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005602
5603
Victor Stinnerdaf45552013-08-28 00:53:59 +02005604 def test_socketpair(self):
5605 s1, s2 = socket.socketpair()
5606 self.addCleanup(s1.close)
5607 self.addCleanup(s2.close)
5608 self.assertEqual(s1.get_inheritable(), False)
5609 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005610
5611
5612@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5613 "SOCK_NONBLOCK not defined")
5614class NonblockConstantTest(unittest.TestCase):
5615 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5616 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005617 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005618 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005619 self.assertTrue(
5620 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005621 if timeout == 0:
5622 # timeout == 0: means that getblocking() must be False.
5623 self.assertFalse(s.getblocking())
5624 else:
5625 # If timeout > 0, the socket will be in a "blocking" mode
5626 # from the standpoint of the Python API. For Python socket
5627 # object, "blocking" means that operations like 'sock.recv()'
5628 # will block. Internally, file descriptors for
5629 # "blocking" Python sockets *with timeouts* are in a
5630 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5631 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5632 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005633 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005634 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005635 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005636 self.assertFalse(
5637 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005638 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005639
Charles-François Natali239bb962011-06-03 12:55:15 +02005640 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005641 def test_SOCK_NONBLOCK(self):
5642 # a lot of it seems silly and redundant, but I wanted to test that
5643 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005644 with socket.socket(socket.AF_INET,
5645 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5646 self.checkNonblock(s)
5647 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005648 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005649 s.setblocking(0)
5650 self.checkNonblock(s)
5651 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005652 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005653 s.settimeout(2.0)
5654 self.checkNonblock(s, timeout=2.0)
5655 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005656 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005657 # defaulttimeout
5658 t = socket.getdefaulttimeout()
5659 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005660 with socket.socket() as s:
5661 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005662 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005663 with socket.socket() as s:
5664 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005665 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005666 with socket.socket() as s:
5667 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005668 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005669 with socket.socket() as s:
5670 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005671 socket.setdefaulttimeout(t)
5672
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005673
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005674@unittest.skipUnless(os.name == "nt", "Windows specific")
5675@unittest.skipUnless(multiprocessing, "need multiprocessing")
5676class TestSocketSharing(SocketTCPTest):
5677 # This must be classmethod and not staticmethod or multiprocessing
5678 # won't be able to bootstrap it.
5679 @classmethod
5680 def remoteProcessServer(cls, q):
5681 # Recreate socket from shared data
5682 sdata = q.get()
5683 message = q.get()
5684
5685 s = socket.fromshare(sdata)
5686 s2, c = s.accept()
5687
5688 # Send the message
5689 s2.sendall(message)
5690 s2.close()
5691 s.close()
5692
5693 def testShare(self):
5694 # Transfer the listening server socket to another process
5695 # and service it from there.
5696
5697 # Create process:
5698 q = multiprocessing.Queue()
5699 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5700 p.start()
5701
5702 # Get the shared socket data
5703 data = self.serv.share(p.pid)
5704
5705 # Pass the shared socket to the other process
5706 addr = self.serv.getsockname()
5707 self.serv.close()
5708 q.put(data)
5709
5710 # The data that the server will send us
5711 message = b"slapmahfro"
5712 q.put(message)
5713
5714 # Connect
5715 s = socket.create_connection(addr)
5716 # listen for the data
5717 m = []
5718 while True:
5719 data = s.recv(100)
5720 if not data:
5721 break
5722 m.append(data)
5723 s.close()
5724 received = b"".join(m)
5725 self.assertEqual(received, message)
5726 p.join()
5727
5728 def testShareLength(self):
5729 data = self.serv.share(os.getpid())
5730 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5731 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5732
5733 def compareSockets(self, org, other):
5734 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005735 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005736 self.assertEqual(org.gettimeout(), None)
5737 self.assertEqual(org.gettimeout(), other.gettimeout())
5738
5739 self.assertEqual(org.family, other.family)
5740 self.assertEqual(org.type, other.type)
5741 # If the user specified "0" for proto, then
5742 # internally windows will have picked the correct value.
5743 # Python introspection on the socket however will still return
5744 # 0. For the shared socket, the python value is recreated
5745 # from the actual value, so it may not compare correctly.
5746 if org.proto != 0:
5747 self.assertEqual(org.proto, other.proto)
5748
5749 def testShareLocal(self):
5750 data = self.serv.share(os.getpid())
5751 s = socket.fromshare(data)
5752 try:
5753 self.compareSockets(self.serv, s)
5754 finally:
5755 s.close()
5756
5757 def testTypes(self):
5758 families = [socket.AF_INET, socket.AF_INET6]
5759 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5760 for f in families:
5761 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005762 try:
5763 source = socket.socket(f, t)
5764 except OSError:
5765 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005766 try:
5767 data = source.share(os.getpid())
5768 shared = socket.fromshare(data)
5769 try:
5770 self.compareSockets(source, shared)
5771 finally:
5772 shared.close()
5773 finally:
5774 source.close()
5775
5776
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005777class SendfileUsingSendTest(ThreadedTCPSocketTest):
5778 """
5779 Test the send() implementation of socket.sendfile().
5780 """
5781
Victor Stinner8c663fd2017-11-08 14:44:44 -08005782 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005783 BUFSIZE = 8192
5784 FILEDATA = b""
Paul Monson52c8c092019-07-14 01:30:28 -07005785 # bpo-37553: This is taking longer than 2 seconds on Windows ARM32 buildbot
5786 TIMEOUT = 10 if sys.platform == 'win32' and platform.machine() == 'ARM' else 2
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005787
5788 @classmethod
5789 def setUpClass(cls):
5790 def chunks(total, step):
5791 assert total >= step
5792 while total > step:
5793 yield step
5794 total -= step
5795 if total:
5796 yield total
5797
5798 chunk = b"".join([random.choice(string.ascii_letters).encode()
5799 for i in range(cls.BUFSIZE)])
5800 with open(support.TESTFN, 'wb') as f:
5801 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5802 f.write(chunk)
5803 with open(support.TESTFN, 'rb') as f:
5804 cls.FILEDATA = f.read()
5805 assert len(cls.FILEDATA) == cls.FILESIZE
5806
5807 @classmethod
5808 def tearDownClass(cls):
5809 support.unlink(support.TESTFN)
5810
5811 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005812 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005813 conn, addr = self.serv.accept()
5814 conn.settimeout(self.TIMEOUT)
5815 self.addCleanup(conn.close)
5816 return conn
5817
5818 def recv_data(self, conn):
5819 received = []
5820 while True:
5821 chunk = conn.recv(self.BUFSIZE)
5822 if not chunk:
5823 break
5824 received.append(chunk)
5825 return b''.join(received)
5826
5827 def meth_from_sock(self, sock):
5828 # Depending on the mixin class being run return either send()
5829 # or sendfile() method implementation.
5830 return getattr(sock, "_sendfile_use_send")
5831
5832 # regular file
5833
5834 def _testRegularFile(self):
5835 address = self.serv.getsockname()
5836 file = open(support.TESTFN, 'rb')
5837 with socket.create_connection(address) as sock, file as file:
5838 meth = self.meth_from_sock(sock)
5839 sent = meth(file)
5840 self.assertEqual(sent, self.FILESIZE)
5841 self.assertEqual(file.tell(), self.FILESIZE)
5842
5843 def testRegularFile(self):
5844 conn = self.accept_conn()
5845 data = self.recv_data(conn)
5846 self.assertEqual(len(data), self.FILESIZE)
5847 self.assertEqual(data, self.FILEDATA)
5848
5849 # non regular file
5850
5851 def _testNonRegularFile(self):
5852 address = self.serv.getsockname()
5853 file = io.BytesIO(self.FILEDATA)
5854 with socket.create_connection(address) as sock, file as file:
5855 sent = sock.sendfile(file)
5856 self.assertEqual(sent, self.FILESIZE)
5857 self.assertEqual(file.tell(), self.FILESIZE)
5858 self.assertRaises(socket._GiveupOnSendfile,
5859 sock._sendfile_use_sendfile, file)
5860
5861 def testNonRegularFile(self):
5862 conn = self.accept_conn()
5863 data = self.recv_data(conn)
5864 self.assertEqual(len(data), self.FILESIZE)
5865 self.assertEqual(data, self.FILEDATA)
5866
5867 # empty file
5868
5869 def _testEmptyFileSend(self):
5870 address = self.serv.getsockname()
5871 filename = support.TESTFN + "2"
5872 with open(filename, 'wb'):
5873 self.addCleanup(support.unlink, filename)
5874 file = open(filename, 'rb')
5875 with socket.create_connection(address) as sock, file as file:
5876 meth = self.meth_from_sock(sock)
5877 sent = meth(file)
5878 self.assertEqual(sent, 0)
5879 self.assertEqual(file.tell(), 0)
5880
5881 def testEmptyFileSend(self):
5882 conn = self.accept_conn()
5883 data = self.recv_data(conn)
5884 self.assertEqual(data, b"")
5885
5886 # offset
5887
5888 def _testOffset(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, offset=5000)
5894 self.assertEqual(sent, self.FILESIZE - 5000)
5895 self.assertEqual(file.tell(), self.FILESIZE)
5896
5897 def testOffset(self):
5898 conn = self.accept_conn()
5899 data = self.recv_data(conn)
5900 self.assertEqual(len(data), self.FILESIZE - 5000)
5901 self.assertEqual(data, self.FILEDATA[5000:])
5902
5903 # count
5904
5905 def _testCount(self):
5906 address = self.serv.getsockname()
5907 file = open(support.TESTFN, 'rb')
5908 with socket.create_connection(address, timeout=2) as sock, file as file:
5909 count = 5000007
5910 meth = self.meth_from_sock(sock)
5911 sent = meth(file, count=count)
5912 self.assertEqual(sent, count)
5913 self.assertEqual(file.tell(), count)
5914
5915 def testCount(self):
5916 count = 5000007
5917 conn = self.accept_conn()
5918 data = self.recv_data(conn)
5919 self.assertEqual(len(data), count)
5920 self.assertEqual(data, self.FILEDATA[:count])
5921
5922 # count small
5923
5924 def _testCountSmall(self):
5925 address = self.serv.getsockname()
5926 file = open(support.TESTFN, 'rb')
5927 with socket.create_connection(address, timeout=2) as sock, file as file:
5928 count = 1
5929 meth = self.meth_from_sock(sock)
5930 sent = meth(file, count=count)
5931 self.assertEqual(sent, count)
5932 self.assertEqual(file.tell(), count)
5933
5934 def testCountSmall(self):
5935 count = 1
5936 conn = self.accept_conn()
5937 data = self.recv_data(conn)
5938 self.assertEqual(len(data), count)
5939 self.assertEqual(data, self.FILEDATA[:count])
5940
5941 # count + offset
5942
5943 def _testCountWithOffset(self):
5944 address = self.serv.getsockname()
5945 file = open(support.TESTFN, 'rb')
5946 with socket.create_connection(address, timeout=2) as sock, file as file:
5947 count = 100007
5948 meth = self.meth_from_sock(sock)
5949 sent = meth(file, offset=2007, count=count)
5950 self.assertEqual(sent, count)
5951 self.assertEqual(file.tell(), count + 2007)
5952
5953 def testCountWithOffset(self):
5954 count = 100007
5955 conn = self.accept_conn()
5956 data = self.recv_data(conn)
5957 self.assertEqual(len(data), count)
5958 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5959
5960 # non blocking sockets are not supposed to work
5961
5962 def _testNonBlocking(self):
5963 address = self.serv.getsockname()
5964 file = open(support.TESTFN, 'rb')
5965 with socket.create_connection(address) as sock, file as file:
5966 sock.setblocking(False)
5967 meth = self.meth_from_sock(sock)
5968 self.assertRaises(ValueError, meth, file)
5969 self.assertRaises(ValueError, sock.sendfile, file)
5970
5971 def testNonBlocking(self):
5972 conn = self.accept_conn()
5973 if conn.recv(8192):
5974 self.fail('was not supposed to receive any data')
5975
5976 # timeout (non-triggered)
5977
5978 def _testWithTimeout(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 meth = self.meth_from_sock(sock)
5983 sent = meth(file)
5984 self.assertEqual(sent, self.FILESIZE)
5985
5986 def testWithTimeout(self):
5987 conn = self.accept_conn()
5988 data = self.recv_data(conn)
5989 self.assertEqual(len(data), self.FILESIZE)
5990 self.assertEqual(data, self.FILEDATA)
5991
5992 # timeout (triggered)
5993
5994 def _testWithTimeoutTriggeredSend(self):
5995 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00005996 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005997 with socket.create_connection(address) as sock:
5998 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00005999 meth = self.meth_from_sock(sock)
6000 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006001
6002 def testWithTimeoutTriggeredSend(self):
6003 conn = self.accept_conn()
6004 conn.recv(88192)
6005
6006 # errors
6007
6008 def _test_errors(self):
6009 pass
6010
6011 def test_errors(self):
6012 with open(support.TESTFN, 'rb') as file:
6013 with socket.socket(type=socket.SOCK_DGRAM) as s:
6014 meth = self.meth_from_sock(s)
6015 self.assertRaisesRegex(
6016 ValueError, "SOCK_STREAM", meth, file)
6017 with open(support.TESTFN, 'rt') as file:
6018 with socket.socket() as s:
6019 meth = self.meth_from_sock(s)
6020 self.assertRaisesRegex(
6021 ValueError, "binary mode", meth, file)
6022 with open(support.TESTFN, 'rb') as file:
6023 with socket.socket() as s:
6024 meth = self.meth_from_sock(s)
6025 self.assertRaisesRegex(TypeError, "positive integer",
6026 meth, file, count='2')
6027 self.assertRaisesRegex(TypeError, "positive integer",
6028 meth, file, count=0.1)
6029 self.assertRaisesRegex(ValueError, "positive integer",
6030 meth, file, count=0)
6031 self.assertRaisesRegex(ValueError, "positive integer",
6032 meth, file, count=-1)
6033
6034
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006035@unittest.skipUnless(hasattr(os, "sendfile"),
6036 'os.sendfile() required for this test.')
6037class SendfileUsingSendfileTest(SendfileUsingSendTest):
6038 """
6039 Test the sendfile() implementation of socket.sendfile().
6040 """
6041 def meth_from_sock(self, sock):
6042 return getattr(sock, "_sendfile_use_sendfile")
6043
Christian Heimes48371412016-09-06 00:37:46 +02006044
6045@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006046class LinuxKernelCryptoAPI(unittest.TestCase):
6047 # tests for AF_ALG
6048 def create_alg(self, typ, name):
6049 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006050 try:
6051 sock.bind((typ, name))
6052 except FileNotFoundError as e:
6053 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006054 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006055 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006056 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006057 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006058
Victor Stinner86afc1f2017-11-30 13:58:43 +01006059 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6060 # at least on ppc64le architecture
6061 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006062 def test_sha256(self):
6063 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6064 "177a9cb410ff61f20015ad")
6065 with self.create_alg('hash', 'sha256') as algo:
6066 op, _ = algo.accept()
6067 with op:
6068 op.sendall(b"abc")
6069 self.assertEqual(op.recv(512), expected)
6070
6071 op, _ = algo.accept()
6072 with op:
6073 op.send(b'a', socket.MSG_MORE)
6074 op.send(b'b', socket.MSG_MORE)
6075 op.send(b'c', socket.MSG_MORE)
6076 op.send(b'')
6077 self.assertEqual(op.recv(512), expected)
6078
6079 def test_hmac_sha1(self):
6080 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6081 with self.create_alg('hash', 'hmac(sha1)') as algo:
6082 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6083 op, _ = algo.accept()
6084 with op:
6085 op.sendall(b"what do ya want for nothing?")
6086 self.assertEqual(op.recv(512), expected)
6087
Christian Heimese084f842016-09-11 20:11:30 +02006088 # Although it should work with 3.19 and newer the test blocks on
6089 # Ubuntu 15.10 with Kernel 4.2.0-19.
6090 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006091 def test_aes_cbc(self):
6092 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6093 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6094 msg = b"Single block msg"
6095 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6096 msglen = len(msg)
6097 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6098 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6099 op, _ = algo.accept()
6100 with op:
6101 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6102 flags=socket.MSG_MORE)
6103 op.sendall(msg)
6104 self.assertEqual(op.recv(msglen), ciphertext)
6105
6106 op, _ = algo.accept()
6107 with op:
6108 op.sendmsg_afalg([ciphertext],
6109 op=socket.ALG_OP_DECRYPT, iv=iv)
6110 self.assertEqual(op.recv(msglen), msg)
6111
6112 # long message
6113 multiplier = 1024
6114 longmsg = [msg] * multiplier
6115 op, _ = algo.accept()
6116 with op:
6117 op.sendmsg_afalg(longmsg,
6118 op=socket.ALG_OP_ENCRYPT, iv=iv)
6119 enc = op.recv(msglen * multiplier)
6120 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006121 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006122
6123 op, _ = algo.accept()
6124 with op:
6125 op.sendmsg_afalg([enc],
6126 op=socket.ALG_OP_DECRYPT, iv=iv)
6127 dec = op.recv(msglen * multiplier)
6128 self.assertEqual(len(dec), msglen * multiplier)
6129 self.assertEqual(dec, msg * multiplier)
6130
matejcik9764c152017-02-16 14:41:31 +01006131 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006132 def test_aead_aes_gcm(self):
6133 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6134 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6135 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6136 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6137 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6138 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6139
6140 taglen = len(expected_tag)
6141 assoclen = len(assoc)
6142
6143 with self.create_alg('aead', 'gcm(aes)') as algo:
6144 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6145 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6146 None, taglen)
6147
6148 # send assoc, plain and tag buffer in separate steps
6149 op, _ = algo.accept()
6150 with op:
6151 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6152 assoclen=assoclen, flags=socket.MSG_MORE)
6153 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006154 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006155 res = op.recv(assoclen + len(plain) + taglen)
6156 self.assertEqual(expected_ct, res[assoclen:-taglen])
6157 self.assertEqual(expected_tag, res[-taglen:])
6158
6159 # now with msg
6160 op, _ = algo.accept()
6161 with op:
matejcik9764c152017-02-16 14:41:31 +01006162 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006163 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6164 assoclen=assoclen)
6165 res = op.recv(assoclen + len(plain) + taglen)
6166 self.assertEqual(expected_ct, res[assoclen:-taglen])
6167 self.assertEqual(expected_tag, res[-taglen:])
6168
6169 # create anc data manually
6170 pack_uint32 = struct.Struct('I').pack
6171 op, _ = algo.accept()
6172 with op:
matejcik9764c152017-02-16 14:41:31 +01006173 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006174 op.sendmsg(
6175 [msg],
6176 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6177 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6178 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6179 )
6180 )
matejcik9764c152017-02-16 14:41:31 +01006181 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006182 self.assertEqual(expected_ct, res[assoclen:-taglen])
6183 self.assertEqual(expected_tag, res[-taglen:])
6184
6185 # decrypt and verify
6186 op, _ = algo.accept()
6187 with op:
6188 msg = assoc + expected_ct + expected_tag
6189 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6190 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006191 res = op.recv(len(msg) - taglen)
6192 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006193
Christian Heimese084f842016-09-11 20:11:30 +02006194 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006195 def test_drbg_pr_sha256(self):
6196 # deterministic random bit generator, prediction resistance, sha256
6197 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6198 extra_seed = os.urandom(32)
6199 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6200 op, _ = algo.accept()
6201 with op:
6202 rn = op.recv(32)
6203 self.assertEqual(len(rn), 32)
6204
6205 def test_sendmsg_afalg_args(self):
6206 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006207 with sock:
6208 with self.assertRaises(TypeError):
6209 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006210
Christian Heimes02b30352016-09-11 19:49:56 +02006211 with self.assertRaises(TypeError):
6212 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006213
Christian Heimes02b30352016-09-11 19:49:56 +02006214 with self.assertRaises(TypeError):
6215 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006216
Christian Heimes02b30352016-09-11 19:49:56 +02006217 with self.assertRaises(TypeError):
6218 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006219
Christian Heimes02b30352016-09-11 19:49:56 +02006220 with self.assertRaises(TypeError):
6221 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6222
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006223 def test_length_restriction(self):
6224 # bpo-35050, off-by-one error in length check
6225 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6226 self.addCleanup(sock.close)
6227
6228 # salg_type[14]
6229 with self.assertRaises(FileNotFoundError):
6230 sock.bind(("t" * 13, "name"))
6231 with self.assertRaisesRegex(ValueError, "type too long"):
6232 sock.bind(("t" * 14, "name"))
6233
6234 # salg_name[64]
6235 with self.assertRaises(FileNotFoundError):
6236 sock.bind(("type", "n" * 63))
6237 with self.assertRaisesRegex(ValueError, "name too long"):
6238 sock.bind(("type", "n" * 64))
6239
6240
animalize19e7d482018-02-27 02:10:36 +08006241@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6242class TestMSWindowsTCPFlags(unittest.TestCase):
6243 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006244 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006245 'TCP_MAXSEG',
6246 'TCP_NODELAY',
6247 # available starting with Windows 10 1607
6248 'TCP_FASTOPEN',
6249 # available starting with Windows 10 1703
6250 'TCP_KEEPCNT',
6251 # available starting with Windows 10 1709
6252 'TCP_KEEPIDLE',
6253 'TCP_KEEPINTVL'
6254 }
6255
6256 def test_new_tcp_flags(self):
6257 provided = [s for s in dir(socket) if s.startswith('TCP')]
6258 unknown = [s for s in provided if s not in self.knownTCPFlags]
6259
6260 self.assertEqual([], unknown,
6261 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006262
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006263
6264class CreateServerTest(unittest.TestCase):
6265
6266 def test_address(self):
6267 port = support.find_unused_port()
6268 with socket.create_server(("127.0.0.1", port)) as sock:
6269 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6270 self.assertEqual(sock.getsockname()[1], port)
6271 if support.IPV6_ENABLED:
6272 with socket.create_server(("::1", port),
6273 family=socket.AF_INET6) as sock:
6274 self.assertEqual(sock.getsockname()[0], "::1")
6275 self.assertEqual(sock.getsockname()[1], port)
6276
6277 def test_family_and_type(self):
6278 with socket.create_server(("127.0.0.1", 0)) as sock:
6279 self.assertEqual(sock.family, socket.AF_INET)
6280 self.assertEqual(sock.type, socket.SOCK_STREAM)
6281 if support.IPV6_ENABLED:
6282 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6283 self.assertEqual(s.family, socket.AF_INET6)
6284 self.assertEqual(sock.type, socket.SOCK_STREAM)
6285
6286 def test_reuse_port(self):
6287 if not hasattr(socket, "SO_REUSEPORT"):
6288 with self.assertRaises(ValueError):
6289 socket.create_server(("localhost", 0), reuse_port=True)
6290 else:
6291 with socket.create_server(("localhost", 0)) as sock:
6292 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6293 self.assertEqual(opt, 0)
6294 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6295 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6296 self.assertNotEqual(opt, 0)
6297
6298 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6299 not hasattr(_socket, 'IPV6_V6ONLY'),
6300 "IPV6_V6ONLY option not supported")
6301 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6302 def test_ipv6_only_default(self):
6303 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6304 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6305
6306 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6307 "dualstack_ipv6 not supported")
6308 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6309 def test_dualstack_ipv6_family(self):
6310 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6311 dualstack_ipv6=True) as sock:
6312 self.assertEqual(sock.family, socket.AF_INET6)
6313
6314
6315class CreateServerFunctionalTest(unittest.TestCase):
6316 timeout = 3
6317
6318 def setUp(self):
6319 self.thread = None
6320
6321 def tearDown(self):
6322 if self.thread is not None:
6323 self.thread.join(self.timeout)
6324
6325 def echo_server(self, sock):
6326 def run(sock):
6327 with sock:
6328 conn, _ = sock.accept()
6329 with conn:
6330 event.wait(self.timeout)
6331 msg = conn.recv(1024)
6332 if not msg:
6333 return
6334 conn.sendall(msg)
6335
6336 event = threading.Event()
6337 sock.settimeout(self.timeout)
6338 self.thread = threading.Thread(target=run, args=(sock, ))
6339 self.thread.start()
6340 event.set()
6341
6342 def echo_client(self, addr, family):
6343 with socket.socket(family=family) as sock:
6344 sock.settimeout(self.timeout)
6345 sock.connect(addr)
6346 sock.sendall(b'foo')
6347 self.assertEqual(sock.recv(1024), b'foo')
6348
6349 def test_tcp4(self):
6350 port = support.find_unused_port()
6351 with socket.create_server(("", port)) as sock:
6352 self.echo_server(sock)
6353 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6354
6355 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6356 def test_tcp6(self):
6357 port = support.find_unused_port()
6358 with socket.create_server(("", port),
6359 family=socket.AF_INET6) as sock:
6360 self.echo_server(sock)
6361 self.echo_client(("::1", port), socket.AF_INET6)
6362
6363 # --- dual stack tests
6364
6365 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6366 "dualstack_ipv6 not supported")
6367 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6368 def test_dual_stack_client_v4(self):
6369 port = support.find_unused_port()
6370 with socket.create_server(("", port), family=socket.AF_INET6,
6371 dualstack_ipv6=True) as sock:
6372 self.echo_server(sock)
6373 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6374
6375 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6376 "dualstack_ipv6 not supported")
6377 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6378 def test_dual_stack_client_v6(self):
6379 port = support.find_unused_port()
6380 with socket.create_server(("", port), family=socket.AF_INET6,
6381 dualstack_ipv6=True) as sock:
6382 self.echo_server(sock)
6383 self.echo_client(("::1", port), socket.AF_INET6)
6384
6385
Guido van Rossumb995eb72002-07-31 16:08:40 +00006386def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006387 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006388 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
6389 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006390
6391 tests.extend([
6392 NonBlockingTCPTests,
6393 FileObjectClassTestCase,
6394 UnbufferedFileObjectClassTestCase,
6395 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006396 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006397 UnicodeReadFileObjectClassTestCase,
6398 UnicodeWriteFileObjectClassTestCase,
6399 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006400 NetworkConnectionNoServer,
6401 NetworkConnectionAttributesTest,
6402 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006403 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006404 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006405 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006406 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006407 tests.append(BasicSocketPairTest)
6408 tests.append(TestUnixDomain)
6409 tests.append(TestLinuxAbstractNamespace)
6410 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006411 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006412 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006413 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006414 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006415 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006416 BasicVSOCKTest,
6417 ThreadedVSOCKSocketStreamTest,
6418 ])
6419 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006420 CmsgMacroTests,
6421 SendmsgUDPTest,
6422 RecvmsgUDPTest,
6423 RecvmsgIntoUDPTest,
6424 SendmsgUDP6Test,
6425 RecvmsgUDP6Test,
6426 RecvmsgRFC3542AncillaryUDP6Test,
6427 RecvmsgIntoRFC3542AncillaryUDP6Test,
6428 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006429 SendmsgUDPLITETest,
6430 RecvmsgUDPLITETest,
6431 RecvmsgIntoUDPLITETest,
6432 SendmsgUDPLITE6Test,
6433 RecvmsgUDPLITE6Test,
6434 RecvmsgRFC3542AncillaryUDPLITE6Test,
6435 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6436 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006437 SendmsgTCPTest,
6438 RecvmsgTCPTest,
6439 RecvmsgIntoTCPTest,
6440 SendmsgSCTPStreamTest,
6441 RecvmsgSCTPStreamTest,
6442 RecvmsgIntoSCTPStreamTest,
6443 SendmsgUnixStreamTest,
6444 RecvmsgUnixStreamTest,
6445 RecvmsgIntoUnixStreamTest,
6446 RecvmsgSCMRightsStreamTest,
6447 RecvmsgIntoSCMRightsStreamTest,
6448 # These are slow when setitimer() is not available
6449 InterruptedRecvTimeoutTest,
6450 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006451 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006452 SendfileUsingSendTest,
6453 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006454 ])
animalize19e7d482018-02-27 02:10:36 +08006455 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006456
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006457 thread_info = support.threading_setup()
6458 support.run_unittest(*tests)
6459 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006460
6461if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006462 test_main()