blob: 50094de58bf1c99176ff82829941aab4fab23c51 [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
Charles-François Natali47413c12011-10-06 19:47:44 +02001911 def testCreateSocket(self):
1912 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1913 pass
1914
Charles-François Natali773e42d2013-02-05 19:42:01 +01001915 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1916 'socket.CAN_BCM required for this test.')
1917 def testCreateBCMSocket(self):
1918 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1919 pass
1920
Charles-François Natali47413c12011-10-06 19:47:44 +02001921 def testBindAny(self):
1922 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1923 s.bind(('', ))
1924
1925 def testTooLongInterfaceName(self):
1926 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1927 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001928 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001929 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001930
1931 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1932 'socket.CAN_RAW_LOOPBACK required for this test.')
1933 def testLoopback(self):
1934 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1935 for loopback in (0, 1):
1936 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1937 loopback)
1938 self.assertEqual(loopback,
1939 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1940
1941 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1942 'socket.CAN_RAW_FILTER required for this test.')
1943 def testFilter(self):
1944 can_id, can_mask = 0x200, 0x700
1945 can_filter = struct.pack("=II", can_id, can_mask)
1946 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1947 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1948 self.assertEqual(can_filter,
1949 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001950 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001951
1952
1953@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001954class CANTest(ThreadedCANSocketTest):
1955
Charles-François Natali47413c12011-10-06 19:47:44 +02001956 def __init__(self, methodName='runTest'):
1957 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1958
1959 @classmethod
1960 def build_can_frame(cls, can_id, data):
1961 """Build a CAN frame."""
1962 can_dlc = len(data)
1963 data = data.ljust(8, b'\x00')
1964 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1965
1966 @classmethod
1967 def dissect_can_frame(cls, frame):
1968 """Dissect a CAN frame."""
1969 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1970 return (can_id, can_dlc, data[:can_dlc])
1971
1972 def testSendFrame(self):
1973 cf, addr = self.s.recvfrom(self.bufsize)
1974 self.assertEqual(self.cf, cf)
1975 self.assertEqual(addr[0], self.interface)
1976 self.assertEqual(addr[1], socket.AF_CAN)
1977
1978 def _testSendFrame(self):
1979 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1980 self.cli.send(self.cf)
1981
1982 def testSendMaxFrame(self):
1983 cf, addr = self.s.recvfrom(self.bufsize)
1984 self.assertEqual(self.cf, cf)
1985
1986 def _testSendMaxFrame(self):
1987 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1988 self.cli.send(self.cf)
1989
1990 def testSendMultiFrames(self):
1991 cf, addr = self.s.recvfrom(self.bufsize)
1992 self.assertEqual(self.cf1, cf)
1993
1994 cf, addr = self.s.recvfrom(self.bufsize)
1995 self.assertEqual(self.cf2, cf)
1996
1997 def _testSendMultiFrames(self):
1998 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1999 self.cli.send(self.cf1)
2000
2001 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
2002 self.cli.send(self.cf2)
2003
Charles-François Natali773e42d2013-02-05 19:42:01 +01002004 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2005 'socket.CAN_BCM required for this test.')
2006 def _testBCM(self):
2007 cf, addr = self.cli.recvfrom(self.bufsize)
2008 self.assertEqual(self.cf, cf)
2009 can_id, can_dlc, data = self.dissect_can_frame(cf)
2010 self.assertEqual(self.can_id, can_id)
2011 self.assertEqual(self.data, data)
2012
2013 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
2014 'socket.CAN_BCM required for this test.')
2015 def testBCM(self):
2016 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
2017 self.addCleanup(bcm.close)
2018 bcm.connect((self.interface,))
2019 self.can_id = 0x123
2020 self.data = bytes([0xc0, 0xff, 0xee])
2021 self.cf = self.build_can_frame(self.can_id, self.data)
2022 opcode = socket.CAN_BCM_TX_SEND
2023 flags = 0
2024 count = 0
2025 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2026 bcm_can_id = 0x0222
2027 nframes = 1
2028 assert len(self.cf) == 16
2029 header = struct.pack(self.bcm_cmd_msg_fmt,
2030 opcode,
2031 flags,
2032 count,
2033 ival1_seconds,
2034 ival1_usec,
2035 ival2_seconds,
2036 ival2_usec,
2037 bcm_can_id,
2038 nframes,
2039 )
2040 header_plus_frame = header + self.cf
2041 bytes_sent = bcm.send(header_plus_frame)
2042 self.assertEqual(bytes_sent, len(header_plus_frame))
2043
Charles-François Natali47413c12011-10-06 19:47:44 +02002044
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002045@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2046class ISOTPTest(unittest.TestCase):
2047
2048 def __init__(self, *args, **kwargs):
2049 super().__init__(*args, **kwargs)
2050 self.interface = "vcan0"
2051
2052 def testCrucialConstants(self):
2053 socket.AF_CAN
2054 socket.PF_CAN
2055 socket.CAN_ISOTP
2056 socket.SOCK_DGRAM
2057
2058 def testCreateSocket(self):
2059 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2060 pass
2061
2062 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2063 'socket.CAN_ISOTP required for this test.')
2064 def testCreateISOTPSocket(self):
2065 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2066 pass
2067
2068 def testTooLongInterfaceName(self):
2069 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2070 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2071 with self.assertRaisesRegex(OSError, 'interface name too long'):
2072 s.bind(('x' * 1024, 1, 2))
2073
2074 def testBind(self):
2075 try:
2076 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2077 addr = self.interface, 0x123, 0x456
2078 s.bind(addr)
2079 self.assertEqual(s.getsockname(), addr)
2080 except OSError as e:
2081 if e.errno == errno.ENODEV:
2082 self.skipTest('network interface `%s` does not exist' %
2083 self.interface)
2084 else:
2085 raise
2086
2087
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002088@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2089class BasicRDSTest(unittest.TestCase):
2090
2091 def testCrucialConstants(self):
2092 socket.AF_RDS
2093 socket.PF_RDS
2094
2095 def testCreateSocket(self):
2096 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2097 pass
2098
2099 def testSocketBufferSize(self):
2100 bufsize = 16384
2101 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2102 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2103 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2104
2105
2106@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002107class RDSTest(ThreadedRDSSocketTest):
2108
2109 def __init__(self, methodName='runTest'):
2110 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2111
Charles-François Natali240c55f2011-11-10 20:33:36 +01002112 def setUp(self):
2113 super().setUp()
2114 self.evt = threading.Event()
2115
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002116 def testSendAndRecv(self):
2117 data, addr = self.serv.recvfrom(self.bufsize)
2118 self.assertEqual(self.data, data)
2119 self.assertEqual(self.cli_addr, addr)
2120
2121 def _testSendAndRecv(self):
2122 self.data = b'spam'
2123 self.cli.sendto(self.data, 0, (HOST, self.port))
2124
2125 def testPeek(self):
2126 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2127 self.assertEqual(self.data, data)
2128 data, addr = self.serv.recvfrom(self.bufsize)
2129 self.assertEqual(self.data, data)
2130
2131 def _testPeek(self):
2132 self.data = b'spam'
2133 self.cli.sendto(self.data, 0, (HOST, self.port))
2134
2135 @requireAttrs(socket.socket, 'recvmsg')
2136 def testSendAndRecvMsg(self):
2137 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2138 self.assertEqual(self.data, data)
2139
2140 @requireAttrs(socket.socket, 'sendmsg')
2141 def _testSendAndRecvMsg(self):
2142 self.data = b'hello ' * 10
2143 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2144
2145 def testSendAndRecvMulti(self):
2146 data, addr = self.serv.recvfrom(self.bufsize)
2147 self.assertEqual(self.data1, data)
2148
2149 data, addr = self.serv.recvfrom(self.bufsize)
2150 self.assertEqual(self.data2, data)
2151
2152 def _testSendAndRecvMulti(self):
2153 self.data1 = b'bacon'
2154 self.cli.sendto(self.data1, 0, (HOST, self.port))
2155
2156 self.data2 = b'egg'
2157 self.cli.sendto(self.data2, 0, (HOST, self.port))
2158
2159 def testSelect(self):
2160 r, w, x = select.select([self.serv], [], [], 3.0)
2161 self.assertIn(self.serv, r)
2162 data, addr = self.serv.recvfrom(self.bufsize)
2163 self.assertEqual(self.data, data)
2164
2165 def _testSelect(self):
2166 self.data = b'select'
2167 self.cli.sendto(self.data, 0, (HOST, self.port))
2168
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002169@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2170 'QIPCRTR sockets required for this test.')
2171class BasicQIPCRTRTest(unittest.TestCase):
2172
2173 def testCrucialConstants(self):
2174 socket.AF_QIPCRTR
2175
2176 def testCreateSocket(self):
2177 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2178 pass
2179
2180 def testUnbound(self):
2181 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2182 self.assertEqual(s.getsockname()[1], 0)
2183
2184 def testBindSock(self):
2185 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2186 support.bind_port(s, host=s.getsockname()[0])
2187 self.assertNotEqual(s.getsockname()[1], 0)
2188
2189 def testInvalidBindSock(self):
2190 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2191 self.assertRaises(OSError, support.bind_port, s, host=-2)
2192
2193 def testAutoBindSock(self):
2194 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2195 s.connect((123, 123))
2196 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002197
caaveryeffc12f2017-09-06 18:18:10 -04002198@unittest.skipIf(fcntl is None, "need fcntl")
2199@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2200 'VSOCK sockets required for this test.')
2201class BasicVSOCKTest(unittest.TestCase):
2202
2203 def testCrucialConstants(self):
2204 socket.AF_VSOCK
2205
2206 def testVSOCKConstants(self):
2207 socket.SO_VM_SOCKETS_BUFFER_SIZE
2208 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2209 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2210 socket.VMADDR_CID_ANY
2211 socket.VMADDR_PORT_ANY
2212 socket.VMADDR_CID_HOST
2213 socket.VM_SOCKETS_INVALID_VERSION
2214 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2215
2216 def testCreateSocket(self):
2217 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2218 pass
2219
2220 def testSocketBufferSize(self):
2221 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2222 orig_max = s.getsockopt(socket.AF_VSOCK,
2223 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2224 orig = s.getsockopt(socket.AF_VSOCK,
2225 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2226 orig_min = s.getsockopt(socket.AF_VSOCK,
2227 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2228
2229 s.setsockopt(socket.AF_VSOCK,
2230 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2231 s.setsockopt(socket.AF_VSOCK,
2232 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2233 s.setsockopt(socket.AF_VSOCK,
2234 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2235
2236 self.assertEqual(orig_max * 2,
2237 s.getsockopt(socket.AF_VSOCK,
2238 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2239 self.assertEqual(orig * 2,
2240 s.getsockopt(socket.AF_VSOCK,
2241 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2242 self.assertEqual(orig_min * 2,
2243 s.getsockopt(socket.AF_VSOCK,
2244 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2245
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002246
Guido van Rossum24e4af82002-06-12 19:18:08 +00002247class BasicTCPTest(SocketConnectedTest):
2248
2249 def __init__(self, methodName='runTest'):
2250 SocketConnectedTest.__init__(self, methodName=methodName)
2251
2252 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002253 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002254 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002255 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002256
2257 def _testRecv(self):
2258 self.serv_conn.send(MSG)
2259
2260 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002261 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002262 seg1 = self.cli_conn.recv(len(MSG) - 3)
2263 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002264 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002265 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002266
2267 def _testOverFlowRecv(self):
2268 self.serv_conn.send(MSG)
2269
2270 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002271 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002272 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002273 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002274
2275 def _testRecvFrom(self):
2276 self.serv_conn.send(MSG)
2277
2278 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002279 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002280 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2281 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002282 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002283 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002284
2285 def _testOverFlowRecvFrom(self):
2286 self.serv_conn.send(MSG)
2287
2288 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002289 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002290 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002291 while 1:
2292 read = self.cli_conn.recv(1024)
2293 if not read:
2294 break
Guido van Rossume531e292002-08-08 20:28:34 +00002295 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002296 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002297
2298 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002299 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002300 self.serv_conn.sendall(big_chunk)
2301
2302 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002303 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002304 fd = self.cli_conn.fileno()
2305 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002306 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002307 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002308 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002309 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002310
2311 def _testFromFd(self):
2312 self.serv_conn.send(MSG)
2313
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002314 def testDup(self):
2315 # Testing dup()
2316 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002317 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002318 msg = sock.recv(1024)
2319 self.assertEqual(msg, MSG)
2320
2321 def _testDup(self):
2322 self.serv_conn.send(MSG)
2323
Guido van Rossum24e4af82002-06-12 19:18:08 +00002324 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002325 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002326 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002327 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002328 # wait for _testShutdown to finish: on OS X, when the server
2329 # closes the connection the client also becomes disconnected,
2330 # and the client's shutdown call will fail. (Issue #4397.)
2331 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002332
2333 def _testShutdown(self):
2334 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002335 self.serv_conn.shutdown(2)
2336
2337 testShutdown_overflow = support.cpython_only(testShutdown)
2338
2339 @support.cpython_only
2340 def _testShutdown_overflow(self):
2341 import _testcapi
2342 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002343 # Issue 15989
2344 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2345 _testcapi.INT_MAX + 1)
2346 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2347 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002348 self.serv_conn.shutdown(2)
2349
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002350 def testDetach(self):
2351 # Testing detach()
2352 fileno = self.cli_conn.fileno()
2353 f = self.cli_conn.detach()
2354 self.assertEqual(f, fileno)
2355 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002356 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002357 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002358 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002359 # ...but we can create another socket using the (still open)
2360 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002361 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002362 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002363 msg = sock.recv(1024)
2364 self.assertEqual(msg, MSG)
2365
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002366 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002367 self.serv_conn.send(MSG)
2368
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002369
Guido van Rossum24e4af82002-06-12 19:18:08 +00002370class BasicUDPTest(ThreadedUDPSocketTest):
2371
2372 def __init__(self, methodName='runTest'):
2373 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2374
2375 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002376 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002377 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002378 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002379
2380 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002381 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002382
Guido van Rossum1c938012002-06-12 21:17:20 +00002383 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002384 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002385 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002386 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002387
Guido van Rossum1c938012002-06-12 21:17:20 +00002388 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002389 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002390
Guido van Rossumd8faa362007-04-27 19:54:29 +00002391 def testRecvFromNegative(self):
2392 # Negative lengths passed to recvfrom should give ValueError.
2393 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2394
2395 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002396 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002397
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07002398
2399@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
2400 'UDPLITE sockets required for this test.')
2401class BasicUDPLITETest(ThreadedUDPLITESocketTest):
2402
2403 def __init__(self, methodName='runTest'):
2404 ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
2405
2406 def testSendtoAndRecv(self):
2407 # Testing sendto() and Recv() over UDPLITE
2408 msg = self.serv.recv(len(MSG))
2409 self.assertEqual(msg, MSG)
2410
2411 def _testSendtoAndRecv(self):
2412 self.cli.sendto(MSG, 0, (HOST, self.port))
2413
2414 def testRecvFrom(self):
2415 # Testing recvfrom() over UDPLITE
2416 msg, addr = self.serv.recvfrom(len(MSG))
2417 self.assertEqual(msg, MSG)
2418
2419 def _testRecvFrom(self):
2420 self.cli.sendto(MSG, 0, (HOST, self.port))
2421
2422 def testRecvFromNegative(self):
2423 # Negative lengths passed to recvfrom should give ValueError.
2424 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2425
2426 def _testRecvFromNegative(self):
2427 self.cli.sendto(MSG, 0, (HOST, self.port))
2428
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002429# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2430# same test code is used with different families and types of socket
2431# (e.g. stream, datagram), and tests using recvmsg() are repeated
2432# using recvmsg_into().
2433#
2434# The generic test classes such as SendmsgTests and
2435# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2436# supplied with sockets cli_sock and serv_sock representing the
2437# client's and the server's end of the connection respectively, and
2438# attributes cli_addr and serv_addr holding their (numeric where
2439# appropriate) addresses.
2440#
2441# The final concrete test classes combine these with subclasses of
2442# SocketTestBase which set up client and server sockets of a specific
2443# type, and with subclasses of SendrecvmsgBase such as
2444# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2445# sockets to cli_sock and serv_sock and override the methods and
2446# attributes of SendrecvmsgBase to fill in destination addresses if
2447# needed when sending, check for specific flags in msg_flags, etc.
2448#
2449# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2450# recvmsg_into().
2451
2452# XXX: like the other datagram (UDP) tests in this module, the code
2453# here assumes that datagram delivery on the local machine will be
2454# reliable.
2455
2456class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2457 # Base class for sendmsg()/recvmsg() tests.
2458
2459 # Time in seconds to wait before considering a test failed, or
2460 # None for no timeout. Not all tests actually set a timeout.
2461 fail_timeout = 3.0
2462
2463 def setUp(self):
2464 self.misc_event = threading.Event()
2465 super().setUp()
2466
2467 def sendToServer(self, msg):
2468 # Send msg to the server.
2469 return self.cli_sock.send(msg)
2470
2471 # Tuple of alternative default arguments for sendmsg() when called
2472 # via sendmsgToServer() (e.g. to include a destination address).
2473 sendmsg_to_server_defaults = ()
2474
2475 def sendmsgToServer(self, *args):
2476 # Call sendmsg() on self.cli_sock with the given arguments,
2477 # filling in any arguments which are not supplied with the
2478 # corresponding items of self.sendmsg_to_server_defaults, if
2479 # any.
2480 return self.cli_sock.sendmsg(
2481 *(args + self.sendmsg_to_server_defaults[len(args):]))
2482
2483 def doRecvmsg(self, sock, bufsize, *args):
2484 # Call recvmsg() on sock with given arguments and return its
2485 # result. Should be used for tests which can use either
2486 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2487 # this method with one which emulates it using recvmsg_into(),
2488 # thus allowing the same test to be used for both methods.
2489 result = sock.recvmsg(bufsize, *args)
2490 self.registerRecvmsgResult(result)
2491 return result
2492
2493 def registerRecvmsgResult(self, result):
2494 # Called by doRecvmsg() with the return value of recvmsg() or
2495 # recvmsg_into(). Can be overridden to arrange cleanup based
2496 # on the returned ancillary data, for instance.
2497 pass
2498
2499 def checkRecvmsgAddress(self, addr1, addr2):
2500 # Called to compare the received address with the address of
2501 # the peer.
2502 self.assertEqual(addr1, addr2)
2503
2504 # Flags that are normally unset in msg_flags
2505 msg_flags_common_unset = 0
2506 for name in ("MSG_CTRUNC", "MSG_OOB"):
2507 msg_flags_common_unset |= getattr(socket, name, 0)
2508
2509 # Flags that are normally set
2510 msg_flags_common_set = 0
2511
2512 # Flags set when a complete record has been received (e.g. MSG_EOR
2513 # for SCTP)
2514 msg_flags_eor_indicator = 0
2515
2516 # Flags set when a complete record has not been received
2517 # (e.g. MSG_TRUNC for datagram sockets)
2518 msg_flags_non_eor_indicator = 0
2519
2520 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2521 # Method to check the value of msg_flags returned by recvmsg[_into]().
2522 #
2523 # Checks that all bits in msg_flags_common_set attribute are
2524 # set in "flags" and all bits in msg_flags_common_unset are
2525 # unset.
2526 #
2527 # The "eor" argument specifies whether the flags should
2528 # indicate that a full record (or datagram) has been received.
2529 # If "eor" is None, no checks are done; otherwise, checks
2530 # that:
2531 #
2532 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2533 # set and all bits in msg_flags_non_eor_indicator are unset
2534 #
2535 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2536 # are set and all bits in msg_flags_eor_indicator are unset
2537 #
2538 # If "checkset" and/or "checkunset" are supplied, they require
2539 # the given bits to be set or unset respectively, overriding
2540 # what the attributes require for those bits.
2541 #
2542 # If any bits are set in "ignore", they will not be checked,
2543 # regardless of the other inputs.
2544 #
2545 # Will raise Exception if the inputs require a bit to be both
2546 # set and unset, and it is not ignored.
2547
2548 defaultset = self.msg_flags_common_set
2549 defaultunset = self.msg_flags_common_unset
2550
2551 if eor:
2552 defaultset |= self.msg_flags_eor_indicator
2553 defaultunset |= self.msg_flags_non_eor_indicator
2554 elif eor is not None:
2555 defaultset |= self.msg_flags_non_eor_indicator
2556 defaultunset |= self.msg_flags_eor_indicator
2557
2558 # Function arguments override defaults
2559 defaultset &= ~checkunset
2560 defaultunset &= ~checkset
2561
2562 # Merge arguments with remaining defaults, and check for conflicts
2563 checkset |= defaultset
2564 checkunset |= defaultunset
2565 inboth = checkset & checkunset & ~ignore
2566 if inboth:
2567 raise Exception("contradictory set, unset requirements for flags "
2568 "{0:#x}".format(inboth))
2569
2570 # Compare with given msg_flags value
2571 mask = (checkset | checkunset) & ~ignore
2572 self.assertEqual(flags & mask, checkset & mask)
2573
2574
2575class RecvmsgIntoMixin(SendrecvmsgBase):
2576 # Mixin to implement doRecvmsg() using recvmsg_into().
2577
2578 def doRecvmsg(self, sock, bufsize, *args):
2579 buf = bytearray(bufsize)
2580 result = sock.recvmsg_into([buf], *args)
2581 self.registerRecvmsgResult(result)
2582 self.assertGreaterEqual(result[0], 0)
2583 self.assertLessEqual(result[0], bufsize)
2584 return (bytes(buf[:result[0]]),) + result[1:]
2585
2586
2587class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2588 # Defines flags to be checked in msg_flags for datagram sockets.
2589
2590 @property
2591 def msg_flags_non_eor_indicator(self):
2592 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2593
2594
2595class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2596 # Defines flags to be checked in msg_flags for SCTP sockets.
2597
2598 @property
2599 def msg_flags_eor_indicator(self):
2600 return super().msg_flags_eor_indicator | socket.MSG_EOR
2601
2602
2603class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2604 # Base class for tests on connectionless-mode sockets. Users must
2605 # supply sockets on attributes cli and serv to be mapped to
2606 # cli_sock and serv_sock respectively.
2607
2608 @property
2609 def serv_sock(self):
2610 return self.serv
2611
2612 @property
2613 def cli_sock(self):
2614 return self.cli
2615
2616 @property
2617 def sendmsg_to_server_defaults(self):
2618 return ([], [], 0, self.serv_addr)
2619
2620 def sendToServer(self, msg):
2621 return self.cli_sock.sendto(msg, self.serv_addr)
2622
2623
2624class SendrecvmsgConnectedBase(SendrecvmsgBase):
2625 # Base class for tests on connected sockets. Users must supply
2626 # sockets on attributes serv_conn and cli_conn (representing the
2627 # connections *to* the server and the client), to be mapped to
2628 # cli_sock and serv_sock respectively.
2629
2630 @property
2631 def serv_sock(self):
2632 return self.cli_conn
2633
2634 @property
2635 def cli_sock(self):
2636 return self.serv_conn
2637
2638 def checkRecvmsgAddress(self, addr1, addr2):
2639 # Address is currently "unspecified" for a connected socket,
2640 # so we don't examine it
2641 pass
2642
2643
2644class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2645 # Base class to set a timeout on server's socket.
2646
2647 def setUp(self):
2648 super().setUp()
2649 self.serv_sock.settimeout(self.fail_timeout)
2650
2651
2652class SendmsgTests(SendrecvmsgServerTimeoutBase):
2653 # Tests for sendmsg() which can use any socket type and do not
2654 # involve recvmsg() or recvmsg_into().
2655
2656 def testSendmsg(self):
2657 # Send a simple message with sendmsg().
2658 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2659
2660 def _testSendmsg(self):
2661 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2662
2663 def testSendmsgDataGenerator(self):
2664 # Send from buffer obtained from a generator (not a sequence).
2665 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2666
2667 def _testSendmsgDataGenerator(self):
2668 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2669 len(MSG))
2670
2671 def testSendmsgAncillaryGenerator(self):
2672 # Gather (empty) ancillary data from a generator.
2673 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2674
2675 def _testSendmsgAncillaryGenerator(self):
2676 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2677 len(MSG))
2678
2679 def testSendmsgArray(self):
2680 # Send data from an array instead of the usual bytes object.
2681 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2682
2683 def _testSendmsgArray(self):
2684 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2685 len(MSG))
2686
2687 def testSendmsgGather(self):
2688 # Send message data from more than one buffer (gather write).
2689 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2690
2691 def _testSendmsgGather(self):
2692 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2693
2694 def testSendmsgBadArgs(self):
2695 # Check that sendmsg() rejects invalid arguments.
2696 self.assertEqual(self.serv_sock.recv(1000), b"done")
2697
2698 def _testSendmsgBadArgs(self):
2699 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2700 self.assertRaises(TypeError, self.sendmsgToServer,
2701 b"not in an iterable")
2702 self.assertRaises(TypeError, self.sendmsgToServer,
2703 object())
2704 self.assertRaises(TypeError, self.sendmsgToServer,
2705 [object()])
2706 self.assertRaises(TypeError, self.sendmsgToServer,
2707 [MSG, object()])
2708 self.assertRaises(TypeError, self.sendmsgToServer,
2709 [MSG], object())
2710 self.assertRaises(TypeError, self.sendmsgToServer,
2711 [MSG], [], object())
2712 self.assertRaises(TypeError, self.sendmsgToServer,
2713 [MSG], [], 0, object())
2714 self.sendToServer(b"done")
2715
2716 def testSendmsgBadCmsg(self):
2717 # Check that invalid ancillary data items are rejected.
2718 self.assertEqual(self.serv_sock.recv(1000), b"done")
2719
2720 def _testSendmsgBadCmsg(self):
2721 self.assertRaises(TypeError, self.sendmsgToServer,
2722 [MSG], [object()])
2723 self.assertRaises(TypeError, self.sendmsgToServer,
2724 [MSG], [(object(), 0, b"data")])
2725 self.assertRaises(TypeError, self.sendmsgToServer,
2726 [MSG], [(0, object(), b"data")])
2727 self.assertRaises(TypeError, self.sendmsgToServer,
2728 [MSG], [(0, 0, object())])
2729 self.assertRaises(TypeError, self.sendmsgToServer,
2730 [MSG], [(0, 0)])
2731 self.assertRaises(TypeError, self.sendmsgToServer,
2732 [MSG], [(0, 0, b"data", 42)])
2733 self.sendToServer(b"done")
2734
2735 @requireAttrs(socket, "CMSG_SPACE")
2736 def testSendmsgBadMultiCmsg(self):
2737 # Check that invalid ancillary data items are rejected when
2738 # more than one item is present.
2739 self.assertEqual(self.serv_sock.recv(1000), b"done")
2740
2741 @testSendmsgBadMultiCmsg.client_skip
2742 def _testSendmsgBadMultiCmsg(self):
2743 self.assertRaises(TypeError, self.sendmsgToServer,
2744 [MSG], [0, 0, b""])
2745 self.assertRaises(TypeError, self.sendmsgToServer,
2746 [MSG], [(0, 0, b""), object()])
2747 self.sendToServer(b"done")
2748
2749 def testSendmsgExcessCmsgReject(self):
2750 # Check that sendmsg() rejects excess ancillary data items
2751 # when the number that can be sent is limited.
2752 self.assertEqual(self.serv_sock.recv(1000), b"done")
2753
2754 def _testSendmsgExcessCmsgReject(self):
2755 if not hasattr(socket, "CMSG_SPACE"):
2756 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002757 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002758 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2759 self.assertIsNone(cm.exception.errno)
2760 self.sendToServer(b"done")
2761
2762 def testSendmsgAfterClose(self):
2763 # Check that sendmsg() fails on a closed socket.
2764 pass
2765
2766 def _testSendmsgAfterClose(self):
2767 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002768 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002769
2770
2771class SendmsgStreamTests(SendmsgTests):
2772 # Tests for sendmsg() which require a stream socket and do not
2773 # involve recvmsg() or recvmsg_into().
2774
2775 def testSendmsgExplicitNoneAddr(self):
2776 # Check that peer address can be specified as None.
2777 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2778
2779 def _testSendmsgExplicitNoneAddr(self):
2780 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2781
2782 def testSendmsgTimeout(self):
2783 # Check that timeout works with sendmsg().
2784 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2785 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2786
2787 def _testSendmsgTimeout(self):
2788 try:
2789 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002790 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002791 while True:
2792 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002793 except socket.timeout:
2794 pass
2795 except OSError as exc:
2796 if exc.errno != errno.ENOMEM:
2797 raise
2798 # bpo-33937 the test randomly fails on Travis CI with
2799 # "OSError: [Errno 12] Cannot allocate memory"
2800 else:
2801 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002802 finally:
2803 self.misc_event.set()
2804
2805 # XXX: would be nice to have more tests for sendmsg flags argument.
2806
2807 # Linux supports MSG_DONTWAIT when sending, but in general, it
2808 # only works when receiving. Could add other platforms if they
2809 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002810 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002811 "MSG_DONTWAIT not known to work on this platform when "
2812 "sending")
2813 def testSendmsgDontWait(self):
2814 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2815 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2816 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2817
2818 @testSendmsgDontWait.client_skip
2819 def _testSendmsgDontWait(self):
2820 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002821 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002822 while True:
2823 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002824 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2825 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002826 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002827 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002828 finally:
2829 self.misc_event.set()
2830
2831
2832class SendmsgConnectionlessTests(SendmsgTests):
2833 # Tests for sendmsg() which require a connectionless-mode
2834 # (e.g. datagram) socket, and do not involve recvmsg() or
2835 # recvmsg_into().
2836
2837 def testSendmsgNoDestAddr(self):
2838 # Check that sendmsg() fails when no destination address is
2839 # given for unconnected socket.
2840 pass
2841
2842 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002843 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002844 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002845 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002846 [MSG], [], 0, None)
2847
2848
2849class RecvmsgGenericTests(SendrecvmsgBase):
2850 # Tests for recvmsg() which can also be emulated using
2851 # recvmsg_into(), and can use any socket type.
2852
2853 def testRecvmsg(self):
2854 # Receive a simple message with recvmsg[_into]().
2855 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2856 self.assertEqual(msg, MSG)
2857 self.checkRecvmsgAddress(addr, self.cli_addr)
2858 self.assertEqual(ancdata, [])
2859 self.checkFlags(flags, eor=True)
2860
2861 def _testRecvmsg(self):
2862 self.sendToServer(MSG)
2863
2864 def testRecvmsgExplicitDefaults(self):
2865 # Test recvmsg[_into]() with default arguments provided explicitly.
2866 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2867 len(MSG), 0, 0)
2868 self.assertEqual(msg, MSG)
2869 self.checkRecvmsgAddress(addr, self.cli_addr)
2870 self.assertEqual(ancdata, [])
2871 self.checkFlags(flags, eor=True)
2872
2873 def _testRecvmsgExplicitDefaults(self):
2874 self.sendToServer(MSG)
2875
2876 def testRecvmsgShorter(self):
2877 # Receive a message smaller than buffer.
2878 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2879 len(MSG) + 42)
2880 self.assertEqual(msg, MSG)
2881 self.checkRecvmsgAddress(addr, self.cli_addr)
2882 self.assertEqual(ancdata, [])
2883 self.checkFlags(flags, eor=True)
2884
2885 def _testRecvmsgShorter(self):
2886 self.sendToServer(MSG)
2887
2888 def testRecvmsgTrunc(self):
2889 # Receive part of message, check for truncation indicators.
2890 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2891 len(MSG) - 3)
2892 self.assertEqual(msg, MSG[:-3])
2893 self.checkRecvmsgAddress(addr, self.cli_addr)
2894 self.assertEqual(ancdata, [])
2895 self.checkFlags(flags, eor=False)
2896
2897 def _testRecvmsgTrunc(self):
2898 self.sendToServer(MSG)
2899
2900 def testRecvmsgShortAncillaryBuf(self):
2901 # Test ancillary data buffer too small to hold any ancillary data.
2902 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2903 len(MSG), 1)
2904 self.assertEqual(msg, MSG)
2905 self.checkRecvmsgAddress(addr, self.cli_addr)
2906 self.assertEqual(ancdata, [])
2907 self.checkFlags(flags, eor=True)
2908
2909 def _testRecvmsgShortAncillaryBuf(self):
2910 self.sendToServer(MSG)
2911
2912 def testRecvmsgLongAncillaryBuf(self):
2913 # Test large ancillary data buffer.
2914 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2915 len(MSG), 10240)
2916 self.assertEqual(msg, MSG)
2917 self.checkRecvmsgAddress(addr, self.cli_addr)
2918 self.assertEqual(ancdata, [])
2919 self.checkFlags(flags, eor=True)
2920
2921 def _testRecvmsgLongAncillaryBuf(self):
2922 self.sendToServer(MSG)
2923
2924 def testRecvmsgAfterClose(self):
2925 # Check that recvmsg[_into]() fails on a closed socket.
2926 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002927 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002928
2929 def _testRecvmsgAfterClose(self):
2930 pass
2931
2932 def testRecvmsgTimeout(self):
2933 # Check that timeout works.
2934 try:
2935 self.serv_sock.settimeout(0.03)
2936 self.assertRaises(socket.timeout,
2937 self.doRecvmsg, self.serv_sock, len(MSG))
2938 finally:
2939 self.misc_event.set()
2940
2941 def _testRecvmsgTimeout(self):
2942 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2943
2944 @requireAttrs(socket, "MSG_PEEK")
2945 def testRecvmsgPeek(self):
2946 # Check that MSG_PEEK in flags enables examination of pending
2947 # data without consuming it.
2948
2949 # Receive part of data with MSG_PEEK.
2950 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2951 len(MSG) - 3, 0,
2952 socket.MSG_PEEK)
2953 self.assertEqual(msg, MSG[:-3])
2954 self.checkRecvmsgAddress(addr, self.cli_addr)
2955 self.assertEqual(ancdata, [])
2956 # Ignoring MSG_TRUNC here (so this test is the same for stream
2957 # and datagram sockets). Some wording in POSIX seems to
2958 # suggest that it needn't be set when peeking, but that may
2959 # just be a slip.
2960 self.checkFlags(flags, eor=False,
2961 ignore=getattr(socket, "MSG_TRUNC", 0))
2962
2963 # Receive all data with MSG_PEEK.
2964 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2965 len(MSG), 0,
2966 socket.MSG_PEEK)
2967 self.assertEqual(msg, MSG)
2968 self.checkRecvmsgAddress(addr, self.cli_addr)
2969 self.assertEqual(ancdata, [])
2970 self.checkFlags(flags, eor=True)
2971
2972 # Check that the same data can still be received normally.
2973 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2974 self.assertEqual(msg, MSG)
2975 self.checkRecvmsgAddress(addr, self.cli_addr)
2976 self.assertEqual(ancdata, [])
2977 self.checkFlags(flags, eor=True)
2978
2979 @testRecvmsgPeek.client_skip
2980 def _testRecvmsgPeek(self):
2981 self.sendToServer(MSG)
2982
2983 @requireAttrs(socket.socket, "sendmsg")
2984 def testRecvmsgFromSendmsg(self):
2985 # Test receiving with recvmsg[_into]() when message is sent
2986 # using sendmsg().
2987 self.serv_sock.settimeout(self.fail_timeout)
2988 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2989 self.assertEqual(msg, MSG)
2990 self.checkRecvmsgAddress(addr, self.cli_addr)
2991 self.assertEqual(ancdata, [])
2992 self.checkFlags(flags, eor=True)
2993
2994 @testRecvmsgFromSendmsg.client_skip
2995 def _testRecvmsgFromSendmsg(self):
2996 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2997
2998
2999class RecvmsgGenericStreamTests(RecvmsgGenericTests):
3000 # Tests which require a stream socket and can use either recvmsg()
3001 # or recvmsg_into().
3002
3003 def testRecvmsgEOF(self):
3004 # Receive end-of-stream indicator (b"", peer socket closed).
3005 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3006 self.assertEqual(msg, b"")
3007 self.checkRecvmsgAddress(addr, self.cli_addr)
3008 self.assertEqual(ancdata, [])
3009 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
3010
3011 def _testRecvmsgEOF(self):
3012 self.cli_sock.close()
3013
3014 def testRecvmsgOverflow(self):
3015 # Receive a message in more than one chunk.
3016 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3017 len(MSG) - 3)
3018 self.checkRecvmsgAddress(addr, self.cli_addr)
3019 self.assertEqual(ancdata, [])
3020 self.checkFlags(flags, eor=False)
3021
3022 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
3023 self.checkRecvmsgAddress(addr, self.cli_addr)
3024 self.assertEqual(ancdata, [])
3025 self.checkFlags(flags, eor=True)
3026
3027 msg = seg1 + seg2
3028 self.assertEqual(msg, MSG)
3029
3030 def _testRecvmsgOverflow(self):
3031 self.sendToServer(MSG)
3032
3033
3034class RecvmsgTests(RecvmsgGenericTests):
3035 # Tests for recvmsg() which can use any socket type.
3036
3037 def testRecvmsgBadArgs(self):
3038 # Check that recvmsg() rejects invalid arguments.
3039 self.assertRaises(TypeError, self.serv_sock.recvmsg)
3040 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3041 -1, 0, 0)
3042 self.assertRaises(ValueError, self.serv_sock.recvmsg,
3043 len(MSG), -1, 0)
3044 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3045 [bytearray(10)], 0, 0)
3046 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3047 object(), 0, 0)
3048 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3049 len(MSG), object(), 0)
3050 self.assertRaises(TypeError, self.serv_sock.recvmsg,
3051 len(MSG), 0, object())
3052
3053 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3054 self.assertEqual(msg, MSG)
3055 self.checkRecvmsgAddress(addr, self.cli_addr)
3056 self.assertEqual(ancdata, [])
3057 self.checkFlags(flags, eor=True)
3058
3059 def _testRecvmsgBadArgs(self):
3060 self.sendToServer(MSG)
3061
3062
3063class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3064 # Tests for recvmsg_into() which can use any socket type.
3065
3066 def testRecvmsgIntoBadArgs(self):
3067 # Check that recvmsg_into() rejects invalid arguments.
3068 buf = bytearray(len(MSG))
3069 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3070 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3071 len(MSG), 0, 0)
3072 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3073 buf, 0, 0)
3074 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3075 [object()], 0, 0)
3076 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3077 [b"I'm not writable"], 0, 0)
3078 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3079 [buf, object()], 0, 0)
3080 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3081 [buf], -1, 0)
3082 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3083 [buf], object(), 0)
3084 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3085 [buf], 0, object())
3086
3087 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3088 self.assertEqual(nbytes, len(MSG))
3089 self.assertEqual(buf, bytearray(MSG))
3090 self.checkRecvmsgAddress(addr, self.cli_addr)
3091 self.assertEqual(ancdata, [])
3092 self.checkFlags(flags, eor=True)
3093
3094 def _testRecvmsgIntoBadArgs(self):
3095 self.sendToServer(MSG)
3096
3097 def testRecvmsgIntoGenerator(self):
3098 # Receive into buffer obtained from a generator (not a sequence).
3099 buf = bytearray(len(MSG))
3100 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3101 (o for o in [buf]))
3102 self.assertEqual(nbytes, len(MSG))
3103 self.assertEqual(buf, bytearray(MSG))
3104 self.checkRecvmsgAddress(addr, self.cli_addr)
3105 self.assertEqual(ancdata, [])
3106 self.checkFlags(flags, eor=True)
3107
3108 def _testRecvmsgIntoGenerator(self):
3109 self.sendToServer(MSG)
3110
3111 def testRecvmsgIntoArray(self):
3112 # Receive into an array rather than the usual bytearray.
3113 buf = array.array("B", [0] * len(MSG))
3114 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3115 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003116 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003117 self.checkRecvmsgAddress(addr, self.cli_addr)
3118 self.assertEqual(ancdata, [])
3119 self.checkFlags(flags, eor=True)
3120
3121 def _testRecvmsgIntoArray(self):
3122 self.sendToServer(MSG)
3123
3124 def testRecvmsgIntoScatter(self):
3125 # Receive into multiple buffers (scatter write).
3126 b1 = bytearray(b"----")
3127 b2 = bytearray(b"0123456789")
3128 b3 = bytearray(b"--------------")
3129 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3130 [b1, memoryview(b2)[2:9], b3])
3131 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3132 self.assertEqual(b1, bytearray(b"Mary"))
3133 self.assertEqual(b2, bytearray(b"01 had a 9"))
3134 self.assertEqual(b3, bytearray(b"little lamb---"))
3135 self.checkRecvmsgAddress(addr, self.cli_addr)
3136 self.assertEqual(ancdata, [])
3137 self.checkFlags(flags, eor=True)
3138
3139 def _testRecvmsgIntoScatter(self):
3140 self.sendToServer(b"Mary had a little lamb")
3141
3142
3143class CmsgMacroTests(unittest.TestCase):
3144 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3145 # assumptions used by sendmsg() and recvmsg[_into](), which share
3146 # code with these functions.
3147
3148 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003149 try:
3150 import _testcapi
3151 except ImportError:
3152 socklen_t_limit = 0x7fffffff
3153 else:
3154 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003155
3156 @requireAttrs(socket, "CMSG_LEN")
3157 def testCMSG_LEN(self):
3158 # Test CMSG_LEN() with various valid and invalid values,
3159 # checking the assumptions used by recvmsg() and sendmsg().
3160 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3161 values = list(range(257)) + list(range(toobig - 257, toobig))
3162
3163 # struct cmsghdr has at least three members, two of which are ints
3164 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3165 for n in values:
3166 ret = socket.CMSG_LEN(n)
3167 # This is how recvmsg() calculates the data size
3168 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3169 self.assertLessEqual(ret, self.socklen_t_limit)
3170
3171 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3172 # sendmsg() shares code with these functions, and requires
3173 # that it reject values over the limit.
3174 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3175 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3176
3177 @requireAttrs(socket, "CMSG_SPACE")
3178 def testCMSG_SPACE(self):
3179 # Test CMSG_SPACE() with various valid and invalid values,
3180 # checking the assumptions used by sendmsg().
3181 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3182 values = list(range(257)) + list(range(toobig - 257, toobig))
3183
3184 last = socket.CMSG_SPACE(0)
3185 # struct cmsghdr has at least three members, two of which are ints
3186 self.assertGreater(last, array.array("i").itemsize * 2)
3187 for n in values:
3188 ret = socket.CMSG_SPACE(n)
3189 self.assertGreaterEqual(ret, last)
3190 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3191 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3192 self.assertLessEqual(ret, self.socklen_t_limit)
3193 last = ret
3194
3195 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3196 # sendmsg() shares code with these functions, and requires
3197 # that it reject values over the limit.
3198 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3199 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3200
3201
3202class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3203 # Tests for file descriptor passing on Unix-domain sockets.
3204
3205 # Invalid file descriptor value that's unlikely to evaluate to a
3206 # real FD even if one of its bytes is replaced with a different
3207 # value (which shouldn't actually happen).
3208 badfd = -0x5555
3209
3210 def newFDs(self, n):
3211 # Return a list of n file descriptors for newly-created files
3212 # containing their list indices as ASCII numbers.
3213 fds = []
3214 for i in range(n):
3215 fd, path = tempfile.mkstemp()
3216 self.addCleanup(os.unlink, path)
3217 self.addCleanup(os.close, fd)
3218 os.write(fd, str(i).encode())
3219 fds.append(fd)
3220 return fds
3221
3222 def checkFDs(self, fds):
3223 # Check that the file descriptors in the given list contain
3224 # their correct list indices as ASCII numbers.
3225 for n, fd in enumerate(fds):
3226 os.lseek(fd, 0, os.SEEK_SET)
3227 self.assertEqual(os.read(fd, 1024), str(n).encode())
3228
3229 def registerRecvmsgResult(self, result):
3230 self.addCleanup(self.closeRecvmsgFDs, result)
3231
3232 def closeRecvmsgFDs(self, recvmsg_result):
3233 # Close all file descriptors specified in the ancillary data
3234 # of the given return value from recvmsg() or recvmsg_into().
3235 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3236 if (cmsg_level == socket.SOL_SOCKET and
3237 cmsg_type == socket.SCM_RIGHTS):
3238 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003239 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003240 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3241 for fd in fds:
3242 os.close(fd)
3243
3244 def createAndSendFDs(self, n):
3245 # Send n new file descriptors created by newFDs() to the
3246 # server, with the constant MSG as the non-ancillary data.
3247 self.assertEqual(
3248 self.sendmsgToServer([MSG],
3249 [(socket.SOL_SOCKET,
3250 socket.SCM_RIGHTS,
3251 array.array("i", self.newFDs(n)))]),
3252 len(MSG))
3253
3254 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3255 # Check that constant MSG was received with numfds file
3256 # descriptors in a maximum of maxcmsgs control messages (which
3257 # must contain only complete integers). By default, check
3258 # that MSG_CTRUNC is unset, but ignore any flags in
3259 # ignoreflags.
3260 msg, ancdata, flags, addr = result
3261 self.assertEqual(msg, MSG)
3262 self.checkRecvmsgAddress(addr, self.cli_addr)
3263 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3264 ignore=ignoreflags)
3265
3266 self.assertIsInstance(ancdata, list)
3267 self.assertLessEqual(len(ancdata), maxcmsgs)
3268 fds = array.array("i")
3269 for item in ancdata:
3270 self.assertIsInstance(item, tuple)
3271 cmsg_level, cmsg_type, cmsg_data = item
3272 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3273 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3274 self.assertIsInstance(cmsg_data, bytes)
3275 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003276 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277
3278 self.assertEqual(len(fds), numfds)
3279 self.checkFDs(fds)
3280
3281 def testFDPassSimple(self):
3282 # Pass a single FD (array read from bytes object).
3283 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3284 len(MSG), 10240))
3285
3286 def _testFDPassSimple(self):
3287 self.assertEqual(
3288 self.sendmsgToServer(
3289 [MSG],
3290 [(socket.SOL_SOCKET,
3291 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003292 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003293 len(MSG))
3294
3295 def testMultipleFDPass(self):
3296 # Pass multiple FDs in a single array.
3297 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3298 len(MSG), 10240))
3299
3300 def _testMultipleFDPass(self):
3301 self.createAndSendFDs(4)
3302
3303 @requireAttrs(socket, "CMSG_SPACE")
3304 def testFDPassCMSG_SPACE(self):
3305 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3306 self.checkRecvmsgFDs(
3307 4, self.doRecvmsg(self.serv_sock, len(MSG),
3308 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3309
3310 @testFDPassCMSG_SPACE.client_skip
3311 def _testFDPassCMSG_SPACE(self):
3312 self.createAndSendFDs(4)
3313
3314 def testFDPassCMSG_LEN(self):
3315 # Test using CMSG_LEN() to calculate ancillary buffer size.
3316 self.checkRecvmsgFDs(1,
3317 self.doRecvmsg(self.serv_sock, len(MSG),
3318 socket.CMSG_LEN(4 * SIZEOF_INT)),
3319 # RFC 3542 says implementations may set
3320 # MSG_CTRUNC if there isn't enough space
3321 # for trailing padding.
3322 ignoreflags=socket.MSG_CTRUNC)
3323
3324 def _testFDPassCMSG_LEN(self):
3325 self.createAndSendFDs(1)
3326
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003327 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003328 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003329 @requireAttrs(socket, "CMSG_SPACE")
3330 def testFDPassSeparate(self):
3331 # Pass two FDs in two separate arrays. Arrays may be combined
3332 # into a single control message by the OS.
3333 self.checkRecvmsgFDs(2,
3334 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3335 maxcmsgs=2)
3336
3337 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003338 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003339 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003340 def _testFDPassSeparate(self):
3341 fd0, fd1 = self.newFDs(2)
3342 self.assertEqual(
3343 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3344 socket.SCM_RIGHTS,
3345 array.array("i", [fd0])),
3346 (socket.SOL_SOCKET,
3347 socket.SCM_RIGHTS,
3348 array.array("i", [fd1]))]),
3349 len(MSG))
3350
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 @requireAttrs(socket, "CMSG_SPACE")
3354 def testFDPassSeparateMinSpace(self):
3355 # Pass two FDs in two separate arrays, receiving them into the
3356 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003357 num_fds = 2
3358 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003359 self.doRecvmsg(self.serv_sock, len(MSG),
3360 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003361 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003362 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3363
3364 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003365 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003366 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003367 def _testFDPassSeparateMinSpace(self):
3368 fd0, fd1 = self.newFDs(2)
3369 self.assertEqual(
3370 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3371 socket.SCM_RIGHTS,
3372 array.array("i", [fd0])),
3373 (socket.SOL_SOCKET,
3374 socket.SCM_RIGHTS,
3375 array.array("i", [fd1]))]),
3376 len(MSG))
3377
3378 def sendAncillaryIfPossible(self, msg, ancdata):
3379 # Try to send msg and ancdata to server, but if the system
3380 # call fails, just send msg with no ancillary data.
3381 try:
3382 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003383 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003384 # Check that it was the system call that failed
3385 self.assertIsInstance(e.errno, int)
3386 nbytes = self.sendmsgToServer([msg])
3387 self.assertEqual(nbytes, len(msg))
3388
Brett Cannon3bbad122015-12-28 17:21:44 -08003389 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003390 def testFDPassEmpty(self):
3391 # Try to pass an empty FD array. Can receive either no array
3392 # or an empty array.
3393 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3394 len(MSG), 10240),
3395 ignoreflags=socket.MSG_CTRUNC)
3396
3397 def _testFDPassEmpty(self):
3398 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3399 socket.SCM_RIGHTS,
3400 b"")])
3401
3402 def testFDPassPartialInt(self):
3403 # Try to pass a truncated FD array.
3404 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3405 len(MSG), 10240)
3406 self.assertEqual(msg, MSG)
3407 self.checkRecvmsgAddress(addr, self.cli_addr)
3408 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3409 self.assertLessEqual(len(ancdata), 1)
3410 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3411 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3412 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3413 self.assertLess(len(cmsg_data), SIZEOF_INT)
3414
3415 def _testFDPassPartialInt(self):
3416 self.sendAncillaryIfPossible(
3417 MSG,
3418 [(socket.SOL_SOCKET,
3419 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003420 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003421
3422 @requireAttrs(socket, "CMSG_SPACE")
3423 def testFDPassPartialIntInMiddle(self):
3424 # Try to pass two FD arrays, the first of which is truncated.
3425 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3426 len(MSG), 10240)
3427 self.assertEqual(msg, MSG)
3428 self.checkRecvmsgAddress(addr, self.cli_addr)
3429 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3430 self.assertLessEqual(len(ancdata), 2)
3431 fds = array.array("i")
3432 # Arrays may have been combined in a single control message
3433 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3434 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3435 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003436 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003437 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3438 self.assertLessEqual(len(fds), 2)
3439 self.checkFDs(fds)
3440
3441 @testFDPassPartialIntInMiddle.client_skip
3442 def _testFDPassPartialIntInMiddle(self):
3443 fd0, fd1 = self.newFDs(2)
3444 self.sendAncillaryIfPossible(
3445 MSG,
3446 [(socket.SOL_SOCKET,
3447 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003448 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003449 (socket.SOL_SOCKET,
3450 socket.SCM_RIGHTS,
3451 array.array("i", [fd1]))])
3452
3453 def checkTruncatedHeader(self, result, ignoreflags=0):
3454 # Check that no ancillary data items are returned when data is
3455 # truncated inside the cmsghdr structure.
3456 msg, ancdata, flags, addr = result
3457 self.assertEqual(msg, MSG)
3458 self.checkRecvmsgAddress(addr, self.cli_addr)
3459 self.assertEqual(ancdata, [])
3460 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3461 ignore=ignoreflags)
3462
3463 def testCmsgTruncNoBufSize(self):
3464 # Check that no ancillary data is received when no buffer size
3465 # is specified.
3466 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3467 # BSD seems to set MSG_CTRUNC only
3468 # if an item has been partially
3469 # received.
3470 ignoreflags=socket.MSG_CTRUNC)
3471
3472 def _testCmsgTruncNoBufSize(self):
3473 self.createAndSendFDs(1)
3474
3475 def testCmsgTrunc0(self):
3476 # Check that no ancillary data is received when buffer size is 0.
3477 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3478 ignoreflags=socket.MSG_CTRUNC)
3479
3480 def _testCmsgTrunc0(self):
3481 self.createAndSendFDs(1)
3482
3483 # Check that no ancillary data is returned for various non-zero
3484 # (but still too small) buffer sizes.
3485
3486 def testCmsgTrunc1(self):
3487 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3488
3489 def _testCmsgTrunc1(self):
3490 self.createAndSendFDs(1)
3491
3492 def testCmsgTrunc2Int(self):
3493 # The cmsghdr structure has at least three members, two of
3494 # which are ints, so we still shouldn't see any ancillary
3495 # data.
3496 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3497 SIZEOF_INT * 2))
3498
3499 def _testCmsgTrunc2Int(self):
3500 self.createAndSendFDs(1)
3501
3502 def testCmsgTruncLen0Minus1(self):
3503 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3504 socket.CMSG_LEN(0) - 1))
3505
3506 def _testCmsgTruncLen0Minus1(self):
3507 self.createAndSendFDs(1)
3508
3509 # The following tests try to truncate the control message in the
3510 # middle of the FD array.
3511
3512 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3513 # Check that file descriptor data is truncated to between
3514 # mindata and maxdata bytes when received with buffer size
3515 # ancbuf, and that any complete file descriptor numbers are
3516 # valid.
3517 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3518 len(MSG), ancbuf)
3519 self.assertEqual(msg, MSG)
3520 self.checkRecvmsgAddress(addr, self.cli_addr)
3521 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3522
3523 if mindata == 0 and ancdata == []:
3524 return
3525 self.assertEqual(len(ancdata), 1)
3526 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3527 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3528 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3529 self.assertGreaterEqual(len(cmsg_data), mindata)
3530 self.assertLessEqual(len(cmsg_data), maxdata)
3531 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003532 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003533 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3534 self.checkFDs(fds)
3535
3536 def testCmsgTruncLen0(self):
3537 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3538
3539 def _testCmsgTruncLen0(self):
3540 self.createAndSendFDs(1)
3541
3542 def testCmsgTruncLen0Plus1(self):
3543 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3544
3545 def _testCmsgTruncLen0Plus1(self):
3546 self.createAndSendFDs(2)
3547
3548 def testCmsgTruncLen1(self):
3549 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3550 maxdata=SIZEOF_INT)
3551
3552 def _testCmsgTruncLen1(self):
3553 self.createAndSendFDs(2)
3554
3555 def testCmsgTruncLen2Minus1(self):
3556 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3557 maxdata=(2 * SIZEOF_INT) - 1)
3558
3559 def _testCmsgTruncLen2Minus1(self):
3560 self.createAndSendFDs(2)
3561
3562
3563class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3564 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3565 # features of the RFC 3542 Advanced Sockets API for IPv6.
3566 # Currently we can only handle certain data items (e.g. traffic
3567 # class, hop limit, MTU discovery and fragmentation settings)
3568 # without resorting to unportable means such as the struct module,
3569 # but the tests here are aimed at testing the ancillary data
3570 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3571 # itself.
3572
3573 # Test value to use when setting hop limit of packet
3574 hop_limit = 2
3575
3576 # Test value to use when setting traffic class of packet.
3577 # -1 means "use kernel default".
3578 traffic_class = -1
3579
3580 def ancillaryMapping(self, ancdata):
3581 # Given ancillary data list ancdata, return a mapping from
3582 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3583 # Check that no (level, type) pair appears more than once.
3584 d = {}
3585 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3586 self.assertNotIn((cmsg_level, cmsg_type), d)
3587 d[(cmsg_level, cmsg_type)] = cmsg_data
3588 return d
3589
3590 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3591 # Receive hop limit into ancbufsize bytes of ancillary data
3592 # space. Check that data is MSG, ancillary data is not
3593 # truncated (but ignore any flags in ignoreflags), and hop
3594 # limit is between 0 and maxhop inclusive.
3595 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3596 socket.IPV6_RECVHOPLIMIT, 1)
3597 self.misc_event.set()
3598 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3599 len(MSG), ancbufsize)
3600
3601 self.assertEqual(msg, MSG)
3602 self.checkRecvmsgAddress(addr, self.cli_addr)
3603 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3604 ignore=ignoreflags)
3605
3606 self.assertEqual(len(ancdata), 1)
3607 self.assertIsInstance(ancdata[0], tuple)
3608 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3609 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3610 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3611 self.assertIsInstance(cmsg_data, bytes)
3612 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3613 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003614 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003615 self.assertGreaterEqual(a[0], 0)
3616 self.assertLessEqual(a[0], maxhop)
3617
3618 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3619 def testRecvHopLimit(self):
3620 # Test receiving the packet hop limit as ancillary data.
3621 self.checkHopLimit(ancbufsize=10240)
3622
3623 @testRecvHopLimit.client_skip
3624 def _testRecvHopLimit(self):
3625 # Need to wait until server has asked to receive ancillary
3626 # data, as implementations are not required to buffer it
3627 # otherwise.
3628 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3629 self.sendToServer(MSG)
3630
3631 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3632 def testRecvHopLimitCMSG_SPACE(self):
3633 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3634 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3635
3636 @testRecvHopLimitCMSG_SPACE.client_skip
3637 def _testRecvHopLimitCMSG_SPACE(self):
3638 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3639 self.sendToServer(MSG)
3640
3641 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3642 # 3542 says portable applications must provide space for trailing
3643 # padding. Implementations may set MSG_CTRUNC if there isn't
3644 # enough space for the padding.
3645
3646 @requireAttrs(socket.socket, "sendmsg")
3647 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3648 def testSetHopLimit(self):
3649 # Test setting hop limit on outgoing packet and receiving it
3650 # at the other end.
3651 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3652
3653 @testSetHopLimit.client_skip
3654 def _testSetHopLimit(self):
3655 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3656 self.assertEqual(
3657 self.sendmsgToServer([MSG],
3658 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3659 array.array("i", [self.hop_limit]))]),
3660 len(MSG))
3661
3662 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3663 ignoreflags=0):
3664 # Receive traffic class and hop limit into ancbufsize bytes of
3665 # ancillary data space. Check that data is MSG, ancillary
3666 # data is not truncated (but ignore any flags in ignoreflags),
3667 # and traffic class and hop limit are in range (hop limit no
3668 # more than maxhop).
3669 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3670 socket.IPV6_RECVHOPLIMIT, 1)
3671 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3672 socket.IPV6_RECVTCLASS, 1)
3673 self.misc_event.set()
3674 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3675 len(MSG), ancbufsize)
3676
3677 self.assertEqual(msg, MSG)
3678 self.checkRecvmsgAddress(addr, self.cli_addr)
3679 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3680 ignore=ignoreflags)
3681 self.assertEqual(len(ancdata), 2)
3682 ancmap = self.ancillaryMapping(ancdata)
3683
3684 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3685 self.assertEqual(len(tcdata), SIZEOF_INT)
3686 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003687 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003688 self.assertGreaterEqual(a[0], 0)
3689 self.assertLessEqual(a[0], 255)
3690
3691 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3692 self.assertEqual(len(hldata), SIZEOF_INT)
3693 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003694 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003695 self.assertGreaterEqual(a[0], 0)
3696 self.assertLessEqual(a[0], maxhop)
3697
3698 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3699 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3700 def testRecvTrafficClassAndHopLimit(self):
3701 # Test receiving traffic class and hop limit as ancillary data.
3702 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3703
3704 @testRecvTrafficClassAndHopLimit.client_skip
3705 def _testRecvTrafficClassAndHopLimit(self):
3706 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3707 self.sendToServer(MSG)
3708
3709 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3710 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3711 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3712 # Test receiving traffic class and hop limit, using
3713 # CMSG_SPACE() to calculate buffer size.
3714 self.checkTrafficClassAndHopLimit(
3715 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3716
3717 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3718 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3719 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3720 self.sendToServer(MSG)
3721
3722 @requireAttrs(socket.socket, "sendmsg")
3723 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3724 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3725 def testSetTrafficClassAndHopLimit(self):
3726 # Test setting traffic class and hop limit on outgoing packet,
3727 # and receiving them at the other end.
3728 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3729 maxhop=self.hop_limit)
3730
3731 @testSetTrafficClassAndHopLimit.client_skip
3732 def _testSetTrafficClassAndHopLimit(self):
3733 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3734 self.assertEqual(
3735 self.sendmsgToServer([MSG],
3736 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3737 array.array("i", [self.traffic_class])),
3738 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3739 array.array("i", [self.hop_limit]))]),
3740 len(MSG))
3741
3742 @requireAttrs(socket.socket, "sendmsg")
3743 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3744 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3745 def testOddCmsgSize(self):
3746 # Try to send ancillary data with first item one byte too
3747 # long. Fall back to sending with correct size if this fails,
3748 # and check that second item was handled correctly.
3749 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3750 maxhop=self.hop_limit)
3751
3752 @testOddCmsgSize.client_skip
3753 def _testOddCmsgSize(self):
3754 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3755 try:
3756 nbytes = self.sendmsgToServer(
3757 [MSG],
3758 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003759 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003760 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3761 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003762 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003763 self.assertIsInstance(e.errno, int)
3764 nbytes = self.sendmsgToServer(
3765 [MSG],
3766 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3767 array.array("i", [self.traffic_class])),
3768 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3769 array.array("i", [self.hop_limit]))])
3770 self.assertEqual(nbytes, len(MSG))
3771
3772 # Tests for proper handling of truncated ancillary data
3773
3774 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3775 # Receive hop limit into ancbufsize bytes of ancillary data
3776 # space, which should be too small to contain the ancillary
3777 # data header (if ancbufsize is None, pass no second argument
3778 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3779 # (unless included in ignoreflags), and no ancillary data is
3780 # returned.
3781 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3782 socket.IPV6_RECVHOPLIMIT, 1)
3783 self.misc_event.set()
3784 args = () if ancbufsize is None else (ancbufsize,)
3785 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3786 len(MSG), *args)
3787
3788 self.assertEqual(msg, MSG)
3789 self.checkRecvmsgAddress(addr, self.cli_addr)
3790 self.assertEqual(ancdata, [])
3791 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3792 ignore=ignoreflags)
3793
3794 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3795 def testCmsgTruncNoBufSize(self):
3796 # Check that no ancillary data is received when no ancillary
3797 # buffer size is provided.
3798 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3799 # BSD seems to set
3800 # MSG_CTRUNC only if an item
3801 # has been partially
3802 # received.
3803 ignoreflags=socket.MSG_CTRUNC)
3804
3805 @testCmsgTruncNoBufSize.client_skip
3806 def _testCmsgTruncNoBufSize(self):
3807 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3808 self.sendToServer(MSG)
3809
3810 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3811 def testSingleCmsgTrunc0(self):
3812 # Check that no ancillary data is received when ancillary
3813 # buffer size is zero.
3814 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3815 ignoreflags=socket.MSG_CTRUNC)
3816
3817 @testSingleCmsgTrunc0.client_skip
3818 def _testSingleCmsgTrunc0(self):
3819 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3820 self.sendToServer(MSG)
3821
3822 # Check that no ancillary data is returned for various non-zero
3823 # (but still too small) buffer sizes.
3824
3825 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3826 def testSingleCmsgTrunc1(self):
3827 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3828
3829 @testSingleCmsgTrunc1.client_skip
3830 def _testSingleCmsgTrunc1(self):
3831 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3832 self.sendToServer(MSG)
3833
3834 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3835 def testSingleCmsgTrunc2Int(self):
3836 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3837
3838 @testSingleCmsgTrunc2Int.client_skip
3839 def _testSingleCmsgTrunc2Int(self):
3840 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3841 self.sendToServer(MSG)
3842
3843 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3844 def testSingleCmsgTruncLen0Minus1(self):
3845 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3846
3847 @testSingleCmsgTruncLen0Minus1.client_skip
3848 def _testSingleCmsgTruncLen0Minus1(self):
3849 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3850 self.sendToServer(MSG)
3851
3852 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3853 def testSingleCmsgTruncInData(self):
3854 # Test truncation of a control message inside its associated
3855 # data. The message may be returned with its data truncated,
3856 # or not returned at all.
3857 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3858 socket.IPV6_RECVHOPLIMIT, 1)
3859 self.misc_event.set()
3860 msg, ancdata, flags, addr = self.doRecvmsg(
3861 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3862
3863 self.assertEqual(msg, MSG)
3864 self.checkRecvmsgAddress(addr, self.cli_addr)
3865 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3866
3867 self.assertLessEqual(len(ancdata), 1)
3868 if ancdata:
3869 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3870 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3871 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3872 self.assertLess(len(cmsg_data), SIZEOF_INT)
3873
3874 @testSingleCmsgTruncInData.client_skip
3875 def _testSingleCmsgTruncInData(self):
3876 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3877 self.sendToServer(MSG)
3878
3879 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3880 # Receive traffic class and hop limit into ancbufsize bytes of
3881 # ancillary data space, which should be large enough to
3882 # contain the first item, but too small to contain the header
3883 # of the second. Check that data is MSG, MSG_CTRUNC is set
3884 # (unless included in ignoreflags), and only one ancillary
3885 # data item is returned.
3886 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3887 socket.IPV6_RECVHOPLIMIT, 1)
3888 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3889 socket.IPV6_RECVTCLASS, 1)
3890 self.misc_event.set()
3891 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3892 len(MSG), ancbufsize)
3893
3894 self.assertEqual(msg, MSG)
3895 self.checkRecvmsgAddress(addr, self.cli_addr)
3896 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3897 ignore=ignoreflags)
3898
3899 self.assertEqual(len(ancdata), 1)
3900 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3901 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3902 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3903 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3904 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003905 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003906 self.assertGreaterEqual(a[0], 0)
3907 self.assertLessEqual(a[0], 255)
3908
3909 # Try the above test with various buffer sizes.
3910
3911 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3912 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3913 def testSecondCmsgTrunc0(self):
3914 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3915 ignoreflags=socket.MSG_CTRUNC)
3916
3917 @testSecondCmsgTrunc0.client_skip
3918 def _testSecondCmsgTrunc0(self):
3919 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3920 self.sendToServer(MSG)
3921
3922 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3923 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3924 def testSecondCmsgTrunc1(self):
3925 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3926
3927 @testSecondCmsgTrunc1.client_skip
3928 def _testSecondCmsgTrunc1(self):
3929 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3930 self.sendToServer(MSG)
3931
3932 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3933 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3934 def testSecondCmsgTrunc2Int(self):
3935 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3936 2 * SIZEOF_INT)
3937
3938 @testSecondCmsgTrunc2Int.client_skip
3939 def _testSecondCmsgTrunc2Int(self):
3940 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3941 self.sendToServer(MSG)
3942
3943 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3944 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3945 def testSecondCmsgTruncLen0Minus1(self):
3946 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3947 socket.CMSG_LEN(0) - 1)
3948
3949 @testSecondCmsgTruncLen0Minus1.client_skip
3950 def _testSecondCmsgTruncLen0Minus1(self):
3951 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3952 self.sendToServer(MSG)
3953
3954 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3955 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3956 def testSecomdCmsgTruncInData(self):
3957 # Test truncation of the second of two control messages inside
3958 # its associated data.
3959 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3960 socket.IPV6_RECVHOPLIMIT, 1)
3961 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3962 socket.IPV6_RECVTCLASS, 1)
3963 self.misc_event.set()
3964 msg, ancdata, flags, addr = self.doRecvmsg(
3965 self.serv_sock, len(MSG),
3966 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3967
3968 self.assertEqual(msg, MSG)
3969 self.checkRecvmsgAddress(addr, self.cli_addr)
3970 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3971
3972 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3973
3974 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3975 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3976 cmsg_types.remove(cmsg_type)
3977 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3978 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003979 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003980 self.assertGreaterEqual(a[0], 0)
3981 self.assertLessEqual(a[0], 255)
3982
3983 if ancdata:
3984 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3985 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3986 cmsg_types.remove(cmsg_type)
3987 self.assertLess(len(cmsg_data), SIZEOF_INT)
3988
3989 self.assertEqual(ancdata, [])
3990
3991 @testSecomdCmsgTruncInData.client_skip
3992 def _testSecomdCmsgTruncInData(self):
3993 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3994 self.sendToServer(MSG)
3995
3996
3997# Derive concrete test classes for different socket types.
3998
3999class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
4000 SendrecvmsgConnectionlessBase,
4001 ThreadedSocketTestMixin, UDPTestBase):
4002 pass
4003
4004@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004005class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
4006 pass
4007
4008@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004009class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
4010 pass
4011
4012@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004013class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
4014 pass
4015
4016
4017class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
4018 SendrecvmsgConnectionlessBase,
4019 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02004020
4021 def checkRecvmsgAddress(self, addr1, addr2):
4022 # Called to compare the received address with the address of
4023 # the peer, ignoring scope ID
4024 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004025
4026@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004027@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004028@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004029class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
4030 pass
4031
4032@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004033@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004034@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004035class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
4036 pass
4037
4038@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004039@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004040@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004041class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
4042 pass
4043
4044@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004045@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004046@requireAttrs(socket, "IPPROTO_IPV6")
4047@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004048class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
4049 SendrecvmsgUDP6TestBase):
4050 pass
4051
4052@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004053@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054@requireAttrs(socket, "IPPROTO_IPV6")
4055@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004056class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4057 RFC3542AncillaryTest,
4058 SendrecvmsgUDP6TestBase):
4059 pass
4060
4061
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07004062@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4063 'UDPLITE sockets required for this test.')
4064class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
4065 SendrecvmsgConnectionlessBase,
4066 ThreadedSocketTestMixin, UDPLITETestBase):
4067 pass
4068
4069@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4070 'UDPLITE sockets required for this test.')
4071@requireAttrs(socket.socket, "sendmsg")
4072class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
4073 pass
4074
4075@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4076 'UDPLITE sockets required for this test.')
4077@requireAttrs(socket.socket, "recvmsg")
4078class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
4079 pass
4080
4081@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4082 'UDPLITE sockets required for this test.')
4083@requireAttrs(socket.socket, "recvmsg_into")
4084class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
4085 pass
4086
4087
4088@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4089 'UDPLITE sockets required for this test.')
4090class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
4091 SendrecvmsgConnectionlessBase,
4092 ThreadedSocketTestMixin, UDPLITE6TestBase):
4093
4094 def checkRecvmsgAddress(self, addr1, addr2):
4095 # Called to compare the received address with the address of
4096 # the peer, ignoring scope ID
4097 self.assertEqual(addr1[:-1], addr2[:-1])
4098
4099@requireAttrs(socket.socket, "sendmsg")
4100@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4101@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4102 'UDPLITE sockets required for this test.')
4103@requireSocket("AF_INET6", "SOCK_DGRAM")
4104class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
4105 pass
4106
4107@requireAttrs(socket.socket, "recvmsg")
4108@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4109@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4110 'UDPLITE sockets required for this test.')
4111@requireSocket("AF_INET6", "SOCK_DGRAM")
4112class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
4113 pass
4114
4115@requireAttrs(socket.socket, "recvmsg_into")
4116@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4117@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4118 'UDPLITE sockets required for this test.')
4119@requireSocket("AF_INET6", "SOCK_DGRAM")
4120class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
4121 pass
4122
4123@requireAttrs(socket.socket, "recvmsg")
4124@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4125@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4126 'UDPLITE sockets required for this test.')
4127@requireAttrs(socket, "IPPROTO_IPV6")
4128@requireSocket("AF_INET6", "SOCK_DGRAM")
4129class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
4130 SendrecvmsgUDPLITE6TestBase):
4131 pass
4132
4133@requireAttrs(socket.socket, "recvmsg_into")
4134@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
4135@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
4136 'UDPLITE sockets required for this test.')
4137@requireAttrs(socket, "IPPROTO_IPV6")
4138@requireSocket("AF_INET6", "SOCK_DGRAM")
4139class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
4140 RFC3542AncillaryTest,
4141 SendrecvmsgUDPLITE6TestBase):
4142 pass
4143
4144
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004145class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4146 ConnectedStreamTestMixin, TCPTestBase):
4147 pass
4148
4149@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004150class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4151 pass
4152
4153@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004154class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4155 SendrecvmsgTCPTestBase):
4156 pass
4157
4158@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004159class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4160 SendrecvmsgTCPTestBase):
4161 pass
4162
4163
4164class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4165 SendrecvmsgConnectedBase,
4166 ConnectedStreamTestMixin, SCTPStreamBase):
4167 pass
4168
4169@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004170@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004171@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004172class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4173 pass
4174
4175@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004176@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004177@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004178class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4179 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004180
4181 def testRecvmsgEOF(self):
4182 try:
4183 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4184 except OSError as e:
4185 if e.errno != errno.ENOTCONN:
4186 raise
4187 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004188
4189@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004190@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004191@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004192class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4193 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004194
4195 def testRecvmsgEOF(self):
4196 try:
4197 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4198 except OSError as e:
4199 if e.errno != errno.ENOTCONN:
4200 raise
4201 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004202
4203
4204class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4205 ConnectedStreamTestMixin, UnixStreamBase):
4206 pass
4207
4208@requireAttrs(socket.socket, "sendmsg")
4209@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004210class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4211 pass
4212
4213@requireAttrs(socket.socket, "recvmsg")
4214@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004215class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4216 SendrecvmsgUnixStreamTestBase):
4217 pass
4218
4219@requireAttrs(socket.socket, "recvmsg_into")
4220@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4222 SendrecvmsgUnixStreamTestBase):
4223 pass
4224
4225@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4226@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004227class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4228 pass
4229
4230@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4231@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004232class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4233 SendrecvmsgUnixStreamTestBase):
4234 pass
4235
4236
4237# Test interrupting the interruptible send/receive methods with a
4238# signal when a timeout is set. These tests avoid having multiple
4239# threads alive during the test so that the OS cannot deliver the
4240# signal to the wrong one.
4241
4242class InterruptedTimeoutBase(unittest.TestCase):
4243 # Base class for interrupted send/receive tests. Installs an
4244 # empty handler for SIGALRM and removes it on teardown, along with
4245 # any scheduled alarms.
4246
4247 def setUp(self):
4248 super().setUp()
4249 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004250 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004251 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004252
4253 # Timeout for socket operations
4254 timeout = 4.0
4255
4256 # Provide setAlarm() method to schedule delivery of SIGALRM after
4257 # given number of seconds, or cancel it if zero, and an
4258 # appropriate time value to use. Use setitimer() if available.
4259 if hasattr(signal, "setitimer"):
4260 alarm_time = 0.05
4261
4262 def setAlarm(self, seconds):
4263 signal.setitimer(signal.ITIMER_REAL, seconds)
4264 else:
4265 # Old systems may deliver the alarm up to one second early
4266 alarm_time = 2
4267
4268 def setAlarm(self, seconds):
4269 signal.alarm(seconds)
4270
4271
4272# Require siginterrupt() in order to ensure that system calls are
4273# interrupted by default.
4274@requireAttrs(signal, "siginterrupt")
4275@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4276 "Don't have signal.alarm or signal.setitimer")
4277class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4278 # Test interrupting the recv*() methods with signals when a
4279 # timeout is set.
4280
4281 def setUp(self):
4282 super().setUp()
4283 self.serv.settimeout(self.timeout)
4284
4285 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004286 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004287 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004288 try:
4289 self.setAlarm(self.alarm_time)
4290 with self.assertRaises(ZeroDivisionError) as cm:
4291 func(*args, **kwargs)
4292 finally:
4293 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004294
4295 def testInterruptedRecvTimeout(self):
4296 self.checkInterruptedRecv(self.serv.recv, 1024)
4297
4298 def testInterruptedRecvIntoTimeout(self):
4299 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4300
4301 def testInterruptedRecvfromTimeout(self):
4302 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4303
4304 def testInterruptedRecvfromIntoTimeout(self):
4305 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4306
4307 @requireAttrs(socket.socket, "recvmsg")
4308 def testInterruptedRecvmsgTimeout(self):
4309 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4310
4311 @requireAttrs(socket.socket, "recvmsg_into")
4312 def testInterruptedRecvmsgIntoTimeout(self):
4313 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4314
4315
4316# Require siginterrupt() in order to ensure that system calls are
4317# interrupted by default.
4318@requireAttrs(signal, "siginterrupt")
4319@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4320 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4322 ThreadSafeCleanupTestCase,
4323 SocketListeningTestMixin, TCPTestBase):
4324 # Test interrupting the interruptible send*() methods with signals
4325 # when a timeout is set.
4326
4327 def setUp(self):
4328 super().setUp()
4329 self.serv_conn = self.newSocket()
4330 self.addCleanup(self.serv_conn.close)
4331 # Use a thread to complete the connection, but wait for it to
4332 # terminate before running the test, so that there is only one
4333 # thread to accept the signal.
4334 cli_thread = threading.Thread(target=self.doConnect)
4335 cli_thread.start()
4336 self.cli_conn, addr = self.serv.accept()
4337 self.addCleanup(self.cli_conn.close)
4338 cli_thread.join()
4339 self.serv_conn.settimeout(self.timeout)
4340
4341 def doConnect(self):
4342 self.serv_conn.connect(self.serv_addr)
4343
4344 def checkInterruptedSend(self, func, *args, **kwargs):
4345 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004346 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004347 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004348 try:
4349 with self.assertRaises(ZeroDivisionError) as cm:
4350 while True:
4351 self.setAlarm(self.alarm_time)
4352 func(*args, **kwargs)
4353 finally:
4354 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004355
Ned Deilyc5640382014-02-03 13:58:31 -08004356 # Issue #12958: The following tests have problems on OS X prior to 10.7
4357 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004358 def testInterruptedSendTimeout(self):
4359 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4360
Ned Deilyc5640382014-02-03 13:58:31 -08004361 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004362 def testInterruptedSendtoTimeout(self):
4363 # Passing an actual address here as Python's wrapper for
4364 # sendto() doesn't allow passing a zero-length one; POSIX
4365 # requires that the address is ignored since the socket is
4366 # connection-mode, however.
4367 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4368 self.serv_addr)
4369
Ned Deilyc5640382014-02-03 13:58:31 -08004370 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004371 @requireAttrs(socket.socket, "sendmsg")
4372 def testInterruptedSendmsgTimeout(self):
4373 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4374
4375
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004376class TCPCloserTest(ThreadedTCPSocketTest):
4377
4378 def testClose(self):
4379 conn, addr = self.serv.accept()
4380 conn.close()
4381
4382 sd = self.cli
4383 read, write, err = select.select([sd], [], [], 1.0)
4384 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004385 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004386
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004387 # Calling close() many times should be safe.
4388 conn.close()
4389 conn.close()
4390
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004391 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004392 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004393 time.sleep(1.0)
4394
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004395
Dave Cole331708b2004-08-09 04:51:41 +00004396class BasicSocketPairTest(SocketPairTest):
4397
4398 def __init__(self, methodName='runTest'):
4399 SocketPairTest.__init__(self, methodName=methodName)
4400
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004401 def _check_defaults(self, sock):
4402 self.assertIsInstance(sock, socket.socket)
4403 if hasattr(socket, 'AF_UNIX'):
4404 self.assertEqual(sock.family, socket.AF_UNIX)
4405 else:
4406 self.assertEqual(sock.family, socket.AF_INET)
4407 self.assertEqual(sock.type, socket.SOCK_STREAM)
4408 self.assertEqual(sock.proto, 0)
4409
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004410 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004411 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004412
4413 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004414 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004415
Dave Cole331708b2004-08-09 04:51:41 +00004416 def testRecv(self):
4417 msg = self.serv.recv(1024)
4418 self.assertEqual(msg, MSG)
4419
4420 def _testRecv(self):
4421 self.cli.send(MSG)
4422
4423 def testSend(self):
4424 self.serv.send(MSG)
4425
4426 def _testSend(self):
4427 msg = self.cli.recv(1024)
4428 self.assertEqual(msg, MSG)
4429
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004430
Guido van Rossum24e4af82002-06-12 19:18:08 +00004431class NonBlockingTCPTests(ThreadedTCPSocketTest):
4432
4433 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004434 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004435 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4436
Victor Stinner304315d2018-11-30 13:22:44 +01004437 def assert_sock_timeout(self, sock, timeout):
4438 self.assertEqual(self.serv.gettimeout(), timeout)
4439
4440 blocking = (timeout != 0.0)
4441 self.assertEqual(sock.getblocking(), blocking)
4442
4443 if fcntl is not None:
4444 # When a Python socket has a non-zero timeout, it's switched
4445 # internally to a non-blocking mode. Later, sock.sendall(),
4446 # sock.recv(), and other socket operations use a select() call and
4447 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4448 # timeouts are enforced.
4449 fd_blocking = (timeout is None)
4450
4451 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4452 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4453
Guido van Rossum24e4af82002-06-12 19:18:08 +00004454 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004455 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004456 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004457 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004458
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004459 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004460 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004461
4462 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004463 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004464
4465 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004466 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004467
4468 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004469 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004470
4471 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004472 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004473
4474 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004475 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004476
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004477 @support.cpython_only
4478 def testSetBlocking_overflow(self):
4479 # Issue 15989
4480 import _testcapi
4481 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4482 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004483
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004484 self.serv.setblocking(False)
4485 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004486
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004487 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4488 self.assertIsNone(self.serv.gettimeout())
4489
4490 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4491
Serhiy Storchaka43767632013-11-03 21:31:38 +02004492 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4493 'test needs socket.SOCK_NONBLOCK')
4494 @support.requires_linux_version(2, 6, 28)
4495 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004496 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004497 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004498 self.serv = socket.socket(socket.AF_INET,
4499 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4500 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004501
4502 def _testInitNonBlocking(self):
4503 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004504
Victor Stinner304315d2018-11-30 13:22:44 +01004505 def testInheritFlagsBlocking(self):
4506 # bpo-7995: accept() on a listening socket with a timeout and the
4507 # default timeout is None, the resulting socket must be blocking.
4508 with socket_setdefaulttimeout(None):
4509 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004510 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004511 self.addCleanup(conn.close)
4512 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004513
Victor Stinner304315d2018-11-30 13:22:44 +01004514 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004515 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004516
4517 def testInheritFlagsTimeout(self):
4518 # bpo-7995: accept() on a listening socket with a timeout and the
4519 # default timeout is None, the resulting socket must inherit
4520 # the default timeout.
4521 default_timeout = 20.0
4522 with socket_setdefaulttimeout(default_timeout):
4523 self.serv.settimeout(10)
4524 conn, addr = self.serv.accept()
4525 self.addCleanup(conn.close)
4526 self.assertEqual(conn.gettimeout(), default_timeout)
4527
4528 def _testInheritFlagsTimeout(self):
4529 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004530
Guido van Rossum24e4af82002-06-12 19:18:08 +00004531 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004532 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004533 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004534
4535 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004536 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004537 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004538 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004539 dt = time.monotonic() - start_time
4540 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004541
4542 self.event.set()
4543
4544 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4545 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004546 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004547
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004548 # connect() completed: non-blocking accept() doesn't block
4549 conn, addr = self.serv.accept()
4550 self.addCleanup(conn.close)
4551 self.assertIsNone(conn.gettimeout())
4552
Guido van Rossum24e4af82002-06-12 19:18:08 +00004553 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004554 # don't connect before event is set to check
4555 # that non-blocking accept() raises BlockingIOError
4556 self.event.wait()
4557
Christian Heimes5e696852008-04-09 08:37:03 +00004558 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004559
Guido van Rossum24e4af82002-06-12 19:18:08 +00004560 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004561 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004562 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004563 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004564 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004565
4566 # the server didn't send data yet: non-blocking recv() fails
4567 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004568 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004569
4570 self.event.set()
4571
4572 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4573 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004574 self.fail("Error during select call to non-blocking socket.")
4575
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004576 # the server sent data yet: non-blocking recv() doesn't block
4577 msg = conn.recv(len(MSG))
4578 self.assertEqual(msg, MSG)
4579
Guido van Rossum24e4af82002-06-12 19:18:08 +00004580 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004581 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004582
4583 # don't send anything before event is set to check
4584 # that non-blocking recv() raises BlockingIOError
4585 self.event.wait()
4586
4587 # send data: recv() will no longer block
4588 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004589
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004590
Guido van Rossum24e4af82002-06-12 19:18:08 +00004591class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004592 """Unit tests for the object returned by socket.makefile()
4593
Antoine Pitrou834bd812010-10-13 16:17:14 +00004594 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004595 the client connection. You can read from this file to
4596 get output from the server.
4597
Antoine Pitrou834bd812010-10-13 16:17:14 +00004598 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004599 server connection. You can write to this file to send output
4600 to the client.
4601 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004602
Guido van Rossume9f66142002-08-07 15:46:19 +00004603 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004604 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004605 errors = 'strict'
4606 newline = None
4607
4608 read_mode = 'rb'
4609 read_msg = MSG
4610 write_mode = 'wb'
4611 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004612
Guido van Rossum24e4af82002-06-12 19:18:08 +00004613 def __init__(self, methodName='runTest'):
4614 SocketConnectedTest.__init__(self, methodName=methodName)
4615
4616 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004617 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4618 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004619 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004620 self.read_file = self.cli_conn.makefile(
4621 self.read_mode, self.bufsize,
4622 encoding = self.encoding,
4623 errors = self.errors,
4624 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004625
4626 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004627 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004628 self.read_file.close()
4629 self.assertTrue(self.read_file.closed)
4630 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004631 SocketConnectedTest.tearDown(self)
4632
4633 def clientSetUp(self):
4634 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004635 self.write_file = self.serv_conn.makefile(
4636 self.write_mode, self.bufsize,
4637 encoding = self.encoding,
4638 errors = self.errors,
4639 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004640
4641 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004642 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004643 self.write_file.close()
4644 self.assertTrue(self.write_file.closed)
4645 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004646 SocketConnectedTest.clientTearDown(self)
4647
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004648 def testReadAfterTimeout(self):
4649 # Issue #7322: A file object must disallow further reads
4650 # after a timeout has occurred.
4651 self.cli_conn.settimeout(1)
4652 self.read_file.read(3)
4653 # First read raises a timeout
4654 self.assertRaises(socket.timeout, self.read_file.read, 1)
4655 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004656 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004657 self.read_file.read(1)
4658 self.assertIn("cannot read from timed out object", str(ctx.exception))
4659
4660 def _testReadAfterTimeout(self):
4661 self.write_file.write(self.write_msg[0:3])
4662 self.write_file.flush()
4663 self.serv_finished.wait()
4664
Guido van Rossum24e4af82002-06-12 19:18:08 +00004665 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004666 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004667 first_seg = self.read_file.read(len(self.read_msg)-3)
4668 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004669 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004670 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004671
4672 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004673 self.write_file.write(self.write_msg)
4674 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004675
Guido van Rossum8c943832002-08-08 01:00:28 +00004676 def testFullRead(self):
4677 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004678 msg = self.read_file.read()
4679 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004680
4681 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004682 self.write_file.write(self.write_msg)
4683 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004684
Guido van Rossum24e4af82002-06-12 19:18:08 +00004685 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004686 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004687 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004688 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004689 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004690 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004691 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004692 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004693 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004694
4695 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004696 self.write_file.write(self.write_msg)
4697 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004698
4699 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004700 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004701 line = self.read_file.readline()
4702 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004703
4704 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004705 self.write_file.write(self.write_msg)
4706 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004707
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004708 def testCloseAfterMakefile(self):
4709 # The file returned by makefile should keep the socket open.
4710 self.cli_conn.close()
4711 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004712 msg = self.read_file.read()
4713 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004714
4715 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004716 self.write_file.write(self.write_msg)
4717 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004718
4719 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004720 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004721 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004722 if isinstance(self.read_msg, str):
4723 msg = msg.decode()
4724 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004725
4726 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004727 self.write_file.write(self.write_msg)
4728 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004729
Tim Peters116d83c2004-03-28 02:20:45 +00004730 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004731 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004732
4733 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004734 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004735
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004736 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004737 self.assertEqual(self.read_file.mode, self.read_mode)
4738 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004739
4740 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004741 self.assertEqual(self.write_file.mode, self.write_mode)
4742 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004743
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004744 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004745 self.read_file.close()
4746 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004747 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004748 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004749
4750 def _testRealClose(self):
4751 pass
4752
4753
Guido van Rossume9f66142002-08-07 15:46:19 +00004754class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4755
4756 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004757
Guido van Rossume9f66142002-08-07 15:46:19 +00004758 In this case (and in this case only), it should be possible to
4759 create a file object, read a line from it, create another file
4760 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004761 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004762 when reading multiple requests from the same socket."""
4763
4764 bufsize = 0 # Use unbuffered mode
4765
4766 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004767 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004768 line = self.read_file.readline() # first line
4769 self.assertEqual(line, b"A. " + self.write_msg) # first line
4770 self.read_file = self.cli_conn.makefile('rb', 0)
4771 line = self.read_file.readline() # second line
4772 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004773
4774 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004775 self.write_file.write(b"A. " + self.write_msg)
4776 self.write_file.write(b"B. " + self.write_msg)
4777 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004778
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004779 def testMakefileClose(self):
4780 # The file returned by makefile should keep the socket open...
4781 self.cli_conn.close()
4782 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004783 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004784 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004785 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004786 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004787
4788 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004789 self.write_file.write(self.write_msg)
4790 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004791
4792 def testMakefileCloseSocketDestroy(self):
4793 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004794 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004795 refcount_after = sys.getrefcount(self.cli_conn)
4796 self.assertEqual(refcount_before - 1, refcount_after)
4797
4798 def _testMakefileCloseSocketDestroy(self):
4799 pass
4800
Antoine Pitrou98b46702010-09-18 22:59:00 +00004801 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004802 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004803 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4804
4805 def testSmallReadNonBlocking(self):
4806 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004807 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4808 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004809 self.evt1.set()
4810 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004811 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004812 if first_seg is None:
4813 # Data not arrived (can happen under Windows), wait a bit
4814 time.sleep(0.5)
4815 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004816 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004817 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004818 self.assertEqual(n, 3)
4819 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004820 self.assertEqual(msg, self.read_msg)
4821 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4822 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004823
4824 def _testSmallReadNonBlocking(self):
4825 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004826 self.write_file.write(self.write_msg)
4827 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004828 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004829 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004830 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4831 self.serv_finished.wait(5.0)
4832
4833 def testWriteNonBlocking(self):
4834 self.cli_finished.wait(5.0)
4835 # The client thread can't skip directly - the SkipTest exception
4836 # would appear as a failure.
4837 if self.serv_skipped:
4838 self.skipTest(self.serv_skipped)
4839
4840 def _testWriteNonBlocking(self):
4841 self.serv_skipped = None
4842 self.serv_conn.setblocking(False)
4843 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004844 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004845 LIMIT = 10
4846 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004847 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004848 self.assertGreater(n, 0)
4849 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004850 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004851 if n is None:
4852 # Succeeded
4853 break
4854 self.assertGreater(n, 0)
4855 else:
4856 # Let us know that this test didn't manage to establish
4857 # the expected conditions. This is not a failure in itself but,
4858 # if it happens repeatedly, the test should be fixed.
4859 self.serv_skipped = "failed to saturate the socket buffer"
4860
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004861
Guido van Rossum8c943832002-08-08 01:00:28 +00004862class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4863
4864 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4865
4866
4867class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4868
4869 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004870
Thomas Woutersb2137042007-02-01 18:02:27 +00004871
Antoine Pitrou834bd812010-10-13 16:17:14 +00004872class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4873 """Tests for socket.makefile() in text mode (rather than binary)"""
4874
4875 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004876 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004877 write_mode = 'wb'
4878 write_msg = MSG
4879 newline = ''
4880
4881
4882class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4883 """Tests for socket.makefile() in text mode (rather than binary)"""
4884
4885 read_mode = 'rb'
4886 read_msg = MSG
4887 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004888 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004889 newline = ''
4890
4891
4892class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4893 """Tests for socket.makefile() in text mode (rather than binary)"""
4894
4895 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004896 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004897 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004898 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004899 newline = ''
4900
4901
Guido van Rossumd8faa362007-04-27 19:54:29 +00004902class NetworkConnectionTest(object):
4903 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004904
Guido van Rossumd8faa362007-04-27 19:54:29 +00004905 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004906 # We're inherited below by BasicTCPTest2, which also inherits
4907 # BasicTCPTest, which defines self.port referenced below.
4908 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004909 self.serv_conn = self.cli
4910
4911class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4912 """Tests that NetworkConnection does not break existing TCP functionality.
4913 """
4914
4915class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004916
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004917 class MockSocket(socket.socket):
4918 def connect(self, *args):
4919 raise socket.timeout('timed out')
4920
4921 @contextlib.contextmanager
4922 def mocked_socket_module(self):
4923 """Return a socket which times out on connect"""
4924 old_socket = socket.socket
4925 socket.socket = self.MockSocket
4926 try:
4927 yield
4928 finally:
4929 socket.socket = old_socket
4930
4931 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004932 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004933 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004934 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004935 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004936 cli.connect((HOST, port))
4937 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4938
4939 def test_create_connection(self):
4940 # Issue #9792: errors raised by create_connection() should have
4941 # a proper errno attribute.
4942 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004943 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004944 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004945
4946 # Issue #16257: create_connection() calls getaddrinfo() against
4947 # 'localhost'. This may result in an IPV6 addr being returned
4948 # as well as an IPV4 one:
4949 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4950 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4951 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4952 #
4953 # create_connection() enumerates through all the addresses returned
4954 # and if it doesn't successfully bind to any of them, it propagates
4955 # the last exception it encountered.
4956 #
4957 # On Solaris, ENETUNREACH is returned in this circumstance instead
4958 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4959 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02004960 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04004961 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004962
4963 def test_create_connection_timeout(self):
4964 # Issue #9792: create_connection() should not recast timeout errors
4965 # as generic socket errors.
4966 with self.mocked_socket_module():
4967 with self.assertRaises(socket.timeout):
4968 socket.create_connection((HOST, 1234))
4969
Guido van Rossumd8faa362007-04-27 19:54:29 +00004970
4971class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4972
4973 def __init__(self, methodName='runTest'):
4974 SocketTCPTest.__init__(self, methodName=methodName)
4975 ThreadableTest.__init__(self)
4976
4977 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004978 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004979
4980 def clientTearDown(self):
4981 self.cli.close()
4982 self.cli = None
4983 ThreadableTest.clientTearDown(self)
4984
4985 def _justAccept(self):
4986 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004987 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004988
4989 testFamily = _justAccept
4990 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004991 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004992 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004993 self.assertEqual(self.cli.family, 2)
4994
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004995 testSourceAddress = _justAccept
4996 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004997 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4998 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004999 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00005000 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00005001 # The port number being used is sufficient to show that the bind()
5002 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00005003
Guido van Rossumd8faa362007-04-27 19:54:29 +00005004 testTimeoutDefault = _justAccept
5005 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00005006 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005007 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005008 socket.setdefaulttimeout(42)
5009 try:
5010 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00005011 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005012 finally:
5013 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00005014 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005015
5016 testTimeoutNone = _justAccept
5017 def _testTimeoutNone(self):
5018 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005019 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005020 socket.setdefaulttimeout(30)
5021 try:
5022 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005023 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00005024 finally:
5025 socket.setdefaulttimeout(None)
5026 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005027
5028 testTimeoutValueNamed = _justAccept
5029 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005030 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005031 self.assertEqual(self.cli.gettimeout(), 30)
5032
5033 testTimeoutValueNonamed = _justAccept
5034 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005035 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00005036 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005037 self.assertEqual(self.cli.gettimeout(), 30)
5038
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005039
Guido van Rossumd8faa362007-04-27 19:54:29 +00005040class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
5041
5042 def __init__(self, methodName='runTest'):
5043 SocketTCPTest.__init__(self, methodName=methodName)
5044 ThreadableTest.__init__(self)
5045
5046 def clientSetUp(self):
5047 pass
5048
5049 def clientTearDown(self):
5050 self.cli.close()
5051 self.cli = None
5052 ThreadableTest.clientTearDown(self)
5053
5054 def testInsideTimeout(self):
5055 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005056 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00005057 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005058 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005059 testOutsideTimeout = testInsideTimeout
5060
5061 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005062 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005063 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005064 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00005065
5066 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00005067 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005068 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00005069
5070
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005071class TCPTimeoutTest(SocketTCPTest):
5072
5073 def testTCPTimeout(self):
5074 def raise_timeout(*args, **kwargs):
5075 self.serv.settimeout(1.0)
5076 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005077 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005078 "Error generating a timeout exception (TCP)")
5079
5080 def testTimeoutZero(self):
5081 ok = False
5082 try:
5083 self.serv.settimeout(0.0)
5084 foo = self.serv.accept()
5085 except socket.timeout:
5086 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005087 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005088 ok = True
5089 except:
5090 self.fail("caught unexpected exception (TCP)")
5091 if not ok:
5092 self.fail("accept() returned success when we did not expect it")
5093
Serhiy Storchaka43767632013-11-03 21:31:38 +02005094 @unittest.skipUnless(hasattr(signal, 'alarm'),
5095 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005096 def testInterruptedTimeout(self):
5097 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06005098 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005099 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005100 self.serv.settimeout(5.0) # must be longer than alarm
5101 class Alarm(Exception):
5102 pass
5103 def alarm_handler(signal, frame):
5104 raise Alarm
5105 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
5106 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005107 try:
Victor Stinner9abee722017-09-19 09:36:54 -07005108 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005109 foo = self.serv.accept()
5110 except socket.timeout:
5111 self.fail("caught timeout instead of Alarm")
5112 except Alarm:
5113 pass
5114 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00005115 self.fail("caught other exception instead of Alarm:"
5116 " %s(%s):\n%s" %
5117 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005118 else:
5119 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00005120 finally:
5121 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005122 except Alarm:
5123 self.fail("got Alarm in wrong place")
5124 finally:
5125 # no alarm can be pending. Safe to restore old handler.
5126 signal.signal(signal.SIGALRM, old_alarm)
5127
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005128class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005129
5130 def testUDPTimeout(self):
5131 def raise_timeout(*args, **kwargs):
5132 self.serv.settimeout(1.0)
5133 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005134 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005135 "Error generating a timeout exception (UDP)")
5136
5137 def testTimeoutZero(self):
5138 ok = False
5139 try:
5140 self.serv.settimeout(0.0)
5141 foo = self.serv.recv(1024)
5142 except socket.timeout:
5143 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005144 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005145 ok = True
5146 except:
5147 self.fail("caught unexpected exception (UDP)")
5148 if not ok:
5149 self.fail("recv() returned success when we did not expect it")
5150
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07005151@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
5152 'UDPLITE sockets required for this test.')
5153class UDPLITETimeoutTest(SocketUDPLITETest):
5154
5155 def testUDPLITETimeout(self):
5156 def raise_timeout(*args, **kwargs):
5157 self.serv.settimeout(1.0)
5158 self.serv.recv(1024)
5159 self.assertRaises(socket.timeout, raise_timeout,
5160 "Error generating a timeout exception (UDPLITE)")
5161
5162 def testTimeoutZero(self):
5163 ok = False
5164 try:
5165 self.serv.settimeout(0.0)
5166 foo = self.serv.recv(1024)
5167 except socket.timeout:
5168 self.fail("caught timeout instead of error (UDPLITE)")
5169 except OSError:
5170 ok = True
5171 except:
5172 self.fail("caught unexpected exception (UDPLITE)")
5173 if not ok:
5174 self.fail("recv() returned success when we did not expect it")
5175
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005176class TestExceptions(unittest.TestCase):
5177
5178 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005179 self.assertTrue(issubclass(OSError, Exception))
5180 self.assertTrue(issubclass(socket.herror, OSError))
5181 self.assertTrue(issubclass(socket.gaierror, OSError))
5182 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005183
Yury Selivanovfa22b292016-10-18 16:03:52 -04005184 def test_setblocking_invalidfd(self):
5185 # Regression test for issue #28471
5186
5187 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5188 sock = socket.socket(
5189 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5190 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005191 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005192
5193 with self.assertRaises(OSError):
5194 sock.setblocking(False)
5195
5196
Serhiy Storchaka43767632013-11-03 21:31:38 +02005197@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005198class TestLinuxAbstractNamespace(unittest.TestCase):
5199
5200 UNIX_PATH_MAX = 108
5201
5202 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005203 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005204 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5205 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005206 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005207 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5208 s2.connect(s1.getsockname())
5209 with s1.accept()[0] as s3:
5210 self.assertEqual(s1.getsockname(), address)
5211 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005212
5213 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005214 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005215 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5216 s.bind(address)
5217 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005218
5219 def testNameOverflow(self):
5220 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005221 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005222 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005223
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005224 def testStrName(self):
5225 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005226 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5227 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005228 s.bind("\x00python\x00test\x00")
5229 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005230 finally:
5231 s.close()
5232
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005233 def testBytearrayName(self):
5234 # Check that an abstract name can be passed as a bytearray.
5235 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5236 s.bind(bytearray(b"\x00python\x00test\x00"))
5237 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5238
Serhiy Storchaka43767632013-11-03 21:31:38 +02005239@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005240class TestUnixDomain(unittest.TestCase):
5241
5242 def setUp(self):
5243 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5244
5245 def tearDown(self):
5246 self.sock.close()
5247
5248 def encoded(self, path):
5249 # Return the given path encoded in the file system encoding,
5250 # or skip the test if this is not possible.
5251 try:
5252 return os.fsencode(path)
5253 except UnicodeEncodeError:
5254 self.skipTest(
5255 "Pathname {0!a} cannot be represented in file "
5256 "system encoding {1!r}".format(
5257 path, sys.getfilesystemencoding()))
5258
Antoine Pitrou16374872011-12-16 15:04:12 +01005259 def bind(self, sock, path):
5260 # Bind the socket
5261 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005262 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005263 except OSError as e:
5264 if str(e) == "AF_UNIX path too long":
5265 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005266 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005267 .format(path))
5268 else:
5269 raise
5270
Antoine Pitrou495b5022017-05-02 17:20:00 +02005271 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005272 # Issue #30205 (note getsockname() can return None on OS X)
5273 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005274
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005275 def testStrAddr(self):
5276 # Test binding to and retrieving a normal string pathname.
5277 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005278 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005279 self.addCleanup(support.unlink, path)
5280 self.assertEqual(self.sock.getsockname(), path)
5281
5282 def testBytesAddr(self):
5283 # Test binding to a bytes pathname.
5284 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005285 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005286 self.addCleanup(support.unlink, path)
5287 self.assertEqual(self.sock.getsockname(), path)
5288
5289 def testSurrogateescapeBind(self):
5290 # Test binding to a valid non-ASCII pathname, with the
5291 # non-ASCII bytes supplied using surrogateescape encoding.
5292 path = os.path.abspath(support.TESTFN_UNICODE)
5293 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005294 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005295 self.addCleanup(support.unlink, path)
5296 self.assertEqual(self.sock.getsockname(), path)
5297
5298 def testUnencodableAddr(self):
5299 # Test binding to a pathname that cannot be encoded in the
5300 # file system encoding.
5301 if support.TESTFN_UNENCODABLE is None:
5302 self.skipTest("No unencodable filename available")
5303 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005304 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005305 self.addCleanup(support.unlink, path)
5306 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005307
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005308
Thomas Wouters477c8d52006-05-27 19:21:47 +00005309class BufferIOTest(SocketConnectedTest):
5310 """
5311 Test the buffer versions of socket.recv() and socket.send().
5312 """
5313 def __init__(self, methodName='runTest'):
5314 SocketConnectedTest.__init__(self, methodName=methodName)
5315
Antoine Pitrou25480782010-03-17 22:50:28 +00005316 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005317 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005318 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005319 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005320 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005321 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005322 self.assertEqual(msg, MSG)
5323
Antoine Pitrou25480782010-03-17 22:50:28 +00005324 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005325 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005326 self.serv_conn.send(buf)
5327
Antoine Pitrou25480782010-03-17 22:50:28 +00005328 def testRecvIntoBytearray(self):
5329 buf = bytearray(1024)
5330 nbytes = self.cli_conn.recv_into(buf)
5331 self.assertEqual(nbytes, len(MSG))
5332 msg = buf[:len(MSG)]
5333 self.assertEqual(msg, MSG)
5334
5335 _testRecvIntoBytearray = _testRecvIntoArray
5336
5337 def testRecvIntoMemoryview(self):
5338 buf = bytearray(1024)
5339 nbytes = self.cli_conn.recv_into(memoryview(buf))
5340 self.assertEqual(nbytes, len(MSG))
5341 msg = buf[:len(MSG)]
5342 self.assertEqual(msg, MSG)
5343
5344 _testRecvIntoMemoryview = _testRecvIntoArray
5345
5346 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005347 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005348 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005349 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005350 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005351 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005352 self.assertEqual(msg, MSG)
5353
Antoine Pitrou25480782010-03-17 22:50:28 +00005354 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005355 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005356 self.serv_conn.send(buf)
5357
Antoine Pitrou25480782010-03-17 22:50:28 +00005358 def testRecvFromIntoBytearray(self):
5359 buf = bytearray(1024)
5360 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5361 self.assertEqual(nbytes, len(MSG))
5362 msg = buf[:len(MSG)]
5363 self.assertEqual(msg, MSG)
5364
5365 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5366
5367 def testRecvFromIntoMemoryview(self):
5368 buf = bytearray(1024)
5369 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5370 self.assertEqual(nbytes, len(MSG))
5371 msg = buf[:len(MSG)]
5372 self.assertEqual(msg, MSG)
5373
5374 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5375
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005376 def testRecvFromIntoSmallBuffer(self):
5377 # See issue #20246.
5378 buf = bytearray(8)
5379 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5380
5381 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005382 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005383
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005384 def testRecvFromIntoEmptyBuffer(self):
5385 buf = bytearray()
5386 self.cli_conn.recvfrom_into(buf)
5387 self.cli_conn.recvfrom_into(buf, 0)
5388
5389 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5390
Christian Heimes043d6f62008-01-07 17:19:16 +00005391
5392TIPC_STYPE = 2000
5393TIPC_LOWER = 200
5394TIPC_UPPER = 210
5395
5396def isTipcAvailable():
5397 """Check if the TIPC module is loaded
5398
5399 The TIPC module is not loaded automatically on Ubuntu and probably
5400 other Linux distros.
5401 """
5402 if not hasattr(socket, "AF_TIPC"):
5403 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005404 try:
5405 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005406 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005407 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005408 # have not the permission to read it.
5409 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005410 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005411 for line in f:
5412 if line.startswith("tipc "):
5413 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005414 return False
5415
Serhiy Storchaka43767632013-11-03 21:31:38 +02005416@unittest.skipUnless(isTipcAvailable(),
5417 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005418class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005419 def testRDM(self):
5420 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5421 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005422 self.addCleanup(srv.close)
5423 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005424
5425 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5426 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5427 TIPC_LOWER, TIPC_UPPER)
5428 srv.bind(srvaddr)
5429
5430 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5431 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5432 cli.sendto(MSG, sendaddr)
5433
5434 msg, recvaddr = srv.recvfrom(1024)
5435
5436 self.assertEqual(cli.getsockname(), recvaddr)
5437 self.assertEqual(msg, MSG)
5438
5439
Serhiy Storchaka43767632013-11-03 21:31:38 +02005440@unittest.skipUnless(isTipcAvailable(),
5441 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005442class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005443 def __init__(self, methodName = 'runTest'):
5444 unittest.TestCase.__init__(self, methodName = methodName)
5445 ThreadableTest.__init__(self)
5446
5447 def setUp(self):
5448 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005449 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005450 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5451 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5452 TIPC_LOWER, TIPC_UPPER)
5453 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005454 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005455 self.serverExplicitReady()
5456 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005457 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005458
5459 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005460 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005461 # accept() call; sleep a little while to avoid it, otherwise
5462 # we could get an exception
5463 time.sleep(0.1)
5464 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005465 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005466 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5467 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5468 self.cli.connect(addr)
5469 self.cliaddr = self.cli.getsockname()
5470
5471 def testStream(self):
5472 msg = self.conn.recv(1024)
5473 self.assertEqual(msg, MSG)
5474 self.assertEqual(self.cliaddr, self.connaddr)
5475
5476 def _testStream(self):
5477 self.cli.send(MSG)
5478 self.cli.close()
5479
5480
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005481class ContextManagersTest(ThreadedTCPSocketTest):
5482
5483 def _testSocketClass(self):
5484 # base test
5485 with socket.socket() as sock:
5486 self.assertFalse(sock._closed)
5487 self.assertTrue(sock._closed)
5488 # close inside with block
5489 with socket.socket() as sock:
5490 sock.close()
5491 self.assertTrue(sock._closed)
5492 # exception inside with block
5493 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005494 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005495 self.assertTrue(sock._closed)
5496
5497 def testCreateConnectionBase(self):
5498 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005499 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005500 data = conn.recv(1024)
5501 conn.sendall(data)
5502
5503 def _testCreateConnectionBase(self):
5504 address = self.serv.getsockname()
5505 with socket.create_connection(address) as sock:
5506 self.assertFalse(sock._closed)
5507 sock.sendall(b'foo')
5508 self.assertEqual(sock.recv(1024), b'foo')
5509 self.assertTrue(sock._closed)
5510
5511 def testCreateConnectionClose(self):
5512 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005513 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005514 data = conn.recv(1024)
5515 conn.sendall(data)
5516
5517 def _testCreateConnectionClose(self):
5518 address = self.serv.getsockname()
5519 with socket.create_connection(address) as sock:
5520 sock.close()
5521 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005522 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005523
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005524
Victor Stinnerdaf45552013-08-28 00:53:59 +02005525class InheritanceTest(unittest.TestCase):
5526 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5527 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005528 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005529 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005530 with socket.socket(socket.AF_INET,
5531 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005532 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005533 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005534
5535 def test_default_inheritable(self):
5536 sock = socket.socket()
5537 with sock:
5538 self.assertEqual(sock.get_inheritable(), False)
5539
5540 def test_dup(self):
5541 sock = socket.socket()
5542 with sock:
5543 newsock = sock.dup()
5544 sock.close()
5545 with newsock:
5546 self.assertEqual(newsock.get_inheritable(), False)
5547
5548 def test_set_inheritable(self):
5549 sock = socket.socket()
5550 with sock:
5551 sock.set_inheritable(True)
5552 self.assertEqual(sock.get_inheritable(), True)
5553
5554 sock.set_inheritable(False)
5555 self.assertEqual(sock.get_inheritable(), False)
5556
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005557 @unittest.skipIf(fcntl is None, "need fcntl")
5558 def test_get_inheritable_cloexec(self):
5559 sock = socket.socket()
5560 with sock:
5561 fd = sock.fileno()
5562 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005563
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005564 # clear FD_CLOEXEC flag
5565 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5566 flags &= ~fcntl.FD_CLOEXEC
5567 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005568
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005569 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005570
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005571 @unittest.skipIf(fcntl is None, "need fcntl")
5572 def test_set_inheritable_cloexec(self):
5573 sock = socket.socket()
5574 with sock:
5575 fd = sock.fileno()
5576 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5577 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005578
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005579 sock.set_inheritable(True)
5580 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5581 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005582
5583
Victor Stinnerdaf45552013-08-28 00:53:59 +02005584 def test_socketpair(self):
5585 s1, s2 = socket.socketpair()
5586 self.addCleanup(s1.close)
5587 self.addCleanup(s2.close)
5588 self.assertEqual(s1.get_inheritable(), False)
5589 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005590
5591
5592@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5593 "SOCK_NONBLOCK not defined")
5594class NonblockConstantTest(unittest.TestCase):
5595 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5596 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005597 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005598 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005599 self.assertTrue(
5600 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005601 if timeout == 0:
5602 # timeout == 0: means that getblocking() must be False.
5603 self.assertFalse(s.getblocking())
5604 else:
5605 # If timeout > 0, the socket will be in a "blocking" mode
5606 # from the standpoint of the Python API. For Python socket
5607 # object, "blocking" means that operations like 'sock.recv()'
5608 # will block. Internally, file descriptors for
5609 # "blocking" Python sockets *with timeouts* are in a
5610 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5611 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5612 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005613 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005614 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005615 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005616 self.assertFalse(
5617 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005618 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005619
Charles-François Natali239bb962011-06-03 12:55:15 +02005620 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005621 def test_SOCK_NONBLOCK(self):
5622 # a lot of it seems silly and redundant, but I wanted to test that
5623 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005624 with socket.socket(socket.AF_INET,
5625 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5626 self.checkNonblock(s)
5627 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005628 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005629 s.setblocking(0)
5630 self.checkNonblock(s)
5631 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005632 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005633 s.settimeout(2.0)
5634 self.checkNonblock(s, timeout=2.0)
5635 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005636 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005637 # defaulttimeout
5638 t = socket.getdefaulttimeout()
5639 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005640 with socket.socket() as s:
5641 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005642 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005643 with socket.socket() as s:
5644 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005645 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005646 with socket.socket() as s:
5647 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005648 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005649 with socket.socket() as s:
5650 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005651 socket.setdefaulttimeout(t)
5652
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005653
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005654@unittest.skipUnless(os.name == "nt", "Windows specific")
5655@unittest.skipUnless(multiprocessing, "need multiprocessing")
5656class TestSocketSharing(SocketTCPTest):
5657 # This must be classmethod and not staticmethod or multiprocessing
5658 # won't be able to bootstrap it.
5659 @classmethod
5660 def remoteProcessServer(cls, q):
5661 # Recreate socket from shared data
5662 sdata = q.get()
5663 message = q.get()
5664
5665 s = socket.fromshare(sdata)
5666 s2, c = s.accept()
5667
5668 # Send the message
5669 s2.sendall(message)
5670 s2.close()
5671 s.close()
5672
5673 def testShare(self):
5674 # Transfer the listening server socket to another process
5675 # and service it from there.
5676
5677 # Create process:
5678 q = multiprocessing.Queue()
5679 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5680 p.start()
5681
5682 # Get the shared socket data
5683 data = self.serv.share(p.pid)
5684
5685 # Pass the shared socket to the other process
5686 addr = self.serv.getsockname()
5687 self.serv.close()
5688 q.put(data)
5689
5690 # The data that the server will send us
5691 message = b"slapmahfro"
5692 q.put(message)
5693
5694 # Connect
5695 s = socket.create_connection(addr)
5696 # listen for the data
5697 m = []
5698 while True:
5699 data = s.recv(100)
5700 if not data:
5701 break
5702 m.append(data)
5703 s.close()
5704 received = b"".join(m)
5705 self.assertEqual(received, message)
5706 p.join()
5707
5708 def testShareLength(self):
5709 data = self.serv.share(os.getpid())
5710 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5711 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5712
5713 def compareSockets(self, org, other):
5714 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005715 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005716 self.assertEqual(org.gettimeout(), None)
5717 self.assertEqual(org.gettimeout(), other.gettimeout())
5718
5719 self.assertEqual(org.family, other.family)
5720 self.assertEqual(org.type, other.type)
5721 # If the user specified "0" for proto, then
5722 # internally windows will have picked the correct value.
5723 # Python introspection on the socket however will still return
5724 # 0. For the shared socket, the python value is recreated
5725 # from the actual value, so it may not compare correctly.
5726 if org.proto != 0:
5727 self.assertEqual(org.proto, other.proto)
5728
5729 def testShareLocal(self):
5730 data = self.serv.share(os.getpid())
5731 s = socket.fromshare(data)
5732 try:
5733 self.compareSockets(self.serv, s)
5734 finally:
5735 s.close()
5736
5737 def testTypes(self):
5738 families = [socket.AF_INET, socket.AF_INET6]
5739 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5740 for f in families:
5741 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005742 try:
5743 source = socket.socket(f, t)
5744 except OSError:
5745 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005746 try:
5747 data = source.share(os.getpid())
5748 shared = socket.fromshare(data)
5749 try:
5750 self.compareSockets(source, shared)
5751 finally:
5752 shared.close()
5753 finally:
5754 source.close()
5755
5756
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005757class SendfileUsingSendTest(ThreadedTCPSocketTest):
5758 """
5759 Test the send() implementation of socket.sendfile().
5760 """
5761
Victor Stinner8c663fd2017-11-08 14:44:44 -08005762 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005763 BUFSIZE = 8192
5764 FILEDATA = b""
5765 TIMEOUT = 2
5766
5767 @classmethod
5768 def setUpClass(cls):
5769 def chunks(total, step):
5770 assert total >= step
5771 while total > step:
5772 yield step
5773 total -= step
5774 if total:
5775 yield total
5776
5777 chunk = b"".join([random.choice(string.ascii_letters).encode()
5778 for i in range(cls.BUFSIZE)])
5779 with open(support.TESTFN, 'wb') as f:
5780 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5781 f.write(chunk)
5782 with open(support.TESTFN, 'rb') as f:
5783 cls.FILEDATA = f.read()
5784 assert len(cls.FILEDATA) == cls.FILESIZE
5785
5786 @classmethod
5787 def tearDownClass(cls):
5788 support.unlink(support.TESTFN)
5789
5790 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005791 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005792 conn, addr = self.serv.accept()
5793 conn.settimeout(self.TIMEOUT)
5794 self.addCleanup(conn.close)
5795 return conn
5796
5797 def recv_data(self, conn):
5798 received = []
5799 while True:
5800 chunk = conn.recv(self.BUFSIZE)
5801 if not chunk:
5802 break
5803 received.append(chunk)
5804 return b''.join(received)
5805
5806 def meth_from_sock(self, sock):
5807 # Depending on the mixin class being run return either send()
5808 # or sendfile() method implementation.
5809 return getattr(sock, "_sendfile_use_send")
5810
5811 # regular file
5812
5813 def _testRegularFile(self):
5814 address = self.serv.getsockname()
5815 file = open(support.TESTFN, 'rb')
5816 with socket.create_connection(address) as sock, file as file:
5817 meth = self.meth_from_sock(sock)
5818 sent = meth(file)
5819 self.assertEqual(sent, self.FILESIZE)
5820 self.assertEqual(file.tell(), self.FILESIZE)
5821
5822 def testRegularFile(self):
5823 conn = self.accept_conn()
5824 data = self.recv_data(conn)
5825 self.assertEqual(len(data), self.FILESIZE)
5826 self.assertEqual(data, self.FILEDATA)
5827
5828 # non regular file
5829
5830 def _testNonRegularFile(self):
5831 address = self.serv.getsockname()
5832 file = io.BytesIO(self.FILEDATA)
5833 with socket.create_connection(address) as sock, file as file:
5834 sent = sock.sendfile(file)
5835 self.assertEqual(sent, self.FILESIZE)
5836 self.assertEqual(file.tell(), self.FILESIZE)
5837 self.assertRaises(socket._GiveupOnSendfile,
5838 sock._sendfile_use_sendfile, file)
5839
5840 def testNonRegularFile(self):
5841 conn = self.accept_conn()
5842 data = self.recv_data(conn)
5843 self.assertEqual(len(data), self.FILESIZE)
5844 self.assertEqual(data, self.FILEDATA)
5845
5846 # empty file
5847
5848 def _testEmptyFileSend(self):
5849 address = self.serv.getsockname()
5850 filename = support.TESTFN + "2"
5851 with open(filename, 'wb'):
5852 self.addCleanup(support.unlink, filename)
5853 file = open(filename, 'rb')
5854 with socket.create_connection(address) as sock, file as file:
5855 meth = self.meth_from_sock(sock)
5856 sent = meth(file)
5857 self.assertEqual(sent, 0)
5858 self.assertEqual(file.tell(), 0)
5859
5860 def testEmptyFileSend(self):
5861 conn = self.accept_conn()
5862 data = self.recv_data(conn)
5863 self.assertEqual(data, b"")
5864
5865 # offset
5866
5867 def _testOffset(self):
5868 address = self.serv.getsockname()
5869 file = open(support.TESTFN, 'rb')
5870 with socket.create_connection(address) as sock, file as file:
5871 meth = self.meth_from_sock(sock)
5872 sent = meth(file, offset=5000)
5873 self.assertEqual(sent, self.FILESIZE - 5000)
5874 self.assertEqual(file.tell(), self.FILESIZE)
5875
5876 def testOffset(self):
5877 conn = self.accept_conn()
5878 data = self.recv_data(conn)
5879 self.assertEqual(len(data), self.FILESIZE - 5000)
5880 self.assertEqual(data, self.FILEDATA[5000:])
5881
5882 # count
5883
5884 def _testCount(self):
5885 address = self.serv.getsockname()
5886 file = open(support.TESTFN, 'rb')
5887 with socket.create_connection(address, timeout=2) as sock, file as file:
5888 count = 5000007
5889 meth = self.meth_from_sock(sock)
5890 sent = meth(file, count=count)
5891 self.assertEqual(sent, count)
5892 self.assertEqual(file.tell(), count)
5893
5894 def testCount(self):
5895 count = 5000007
5896 conn = self.accept_conn()
5897 data = self.recv_data(conn)
5898 self.assertEqual(len(data), count)
5899 self.assertEqual(data, self.FILEDATA[:count])
5900
5901 # count small
5902
5903 def _testCountSmall(self):
5904 address = self.serv.getsockname()
5905 file = open(support.TESTFN, 'rb')
5906 with socket.create_connection(address, timeout=2) as sock, file as file:
5907 count = 1
5908 meth = self.meth_from_sock(sock)
5909 sent = meth(file, count=count)
5910 self.assertEqual(sent, count)
5911 self.assertEqual(file.tell(), count)
5912
5913 def testCountSmall(self):
5914 count = 1
5915 conn = self.accept_conn()
5916 data = self.recv_data(conn)
5917 self.assertEqual(len(data), count)
5918 self.assertEqual(data, self.FILEDATA[:count])
5919
5920 # count + offset
5921
5922 def _testCountWithOffset(self):
5923 address = self.serv.getsockname()
5924 file = open(support.TESTFN, 'rb')
5925 with socket.create_connection(address, timeout=2) as sock, file as file:
5926 count = 100007
5927 meth = self.meth_from_sock(sock)
5928 sent = meth(file, offset=2007, count=count)
5929 self.assertEqual(sent, count)
5930 self.assertEqual(file.tell(), count + 2007)
5931
5932 def testCountWithOffset(self):
5933 count = 100007
5934 conn = self.accept_conn()
5935 data = self.recv_data(conn)
5936 self.assertEqual(len(data), count)
5937 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5938
5939 # non blocking sockets are not supposed to work
5940
5941 def _testNonBlocking(self):
5942 address = self.serv.getsockname()
5943 file = open(support.TESTFN, 'rb')
5944 with socket.create_connection(address) as sock, file as file:
5945 sock.setblocking(False)
5946 meth = self.meth_from_sock(sock)
5947 self.assertRaises(ValueError, meth, file)
5948 self.assertRaises(ValueError, sock.sendfile, file)
5949
5950 def testNonBlocking(self):
5951 conn = self.accept_conn()
5952 if conn.recv(8192):
5953 self.fail('was not supposed to receive any data')
5954
5955 # timeout (non-triggered)
5956
5957 def _testWithTimeout(self):
5958 address = self.serv.getsockname()
5959 file = open(support.TESTFN, 'rb')
5960 with socket.create_connection(address, timeout=2) as sock, file as file:
5961 meth = self.meth_from_sock(sock)
5962 sent = meth(file)
5963 self.assertEqual(sent, self.FILESIZE)
5964
5965 def testWithTimeout(self):
5966 conn = self.accept_conn()
5967 data = self.recv_data(conn)
5968 self.assertEqual(len(data), self.FILESIZE)
5969 self.assertEqual(data, self.FILEDATA)
5970
5971 # timeout (triggered)
5972
5973 def _testWithTimeoutTriggeredSend(self):
5974 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00005975 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005976 with socket.create_connection(address) as sock:
5977 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00005978 meth = self.meth_from_sock(sock)
5979 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005980
5981 def testWithTimeoutTriggeredSend(self):
5982 conn = self.accept_conn()
5983 conn.recv(88192)
5984
5985 # errors
5986
5987 def _test_errors(self):
5988 pass
5989
5990 def test_errors(self):
5991 with open(support.TESTFN, 'rb') as file:
5992 with socket.socket(type=socket.SOCK_DGRAM) as s:
5993 meth = self.meth_from_sock(s)
5994 self.assertRaisesRegex(
5995 ValueError, "SOCK_STREAM", meth, file)
5996 with open(support.TESTFN, 'rt') as file:
5997 with socket.socket() as s:
5998 meth = self.meth_from_sock(s)
5999 self.assertRaisesRegex(
6000 ValueError, "binary mode", meth, file)
6001 with open(support.TESTFN, 'rb') as file:
6002 with socket.socket() as s:
6003 meth = self.meth_from_sock(s)
6004 self.assertRaisesRegex(TypeError, "positive integer",
6005 meth, file, count='2')
6006 self.assertRaisesRegex(TypeError, "positive integer",
6007 meth, file, count=0.1)
6008 self.assertRaisesRegex(ValueError, "positive integer",
6009 meth, file, count=0)
6010 self.assertRaisesRegex(ValueError, "positive integer",
6011 meth, file, count=-1)
6012
6013
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006014@unittest.skipUnless(hasattr(os, "sendfile"),
6015 'os.sendfile() required for this test.')
6016class SendfileUsingSendfileTest(SendfileUsingSendTest):
6017 """
6018 Test the sendfile() implementation of socket.sendfile().
6019 """
6020 def meth_from_sock(self, sock):
6021 return getattr(sock, "_sendfile_use_sendfile")
6022
Christian Heimes48371412016-09-06 00:37:46 +02006023
6024@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02006025class LinuxKernelCryptoAPI(unittest.TestCase):
6026 # tests for AF_ALG
6027 def create_alg(self, typ, name):
6028 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02006029 try:
6030 sock.bind((typ, name))
6031 except FileNotFoundError as e:
6032 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02006033 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02006034 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02006035 else:
Christian Heimes02b30352016-09-11 19:49:56 +02006036 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02006037
Victor Stinner86afc1f2017-11-30 13:58:43 +01006038 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
6039 # at least on ppc64le architecture
6040 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02006041 def test_sha256(self):
6042 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
6043 "177a9cb410ff61f20015ad")
6044 with self.create_alg('hash', 'sha256') as algo:
6045 op, _ = algo.accept()
6046 with op:
6047 op.sendall(b"abc")
6048 self.assertEqual(op.recv(512), expected)
6049
6050 op, _ = algo.accept()
6051 with op:
6052 op.send(b'a', socket.MSG_MORE)
6053 op.send(b'b', socket.MSG_MORE)
6054 op.send(b'c', socket.MSG_MORE)
6055 op.send(b'')
6056 self.assertEqual(op.recv(512), expected)
6057
6058 def test_hmac_sha1(self):
6059 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
6060 with self.create_alg('hash', 'hmac(sha1)') as algo:
6061 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
6062 op, _ = algo.accept()
6063 with op:
6064 op.sendall(b"what do ya want for nothing?")
6065 self.assertEqual(op.recv(512), expected)
6066
Christian Heimese084f842016-09-11 20:11:30 +02006067 # Although it should work with 3.19 and newer the test blocks on
6068 # Ubuntu 15.10 with Kernel 4.2.0-19.
6069 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02006070 def test_aes_cbc(self):
6071 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
6072 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
6073 msg = b"Single block msg"
6074 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
6075 msglen = len(msg)
6076 with self.create_alg('skcipher', 'cbc(aes)') as algo:
6077 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6078 op, _ = algo.accept()
6079 with op:
6080 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6081 flags=socket.MSG_MORE)
6082 op.sendall(msg)
6083 self.assertEqual(op.recv(msglen), ciphertext)
6084
6085 op, _ = algo.accept()
6086 with op:
6087 op.sendmsg_afalg([ciphertext],
6088 op=socket.ALG_OP_DECRYPT, iv=iv)
6089 self.assertEqual(op.recv(msglen), msg)
6090
6091 # long message
6092 multiplier = 1024
6093 longmsg = [msg] * multiplier
6094 op, _ = algo.accept()
6095 with op:
6096 op.sendmsg_afalg(longmsg,
6097 op=socket.ALG_OP_ENCRYPT, iv=iv)
6098 enc = op.recv(msglen * multiplier)
6099 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05006100 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02006101
6102 op, _ = algo.accept()
6103 with op:
6104 op.sendmsg_afalg([enc],
6105 op=socket.ALG_OP_DECRYPT, iv=iv)
6106 dec = op.recv(msglen * multiplier)
6107 self.assertEqual(len(dec), msglen * multiplier)
6108 self.assertEqual(dec, msg * multiplier)
6109
matejcik9764c152017-02-16 14:41:31 +01006110 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02006111 def test_aead_aes_gcm(self):
6112 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
6113 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
6114 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
6115 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
6116 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
6117 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
6118
6119 taglen = len(expected_tag)
6120 assoclen = len(assoc)
6121
6122 with self.create_alg('aead', 'gcm(aes)') as algo:
6123 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
6124 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
6125 None, taglen)
6126
6127 # send assoc, plain and tag buffer in separate steps
6128 op, _ = algo.accept()
6129 with op:
6130 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
6131 assoclen=assoclen, flags=socket.MSG_MORE)
6132 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01006133 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02006134 res = op.recv(assoclen + len(plain) + taglen)
6135 self.assertEqual(expected_ct, res[assoclen:-taglen])
6136 self.assertEqual(expected_tag, res[-taglen:])
6137
6138 # now with msg
6139 op, _ = algo.accept()
6140 with op:
matejcik9764c152017-02-16 14:41:31 +01006141 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006142 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
6143 assoclen=assoclen)
6144 res = op.recv(assoclen + len(plain) + taglen)
6145 self.assertEqual(expected_ct, res[assoclen:-taglen])
6146 self.assertEqual(expected_tag, res[-taglen:])
6147
6148 # create anc data manually
6149 pack_uint32 = struct.Struct('I').pack
6150 op, _ = algo.accept()
6151 with op:
matejcik9764c152017-02-16 14:41:31 +01006152 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006153 op.sendmsg(
6154 [msg],
6155 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6156 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6157 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6158 )
6159 )
matejcik9764c152017-02-16 14:41:31 +01006160 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006161 self.assertEqual(expected_ct, res[assoclen:-taglen])
6162 self.assertEqual(expected_tag, res[-taglen:])
6163
6164 # decrypt and verify
6165 op, _ = algo.accept()
6166 with op:
6167 msg = assoc + expected_ct + expected_tag
6168 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6169 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006170 res = op.recv(len(msg) - taglen)
6171 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006172
Christian Heimese084f842016-09-11 20:11:30 +02006173 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006174 def test_drbg_pr_sha256(self):
6175 # deterministic random bit generator, prediction resistance, sha256
6176 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6177 extra_seed = os.urandom(32)
6178 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6179 op, _ = algo.accept()
6180 with op:
6181 rn = op.recv(32)
6182 self.assertEqual(len(rn), 32)
6183
6184 def test_sendmsg_afalg_args(self):
6185 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006186 with sock:
6187 with self.assertRaises(TypeError):
6188 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006189
Christian Heimes02b30352016-09-11 19:49:56 +02006190 with self.assertRaises(TypeError):
6191 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006192
Christian Heimes02b30352016-09-11 19:49:56 +02006193 with self.assertRaises(TypeError):
6194 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006195
Christian Heimes02b30352016-09-11 19:49:56 +02006196 with self.assertRaises(TypeError):
6197 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006198
Christian Heimes02b30352016-09-11 19:49:56 +02006199 with self.assertRaises(TypeError):
6200 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6201
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006202 def test_length_restriction(self):
6203 # bpo-35050, off-by-one error in length check
6204 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6205 self.addCleanup(sock.close)
6206
6207 # salg_type[14]
6208 with self.assertRaises(FileNotFoundError):
6209 sock.bind(("t" * 13, "name"))
6210 with self.assertRaisesRegex(ValueError, "type too long"):
6211 sock.bind(("t" * 14, "name"))
6212
6213 # salg_name[64]
6214 with self.assertRaises(FileNotFoundError):
6215 sock.bind(("type", "n" * 63))
6216 with self.assertRaisesRegex(ValueError, "name too long"):
6217 sock.bind(("type", "n" * 64))
6218
6219
animalize19e7d482018-02-27 02:10:36 +08006220@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6221class TestMSWindowsTCPFlags(unittest.TestCase):
6222 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006223 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006224 'TCP_MAXSEG',
6225 'TCP_NODELAY',
6226 # available starting with Windows 10 1607
6227 'TCP_FASTOPEN',
6228 # available starting with Windows 10 1703
6229 'TCP_KEEPCNT',
6230 # available starting with Windows 10 1709
6231 'TCP_KEEPIDLE',
6232 'TCP_KEEPINTVL'
6233 }
6234
6235 def test_new_tcp_flags(self):
6236 provided = [s for s in dir(socket) if s.startswith('TCP')]
6237 unknown = [s for s in provided if s not in self.knownTCPFlags]
6238
6239 self.assertEqual([], unknown,
6240 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006241
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006242
6243class CreateServerTest(unittest.TestCase):
6244
6245 def test_address(self):
6246 port = support.find_unused_port()
6247 with socket.create_server(("127.0.0.1", port)) as sock:
6248 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6249 self.assertEqual(sock.getsockname()[1], port)
6250 if support.IPV6_ENABLED:
6251 with socket.create_server(("::1", port),
6252 family=socket.AF_INET6) as sock:
6253 self.assertEqual(sock.getsockname()[0], "::1")
6254 self.assertEqual(sock.getsockname()[1], port)
6255
6256 def test_family_and_type(self):
6257 with socket.create_server(("127.0.0.1", 0)) as sock:
6258 self.assertEqual(sock.family, socket.AF_INET)
6259 self.assertEqual(sock.type, socket.SOCK_STREAM)
6260 if support.IPV6_ENABLED:
6261 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6262 self.assertEqual(s.family, socket.AF_INET6)
6263 self.assertEqual(sock.type, socket.SOCK_STREAM)
6264
6265 def test_reuse_port(self):
6266 if not hasattr(socket, "SO_REUSEPORT"):
6267 with self.assertRaises(ValueError):
6268 socket.create_server(("localhost", 0), reuse_port=True)
6269 else:
6270 with socket.create_server(("localhost", 0)) as sock:
6271 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6272 self.assertEqual(opt, 0)
6273 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6274 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6275 self.assertNotEqual(opt, 0)
6276
6277 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6278 not hasattr(_socket, 'IPV6_V6ONLY'),
6279 "IPV6_V6ONLY option not supported")
6280 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6281 def test_ipv6_only_default(self):
6282 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6283 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6284
6285 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6286 "dualstack_ipv6 not supported")
6287 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6288 def test_dualstack_ipv6_family(self):
6289 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6290 dualstack_ipv6=True) as sock:
6291 self.assertEqual(sock.family, socket.AF_INET6)
6292
6293
6294class CreateServerFunctionalTest(unittest.TestCase):
6295 timeout = 3
6296
6297 def setUp(self):
6298 self.thread = None
6299
6300 def tearDown(self):
6301 if self.thread is not None:
6302 self.thread.join(self.timeout)
6303
6304 def echo_server(self, sock):
6305 def run(sock):
6306 with sock:
6307 conn, _ = sock.accept()
6308 with conn:
6309 event.wait(self.timeout)
6310 msg = conn.recv(1024)
6311 if not msg:
6312 return
6313 conn.sendall(msg)
6314
6315 event = threading.Event()
6316 sock.settimeout(self.timeout)
6317 self.thread = threading.Thread(target=run, args=(sock, ))
6318 self.thread.start()
6319 event.set()
6320
6321 def echo_client(self, addr, family):
6322 with socket.socket(family=family) as sock:
6323 sock.settimeout(self.timeout)
6324 sock.connect(addr)
6325 sock.sendall(b'foo')
6326 self.assertEqual(sock.recv(1024), b'foo')
6327
6328 def test_tcp4(self):
6329 port = support.find_unused_port()
6330 with socket.create_server(("", port)) as sock:
6331 self.echo_server(sock)
6332 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6333
6334 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6335 def test_tcp6(self):
6336 port = support.find_unused_port()
6337 with socket.create_server(("", port),
6338 family=socket.AF_INET6) as sock:
6339 self.echo_server(sock)
6340 self.echo_client(("::1", port), socket.AF_INET6)
6341
6342 # --- dual stack tests
6343
6344 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6345 "dualstack_ipv6 not supported")
6346 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6347 def test_dual_stack_client_v4(self):
6348 port = support.find_unused_port()
6349 with socket.create_server(("", port), family=socket.AF_INET6,
6350 dualstack_ipv6=True) as sock:
6351 self.echo_server(sock)
6352 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6353
6354 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6355 "dualstack_ipv6 not supported")
6356 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6357 def test_dual_stack_client_v6(self):
6358 port = support.find_unused_port()
6359 with socket.create_server(("", port), family=socket.AF_INET6,
6360 dualstack_ipv6=True) as sock:
6361 self.echo_server(sock)
6362 self.echo_client(("::1", port), socket.AF_INET6)
6363
6364
Guido van Rossumb995eb72002-07-31 16:08:40 +00006365def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006366 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006367 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
6368 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006369
6370 tests.extend([
6371 NonBlockingTCPTests,
6372 FileObjectClassTestCase,
6373 UnbufferedFileObjectClassTestCase,
6374 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006375 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006376 UnicodeReadFileObjectClassTestCase,
6377 UnicodeWriteFileObjectClassTestCase,
6378 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006379 NetworkConnectionNoServer,
6380 NetworkConnectionAttributesTest,
6381 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006382 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006383 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006384 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006385 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006386 tests.append(BasicSocketPairTest)
6387 tests.append(TestUnixDomain)
6388 tests.append(TestLinuxAbstractNamespace)
6389 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006390 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006391 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006392 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006393 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006394 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006395 BasicVSOCKTest,
6396 ThreadedVSOCKSocketStreamTest,
6397 ])
6398 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006399 CmsgMacroTests,
6400 SendmsgUDPTest,
6401 RecvmsgUDPTest,
6402 RecvmsgIntoUDPTest,
6403 SendmsgUDP6Test,
6404 RecvmsgUDP6Test,
6405 RecvmsgRFC3542AncillaryUDP6Test,
6406 RecvmsgIntoRFC3542AncillaryUDP6Test,
6407 RecvmsgIntoUDP6Test,
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07006408 SendmsgUDPLITETest,
6409 RecvmsgUDPLITETest,
6410 RecvmsgIntoUDPLITETest,
6411 SendmsgUDPLITE6Test,
6412 RecvmsgUDPLITE6Test,
6413 RecvmsgRFC3542AncillaryUDPLITE6Test,
6414 RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
6415 RecvmsgIntoUDPLITE6Test,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006416 SendmsgTCPTest,
6417 RecvmsgTCPTest,
6418 RecvmsgIntoTCPTest,
6419 SendmsgSCTPStreamTest,
6420 RecvmsgSCTPStreamTest,
6421 RecvmsgIntoSCTPStreamTest,
6422 SendmsgUnixStreamTest,
6423 RecvmsgUnixStreamTest,
6424 RecvmsgIntoUnixStreamTest,
6425 RecvmsgSCMRightsStreamTest,
6426 RecvmsgIntoSCMRightsStreamTest,
6427 # These are slow when setitimer() is not available
6428 InterruptedRecvTimeoutTest,
6429 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006430 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006431 SendfileUsingSendTest,
6432 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006433 ])
animalize19e7d482018-02-27 02:10:36 +08006434 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006435
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006436 thread_info = support.threading_setup()
6437 support.run_unittest(*tests)
6438 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006439
6440if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006441 test_main()