blob: c472be135e392dd8d7fd09aacef03d496ddbf0c2 [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
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000139# Size in bytes of the int type
140SIZEOF_INT = array.array("i").itemsize
141
Guido van Rossum24e4af82002-06-12 19:18:08 +0000142class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000143
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144 def setUp(self):
145 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000146 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100147 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000148
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149 def tearDown(self):
150 self.serv.close()
151 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000152
Guido van Rossum24e4af82002-06-12 19:18:08 +0000153class SocketUDPTest(unittest.TestCase):
154
155 def setUp(self):
156 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000157 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000158
159 def tearDown(self):
160 self.serv.close()
161 self.serv = None
162
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000163class ThreadSafeCleanupTestCase(unittest.TestCase):
164 """Subclass of unittest.TestCase with thread-safe cleanup methods.
165
166 This subclass protects the addCleanup() and doCleanups() methods
167 with a recursive lock.
168 """
169
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200170 def __init__(self, *args, **kwargs):
171 super().__init__(*args, **kwargs)
172 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000173
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200174 def addCleanup(self, *args, **kwargs):
175 with self._cleanup_lock:
176 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000177
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200178 def doCleanups(self, *args, **kwargs):
179 with self._cleanup_lock:
180 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000181
Charles-François Natali47413c12011-10-06 19:47:44 +0200182class SocketCANTest(unittest.TestCase):
183
184 """To be able to run this test, a `vcan0` CAN interface can be created with
185 the following commands:
186 # modprobe vcan
187 # ip link add dev vcan0 type vcan
188 # ifconfig vcan0 up
189 """
190 interface = 'vcan0'
191 bufsize = 128
192
Charles-François Natali773e42d2013-02-05 19:42:01 +0100193 """The CAN frame structure is defined in <linux/can.h>:
194
195 struct can_frame {
196 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
197 __u8 can_dlc; /* data length code: 0 .. 8 */
198 __u8 data[8] __attribute__((aligned(8)));
199 };
200 """
201 can_frame_fmt = "=IB3x8s"
202 can_frame_size = struct.calcsize(can_frame_fmt)
203
204 """The Broadcast Management Command frame structure is defined
205 in <linux/can/bcm.h>:
206
207 struct bcm_msg_head {
208 __u32 opcode;
209 __u32 flags;
210 __u32 count;
211 struct timeval ival1, ival2;
212 canid_t can_id;
213 __u32 nframes;
214 struct can_frame frames[0];
215 }
216
217 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
218 `struct can_frame` definition). Must use native not standard types for packing.
219 """
220 bcm_cmd_msg_fmt = "@3I4l2I"
221 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
222
Charles-François Natali47413c12011-10-06 19:47:44 +0200223 def setUp(self):
224 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200225 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200226 try:
227 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200228 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200229 self.skipTest('network interface `%s` does not exist' %
230 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200231
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100232
233class SocketRDSTest(unittest.TestCase):
234
235 """To be able to run this test, the `rds` kernel module must be loaded:
236 # modprobe rds
237 """
238 bufsize = 8192
239
240 def setUp(self):
241 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
242 self.addCleanup(self.serv.close)
243 try:
244 self.port = support.bind_port(self.serv)
245 except OSError:
246 self.skipTest('unable to bind RDS socket')
247
248
Guido van Rossum24e4af82002-06-12 19:18:08 +0000249class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000250 """Threadable Test class
251
252 The ThreadableTest class makes it easy to create a threaded
253 client/server pair from an existing unit test. To create a
254 new threaded class from an existing unit test, use multiple
255 inheritance:
256
257 class NewClass (OldClass, ThreadableTest):
258 pass
259
260 This class defines two new fixture functions with obvious
261 purposes for overriding:
262
263 clientSetUp ()
264 clientTearDown ()
265
266 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000267 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000268 '_' to indicate the client portion of the test. Ex:
269
270 def testFoo(self):
271 # Server portion
272
273 def _testFoo(self):
274 # Client portion
275
276 Any exceptions raised by the clients during their tests
277 are caught and transferred to the main thread to alert
278 the testing framework.
279
280 Note, the server setup function cannot call any blocking
281 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000282 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000283 the blocking call (such as in setting up a client/server
284 connection and performing the accept() in setUp().
285 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286
287 def __init__(self):
288 # Swap the true setup function
289 self.__setUp = self.setUp
290 self.__tearDown = self.tearDown
291 self.setUp = self._setUp
292 self.tearDown = self._tearDown
293
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000294 def serverExplicitReady(self):
295 """This method allows the server to explicitly indicate that
296 it wants the client thread to proceed. This is useful if the
297 server is about to execute a blocking routine that is
298 dependent upon the client thread during its setup routine."""
299 self.server_ready.set()
300
Guido van Rossum24e4af82002-06-12 19:18:08 +0000301 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700302 self.wait_threads = support.wait_threads_exit()
303 self.wait_threads.__enter__()
304
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000305 self.server_ready = threading.Event()
306 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000307 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000308 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200309 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000310
311 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000312 methodname = self.id()
313 i = methodname.rfind('.')
314 methodname = methodname[i+1:]
315 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000316 self.client_thread = thread.start_new_thread(
317 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200319 try:
320 self.__setUp()
321 except:
322 self.server_crashed = True
323 raise
324 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000325 self.server_ready.set()
326 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327
328 def _tearDown(self):
329 self.__tearDown()
330 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700331 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000333 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000334 exc = self.queue.get()
335 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000336
337 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000338 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100339 try:
340 self.clientSetUp()
341 except BaseException as e:
342 self.queue.put(e)
343 self.clientTearDown()
344 return
345 finally:
346 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200347 if self.server_crashed:
348 self.clientTearDown()
349 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000350 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000351 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000352 try:
353 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000354 except BaseException as e:
355 self.queue.put(e)
356 finally:
357 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358
359 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000360 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361
362 def clientTearDown(self):
363 self.done.set()
364 thread.exit()
365
366class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
367
368 def __init__(self, methodName='runTest'):
369 SocketTCPTest.__init__(self, methodName=methodName)
370 ThreadableTest.__init__(self)
371
372 def clientSetUp(self):
373 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
374
375 def clientTearDown(self):
376 self.cli.close()
377 self.cli = None
378 ThreadableTest.clientTearDown(self)
379
380class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
381
382 def __init__(self, methodName='runTest'):
383 SocketUDPTest.__init__(self, methodName=methodName)
384 ThreadableTest.__init__(self)
385
386 def clientSetUp(self):
387 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
388
Brian Curtin3beb38f2010-11-04 03:41:43 +0000389 def clientTearDown(self):
390 self.cli.close()
391 self.cli = None
392 ThreadableTest.clientTearDown(self)
393
Charles-François Natali47413c12011-10-06 19:47:44 +0200394class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
395
396 def __init__(self, methodName='runTest'):
397 SocketCANTest.__init__(self, methodName=methodName)
398 ThreadableTest.__init__(self)
399
400 def clientSetUp(self):
401 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
402 try:
403 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200404 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200405 # skipTest should not be called here, and will be called in the
406 # server instead
407 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200408
409 def clientTearDown(self):
410 self.cli.close()
411 self.cli = None
412 ThreadableTest.clientTearDown(self)
413
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100414class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
415
416 def __init__(self, methodName='runTest'):
417 SocketRDSTest.__init__(self, methodName=methodName)
418 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100419
420 def clientSetUp(self):
421 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
422 try:
423 # RDS sockets must be bound explicitly to send or receive data
424 self.cli.bind((HOST, 0))
425 self.cli_addr = self.cli.getsockname()
426 except OSError:
427 # skipTest should not be called here, and will be called in the
428 # server instead
429 pass
430
431 def clientTearDown(self):
432 self.cli.close()
433 self.cli = None
434 ThreadableTest.clientTearDown(self)
435
caaveryeffc12f2017-09-06 18:18:10 -0400436@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400437@unittest.skipUnless(HAVE_SOCKET_VSOCK,
438 'VSOCK sockets required for this test.')
439@unittest.skipUnless(get_cid() != 2,
440 "This test can only be run on a virtual guest.")
441class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
442
443 def __init__(self, methodName='runTest'):
444 unittest.TestCase.__init__(self, methodName=methodName)
445 ThreadableTest.__init__(self)
446
447 def setUp(self):
448 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
449 self.addCleanup(self.serv.close)
450 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
451 self.serv.listen()
452 self.serverExplicitReady()
453 self.conn, self.connaddr = self.serv.accept()
454 self.addCleanup(self.conn.close)
455
456 def clientSetUp(self):
457 time.sleep(0.1)
458 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
459 self.addCleanup(self.cli.close)
460 cid = get_cid()
461 self.cli.connect((cid, VSOCKPORT))
462
463 def testStream(self):
464 msg = self.conn.recv(1024)
465 self.assertEqual(msg, MSG)
466
467 def _testStream(self):
468 self.cli.send(MSG)
469 self.cli.close()
470
Guido van Rossum24e4af82002-06-12 19:18:08 +0000471class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000472 """Socket tests for client-server connection.
473
474 self.cli_conn is a client socket connected to the server. The
475 setUp() method guarantees that it is connected to the server.
476 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477
478 def __init__(self, methodName='runTest'):
479 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
480
481 def setUp(self):
482 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000483 # Indicate explicitly we're ready for the client thread to
484 # proceed and then perform the blocking call to accept
485 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486 conn, addr = self.serv.accept()
487 self.cli_conn = conn
488
489 def tearDown(self):
490 self.cli_conn.close()
491 self.cli_conn = None
492 ThreadedTCPSocketTest.tearDown(self)
493
494 def clientSetUp(self):
495 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000496 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000497 self.serv_conn = self.cli
498
499 def clientTearDown(self):
500 self.serv_conn.close()
501 self.serv_conn = None
502 ThreadedTCPSocketTest.clientTearDown(self)
503
Dave Cole331708b2004-08-09 04:51:41 +0000504class SocketPairTest(unittest.TestCase, ThreadableTest):
505
506 def __init__(self, methodName='runTest'):
507 unittest.TestCase.__init__(self, methodName=methodName)
508 ThreadableTest.__init__(self)
509
510 def setUp(self):
511 self.serv, self.cli = socket.socketpair()
512
513 def tearDown(self):
514 self.serv.close()
515 self.serv = None
516
517 def clientSetUp(self):
518 pass
519
520 def clientTearDown(self):
521 self.cli.close()
522 self.cli = None
523 ThreadableTest.clientTearDown(self)
524
Tim Peters494aaee2004-08-09 18:54:11 +0000525
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000526# The following classes are used by the sendmsg()/recvmsg() tests.
527# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
528# gives a drop-in replacement for SocketConnectedTest, but different
529# address families can be used, and the attributes serv_addr and
530# cli_addr will be set to the addresses of the endpoints.
531
532class SocketTestBase(unittest.TestCase):
533 """A base class for socket tests.
534
535 Subclasses must provide methods newSocket() to return a new socket
536 and bindSock(sock) to bind it to an unused address.
537
538 Creates a socket self.serv and sets self.serv_addr to its address.
539 """
540
541 def setUp(self):
542 self.serv = self.newSocket()
543 self.bindServer()
544
545 def bindServer(self):
546 """Bind server socket and set self.serv_addr to its address."""
547 self.bindSock(self.serv)
548 self.serv_addr = self.serv.getsockname()
549
550 def tearDown(self):
551 self.serv.close()
552 self.serv = None
553
554
555class SocketListeningTestMixin(SocketTestBase):
556 """Mixin to listen on the server socket."""
557
558 def setUp(self):
559 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100560 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000561
562
563class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
564 ThreadableTest):
565 """Mixin to add client socket and allow client/server tests.
566
567 Client socket is self.cli and its address is self.cli_addr. See
568 ThreadableTest for usage information.
569 """
570
571 def __init__(self, *args, **kwargs):
572 super().__init__(*args, **kwargs)
573 ThreadableTest.__init__(self)
574
575 def clientSetUp(self):
576 self.cli = self.newClientSocket()
577 self.bindClient()
578
579 def newClientSocket(self):
580 """Return a new socket for use as client."""
581 return self.newSocket()
582
583 def bindClient(self):
584 """Bind client socket and set self.cli_addr to its address."""
585 self.bindSock(self.cli)
586 self.cli_addr = self.cli.getsockname()
587
588 def clientTearDown(self):
589 self.cli.close()
590 self.cli = None
591 ThreadableTest.clientTearDown(self)
592
593
594class ConnectedStreamTestMixin(SocketListeningTestMixin,
595 ThreadedSocketTestMixin):
596 """Mixin to allow client/server stream tests with connected client.
597
598 Server's socket representing connection to client is self.cli_conn
599 and client's connection to server is self.serv_conn. (Based on
600 SocketConnectedTest.)
601 """
602
603 def setUp(self):
604 super().setUp()
605 # Indicate explicitly we're ready for the client thread to
606 # proceed and then perform the blocking call to accept
607 self.serverExplicitReady()
608 conn, addr = self.serv.accept()
609 self.cli_conn = conn
610
611 def tearDown(self):
612 self.cli_conn.close()
613 self.cli_conn = None
614 super().tearDown()
615
616 def clientSetUp(self):
617 super().clientSetUp()
618 self.cli.connect(self.serv_addr)
619 self.serv_conn = self.cli
620
621 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100622 try:
623 self.serv_conn.close()
624 self.serv_conn = None
625 except AttributeError:
626 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000627 super().clientTearDown()
628
629
630class UnixSocketTestBase(SocketTestBase):
631 """Base class for Unix-domain socket tests."""
632
633 # This class is used for file descriptor passing tests, so we
634 # create the sockets in a private directory so that other users
635 # can't send anything that might be problematic for a privileged
636 # user running the tests.
637
638 def setUp(self):
639 self.dir_path = tempfile.mkdtemp()
640 self.addCleanup(os.rmdir, self.dir_path)
641 super().setUp()
642
643 def bindSock(self, sock):
644 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100645 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000646 self.addCleanup(support.unlink, path)
647
648class UnixStreamBase(UnixSocketTestBase):
649 """Base class for Unix-domain SOCK_STREAM tests."""
650
651 def newSocket(self):
652 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
653
654
655class InetTestBase(SocketTestBase):
656 """Base class for IPv4 socket tests."""
657
658 host = HOST
659
660 def setUp(self):
661 super().setUp()
662 self.port = self.serv_addr[1]
663
664 def bindSock(self, sock):
665 support.bind_port(sock, host=self.host)
666
667class TCPTestBase(InetTestBase):
668 """Base class for TCP-over-IPv4 tests."""
669
670 def newSocket(self):
671 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
672
673class UDPTestBase(InetTestBase):
674 """Base class for UDP-over-IPv4 tests."""
675
676 def newSocket(self):
677 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
678
679class SCTPStreamBase(InetTestBase):
680 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
681
682 def newSocket(self):
683 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
684 socket.IPPROTO_SCTP)
685
686
687class Inet6TestBase(InetTestBase):
688 """Base class for IPv6 socket tests."""
689
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200690 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000691
692class UDP6TestBase(Inet6TestBase):
693 """Base class for UDP-over-IPv6 tests."""
694
695 def newSocket(self):
696 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
697
698
699# Test-skipping decorators for use with ThreadableTest.
700
701def skipWithClientIf(condition, reason):
702 """Skip decorated test if condition is true, add client_skip decorator.
703
704 If the decorated object is not a class, sets its attribute
705 "client_skip" to a decorator which will return an empty function
706 if the test is to be skipped, or the original function if it is
707 not. This can be used to avoid running the client part of a
708 skipped test when using ThreadableTest.
709 """
710 def client_pass(*args, **kwargs):
711 pass
712 def skipdec(obj):
713 retval = unittest.skip(reason)(obj)
714 if not isinstance(obj, type):
715 retval.client_skip = lambda f: client_pass
716 return retval
717 def noskipdec(obj):
718 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
719 obj.client_skip = lambda f: f
720 return obj
721 return skipdec if condition else noskipdec
722
723
724def requireAttrs(obj, *attributes):
725 """Skip decorated test if obj is missing any of the given attributes.
726
727 Sets client_skip attribute as skipWithClientIf() does.
728 """
729 missing = [name for name in attributes if not hasattr(obj, name)]
730 return skipWithClientIf(
731 missing, "don't have " + ", ".join(name for name in missing))
732
733
734def requireSocket(*args):
735 """Skip decorated test if a socket cannot be created with given arguments.
736
737 When an argument is given as a string, will use the value of that
738 attribute of the socket module, or skip the test if it doesn't
739 exist. Sets client_skip attribute as skipWithClientIf() does.
740 """
741 err = None
742 missing = [obj for obj in args if
743 isinstance(obj, str) and not hasattr(socket, obj)]
744 if missing:
745 err = "don't have " + ", ".join(name for name in missing)
746 else:
747 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
748 for obj in args]
749 try:
750 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200751 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000752 # XXX: check errno?
753 err = str(e)
754 else:
755 s.close()
756 return skipWithClientIf(
757 err is not None,
758 "can't create socket({0}): {1}".format(
759 ", ".join(str(o) for o in args), err))
760
761
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762#######################################################################
763## Begin Tests
764
765class GeneralModuleTests(unittest.TestCase):
766
Ethan Furman7184bac2014-10-14 18:56:53 -0700767 def test_SocketType_is_socketobject(self):
768 import _socket
769 self.assertTrue(socket.SocketType is _socket.socket)
770 s = socket.socket()
771 self.assertIsInstance(s, socket.SocketType)
772 s.close()
773
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000774 def test_repr(self):
775 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200776 with s:
777 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000778 self.assertIn('family=%s' % socket.AF_INET, repr(s))
779 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200780 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200781 self.assertNotIn('raddr', repr(s))
782 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200783 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200784 self.assertIn(str(s.getsockname()), repr(s))
785 self.assertIn('[closed]', repr(s))
786 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000787
Victor Stinnere254e532014-07-26 14:36:55 +0200788 @unittest.skipUnless(_socket is not None, 'need _socket module')
789 def test_csocket_repr(self):
790 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
791 try:
792 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
793 % (s.fileno(), s.family, s.type, s.proto))
794 self.assertEqual(repr(s), expected)
795 finally:
796 s.close()
797 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
798 % (s.family, s.type, s.proto))
799 self.assertEqual(repr(s), expected)
800
Raymond Hettinger027bb632004-05-31 03:09:25 +0000801 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200802 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
803 p = proxy(s)
804 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000805 s = None
806 try:
807 p.fileno()
808 except ReferenceError:
809 pass
810 else:
811 self.fail('Socket proxy still exists')
812
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000814 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300815 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200816 with self.assertRaises(OSError, msg=msg % 'OSError'):
817 raise OSError
818 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200820 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
Ezio Melotti63e42302011-05-07 19:47:48 +0300823 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000824 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300825 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
826 self.addCleanup(s.close)
827 s.bind(('', 0))
828 sockname = s.getsockname()
829 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300830 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300831 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300832 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400833 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300834 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300835 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300836 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400837 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300838 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300839 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300840 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300841 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300842 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300843 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300844 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400845 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300846 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300847 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300848 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400849 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300850 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300851 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300852 self.assertIn('not NoneType', str(cm.exception))
853 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300854 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300855 self.assertIn('an integer is required', str(cm.exception))
856 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300857 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300858 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300859 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300860 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300861 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300862 self.assertIn('(1 given)', str(cm.exception))
863 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300864 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300865 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300866
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000868 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100870 if socket.has_ipv6:
871 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 socket.SOCK_STREAM
873 socket.SOCK_DGRAM
874 socket.SOCK_RAW
875 socket.SOCK_RDM
876 socket.SOCK_SEQPACKET
877 socket.SOL_SOCKET
878 socket.SO_REUSEADDR
879
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100880 def testCrucialIpProtoConstants(self):
881 socket.IPPROTO_TCP
882 socket.IPPROTO_UDP
883 if socket.has_ipv6:
884 socket.IPPROTO_IPV6
885
886 @unittest.skipUnless(os.name == "nt", "Windows specific")
887 def testWindowsSpecificConstants(self):
888 socket.IPPROTO_ICLFXBM
889 socket.IPPROTO_ST
890 socket.IPPROTO_CBT
891 socket.IPPROTO_IGP
892 socket.IPPROTO_RDP
893 socket.IPPROTO_PGM
894 socket.IPPROTO_L2TP
895 socket.IPPROTO_SCTP
896
Guido van Rossum654c11e2002-06-13 20:24:17 +0000897 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000898 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000899 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000900 try:
901 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200902 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000903 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600904 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000905 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000906 try:
907 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200908 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000909 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600910 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000911 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000912 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000913 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000914 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000915
Charles-François Natali0cc86852013-09-13 19:53:08 +0200916 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700917 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200918 self.assertEqual(socket.gethostbyname(addr), addr)
919
920 # we don't test support.HOSTv6 because there's a chance it doesn't have
921 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700922 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200923 self.assertIn(host, socket.gethostbyaddr(host)[2])
924
Xiang Zhangd36a7162017-03-07 11:06:09 +0800925 def test_host_resolution_bad_address(self):
926 # These are all malformed IP addresses and expected not to resolve to
927 # any result. But some ISPs, e.g. AWS, may successfully resolve these
928 # IPs.
929 explanation = (
930 "resolving an invalid IP address did not raise OSError; "
931 "can be caused by a broken DNS server"
932 )
933 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
934 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400935 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800936 socket.gethostbyname(addr)
937 with self.assertRaises(OSError, msg=explanation):
938 socket.gethostbyaddr(addr)
939
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000940 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
941 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
942 def test_sethostname(self):
943 oldhn = socket.gethostname()
944 try:
945 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200946 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000947 if e.errno == errno.EPERM:
948 self.skipTest("test should be run as root")
949 else:
950 raise
951 try:
952 # running test as root!
953 self.assertEqual(socket.gethostname(), 'new')
954 # Should work with bytes objects too
955 socket.sethostname(b'bar')
956 self.assertEqual(socket.gethostname(), 'bar')
957 finally:
958 socket.sethostname(oldhn)
959
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700960 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
961 'socket.if_nameindex() not available.')
962 def testInterfaceNameIndex(self):
963 interfaces = socket.if_nameindex()
964 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200965 self.assertIsInstance(index, int)
966 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700967 # interface indices are non-zero integers
968 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200969 _index = socket.if_nametoindex(name)
970 self.assertIsInstance(_index, int)
971 self.assertEqual(index, _index)
972 _name = socket.if_indextoname(index)
973 self.assertIsInstance(_name, str)
974 self.assertEqual(name, _name)
975
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600976 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
977 'socket.if_indextoname() not available.')
978 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +0200979 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200980 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700981
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600982 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
983 'socket.if_nametoindex() not available.')
984 def testInvalidInterfaceNameToIndex(self):
985 self.assertRaises(TypeError, socket.if_nametoindex, 0)
986 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
987
Serhiy Storchaka43767632013-11-03 21:31:38 +0200988 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
989 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000990 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000991 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200992 try:
993 # On some versions, this loses a reference
994 orig = sys.getrefcount(__name__)
995 socket.getnameinfo(__name__,0)
996 except TypeError:
997 if sys.getrefcount(__name__) != orig:
998 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000999
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001001 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002 try:
1003 # On some versions, this crashes the interpreter.
1004 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001005 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001007
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001008 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001009 # This just checks that htons etc. are their own inverse,
1010 # when looking at the lower 16 or 32 bits.
1011 sizes = {socket.htonl: 32, socket.ntohl: 32,
1012 socket.htons: 16, socket.ntohs: 16}
1013 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001014 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001015 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1016 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001017
Guido van Rossuma2627af2002-09-14 00:58:46 +00001018 swapped = func(mask)
1019 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001020 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001021
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001022 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001023 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001024 import _testcapi
1025 s_good_values = [0, 1, 2, 0xffff]
1026 l_good_values = s_good_values + [0xffffffff]
1027 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1028 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1029 _testcapi.INT_MAX + 1]
1030 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1031 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001032 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001033 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001034 for k in l_good_values:
1035 socket.ntohl(k)
1036 socket.htonl(k)
1037 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001038 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001039 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001040 for k in l_bad_values:
1041 self.assertRaises(OverflowError, socket.ntohl, k)
1042 self.assertRaises(OverflowError, socket.htonl, k)
1043 for k in s_deprecated_values:
1044 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1045 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001046
Barry Warsaw11b91a02004-06-28 00:50:43 +00001047 def testGetServBy(self):
1048 eq = self.assertEqual
1049 # Find one service that exists, then check all the related interfaces.
1050 # I've ordered this by protocols that have both a tcp and udp
1051 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001052 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001053 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001054 # avoid the 'echo' service on this platform, as there is an
1055 # assumption breaking non-standard port/protocol entry
1056 services = ('daytime', 'qotd', 'domain')
1057 else:
1058 services = ('echo', 'daytime', 'domain')
1059 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001060 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001061 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001062 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001063 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001064 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001065 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001066 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001067 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001068 # Issue #26936: Android getservbyname() was broken before API 23.
1069 if (not hasattr(sys, 'getandroidapilevel') or
1070 sys.getandroidapilevel() >= 23):
1071 port2 = socket.getservbyname(service)
1072 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001073 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001074 try:
1075 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001076 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001077 udpport = None
1078 else:
1079 eq(udpport, port)
1080 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001081 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001082 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001083 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001084 eq(socket.getservbyport(port, 'tcp'), service)
1085 if udpport is not None:
1086 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001087 # Make sure getservbyport does not accept out of range ports.
1088 self.assertRaises(OverflowError, socket.getservbyport, -1)
1089 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001090
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001091 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001092 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001093 # The default timeout should initially be None
1094 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001095 with socket.socket() as s:
1096 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001097
1098 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001099 with socket_setdefaulttimeout(10):
1100 self.assertEqual(socket.getdefaulttimeout(), 10)
1101 with socket.socket() as sock:
1102 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001103
Victor Stinner304315d2018-11-30 13:22:44 +01001104 # Reset the default timeout to None, and see if it propagates
1105 socket.setdefaulttimeout(None)
1106 self.assertEqual(socket.getdefaulttimeout(), None)
1107 with socket.socket() as sock:
1108 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001109
1110 # Check that setting it to an invalid value raises ValueError
1111 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1112
1113 # Check that setting it to an invalid type raises TypeError
1114 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1115
Serhiy Storchaka43767632013-11-03 21:31:38 +02001116 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1117 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001118 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001119 # Test that issue1008086 and issue767150 are fixed.
1120 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001121 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1122 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001123
Serhiy Storchaka43767632013-11-03 21:31:38 +02001124 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1125 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001126 def testIPv4toString(self):
1127 from socket import inet_aton as f, inet_pton, AF_INET
1128 g = lambda a: inet_pton(AF_INET, a)
1129
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001130 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001131 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001132 )
1133
Ezio Melottib3aedd42010-11-20 19:04:17 +00001134 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1135 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1136 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1137 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1138 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001139 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001140 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001141 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001142 assertInvalid(f, '300.0.0.0')
1143 assertInvalid(f, 'a.0.0.0')
1144 assertInvalid(f, '1.2.3.4.5')
1145 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001146
Ezio Melottib3aedd42010-11-20 19:04:17 +00001147 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1148 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1149 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1150 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001151 assertInvalid(g, '0.0.0.')
1152 assertInvalid(g, '300.0.0.0')
1153 assertInvalid(g, 'a.0.0.0')
1154 assertInvalid(g, '1.2.3.4.5')
1155 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001156
Serhiy Storchaka43767632013-11-03 21:31:38 +02001157 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1158 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001159 def testIPv6toString(self):
1160 try:
1161 from socket import inet_pton, AF_INET6, has_ipv6
1162 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001163 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001164 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001165 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001166
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001167 if sys.platform == "win32":
1168 try:
1169 inet_pton(AF_INET6, '::')
1170 except OSError as e:
1171 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001172 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001173
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001174 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001175 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001176 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001177 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001178
Ezio Melottib3aedd42010-11-20 19:04:17 +00001179 self.assertEqual(b'\x00' * 16, f('::'))
1180 self.assertEqual(b'\x00' * 16, f('0::0'))
1181 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1182 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001183 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 +00001184 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1185 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001186 self.assertEqual(
1187 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1188 f('ad42:abc::127:0:254:2')
1189 )
1190 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1191 assertInvalid('0x20::')
1192 assertInvalid(':::')
1193 assertInvalid('::0::')
1194 assertInvalid('1::abc::')
1195 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001196 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001197 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001198 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001199 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001200 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001201 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001202
1203 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1204 f('::254.42.23.64')
1205 )
1206 self.assertEqual(
1207 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1208 f('42::a29b:254.42.23.64')
1209 )
1210 self.assertEqual(
1211 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1212 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1213 )
1214 assertInvalid('255.254.253.252')
1215 assertInvalid('1::260.2.3.0')
1216 assertInvalid('1::0.be.e.0')
1217 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1218 assertInvalid('::1.2.3.4:0')
1219 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001220
Serhiy Storchaka43767632013-11-03 21:31:38 +02001221 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1222 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001223 def testStringToIPv4(self):
1224 from socket import inet_ntoa as f, inet_ntop, AF_INET
1225 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001226 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001227 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001228 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001229
Ezio Melottib3aedd42010-11-20 19:04:17 +00001230 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1231 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1232 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1233 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001234 assertInvalid(f, b'\x00' * 3)
1235 assertInvalid(f, b'\x00' * 5)
1236 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001237 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001238
Ezio Melottib3aedd42010-11-20 19:04:17 +00001239 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1240 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1241 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001242 assertInvalid(g, b'\x00' * 3)
1243 assertInvalid(g, b'\x00' * 5)
1244 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001245 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001246
Serhiy Storchaka43767632013-11-03 21:31:38 +02001247 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1248 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001249 def testStringToIPv6(self):
1250 try:
1251 from socket import inet_ntop, AF_INET6, has_ipv6
1252 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001253 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001254 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001255 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001256
1257 if sys.platform == "win32":
1258 try:
1259 inet_ntop(AF_INET6, b'\x00' * 16)
1260 except OSError as e:
1261 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001262 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001263
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001264 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001265 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001266 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001267 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001268
Ezio Melottib3aedd42010-11-20 19:04:17 +00001269 self.assertEqual('::', f(b'\x00' * 16))
1270 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1271 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001272 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001273 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 +00001274 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001275 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001276
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001277 assertInvalid(b'\x12' * 15)
1278 assertInvalid(b'\x12' * 17)
1279 assertInvalid(b'\x12' * 4)
1280
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001281 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001282
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001283 def testSockName(self):
1284 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001285 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001286 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001287 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001288 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001289 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001290 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1291 # it reasonable to get the host's addr in addition to 0.0.0.0.
1292 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001293 try:
1294 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001295 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001296 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001297 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001298 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001299 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001300
1301 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001302 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001303 # We know a socket should start without reuse==0
1304 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001305 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001306 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001307 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001308
1309 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001310 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001311 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001312 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001313 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1314 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001315 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001316
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001317 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001318 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001319 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1320 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001321 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001322
Martin Panter50ab1a32016-04-11 00:38:12 +00001323 def testCloseException(self):
1324 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001325 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001326 socket.socket(fileno=sock.fileno()).close()
1327 try:
1328 sock.close()
1329 except OSError as err:
1330 # Winsock apparently raises ENOTSOCK
1331 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1332 else:
1333 self.fail("close() should raise EBADF/ENOTSOCK")
1334
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001335 def testNewAttributes(self):
1336 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001337
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001338 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1339 self.assertEqual(sock.family, socket.AF_INET)
1340 if hasattr(socket, 'SOCK_CLOEXEC'):
1341 self.assertIn(sock.type,
1342 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1343 socket.SOCK_STREAM))
1344 else:
1345 self.assertEqual(sock.type, socket.SOCK_STREAM)
1346 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001347
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001348 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001349 sock = socket.socket()
1350 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001351 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001352 big_port = port + 65536
1353 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001354 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1355 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1356 # Since find_unused_port() is inherently subject to race conditions, we
1357 # call it a couple times if necessary.
1358 for i in itertools.count():
1359 port = support.find_unused_port()
1360 try:
1361 sock.bind((HOST, port))
1362 except OSError as e:
1363 if e.errno != errno.EADDRINUSE or i == 5:
1364 raise
1365 else:
1366 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001367
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001368 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001369 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001370 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1371 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1372 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1373 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001374 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1375 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001376 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001377 self.assertRaises(ValueError, s.ioctl, -1, None)
1378 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001379
Steve Dowerea93ac02016-06-17 12:52:18 -07001380 @unittest.skipUnless(os.name == "nt", "Windows specific")
1381 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1382 'Loopback fast path support required for this test')
1383 def test_sio_loopback_fast_path(self):
1384 s = socket.socket()
1385 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001386 try:
1387 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1388 except OSError as exc:
1389 WSAEOPNOTSUPP = 10045
1390 if exc.winerror == WSAEOPNOTSUPP:
1391 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1392 "doesn't implemented in this Windows version")
1393 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001394 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1395
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001396 def testGetaddrinfo(self):
1397 try:
1398 socket.getaddrinfo('localhost', 80)
1399 except socket.gaierror as err:
1400 if err.errno == socket.EAI_SERVICE:
1401 # see http://bugs.python.org/issue1282647
1402 self.skipTest("buggy libc version")
1403 raise
1404 # len of every sequence is supposed to be == 5
1405 for info in socket.getaddrinfo(HOST, None):
1406 self.assertEqual(len(info), 5)
1407 # host can be a domain name, a string representation of an
1408 # IPv4/v6 address or None
1409 socket.getaddrinfo('localhost', 80)
1410 socket.getaddrinfo('127.0.0.1', 80)
1411 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001412 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001413 socket.getaddrinfo('::1', 80)
1414 # port can be a string service name such as "http", a numeric
1415 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001416 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1417 if (not hasattr(sys, 'getandroidapilevel') or
1418 sys.getandroidapilevel() >= 23):
1419 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001420 socket.getaddrinfo(HOST, 80)
1421 socket.getaddrinfo(HOST, None)
1422 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001423 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1424 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001425 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001426 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1427 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001428 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001429 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1430 for _, socktype, _, _, _ in infos:
1431 self.assertEqual(socktype, socket.SOCK_STREAM)
1432 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001433 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001434 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1435 # a server willing to support both IPv4 and IPv6 will
1436 # usually do this
1437 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1438 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001439 # test keyword arguments
1440 a = socket.getaddrinfo(HOST, None)
1441 b = socket.getaddrinfo(host=HOST, port=None)
1442 self.assertEqual(a, b)
1443 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1444 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1445 self.assertEqual(a, b)
1446 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1447 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1448 self.assertEqual(a, b)
1449 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1450 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1451 self.assertEqual(a, b)
1452 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1453 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1454 self.assertEqual(a, b)
1455 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1456 socket.AI_PASSIVE)
1457 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1458 type=socket.SOCK_STREAM, proto=0,
1459 flags=socket.AI_PASSIVE)
1460 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001461 # Issue #6697.
1462 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001463
Ned Deilyb24f4812014-02-13 22:50:42 -08001464 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001465 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001466 try:
1467 # The arguments here are undefined and the call may succeed
1468 # or fail. All we care here is that it doesn't segfault.
1469 socket.getaddrinfo("localhost", None, 0, 0, 0,
1470 socket.AI_NUMERICSERV)
1471 except socket.gaierror:
1472 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001473
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001474 def test_getnameinfo(self):
1475 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001476 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001477
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001478 @unittest.skipUnless(support.is_resource_enabled('network'),
1479 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001480 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001481 # Check for internet access before running test
1482 # (issue #12804, issue #25138).
1483 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001484 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001485
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001486 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001487 domain = 'испытание.pythontest.net'
1488 socket.gethostbyname(domain)
1489 socket.gethostbyname_ex(domain)
1490 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001491 # 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 +00001492 # have a reverse entry yet
1493 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001494
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001495 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001496 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001497 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1498 self.skipTest("signal.alarm and socket.socketpair required for this test")
1499 # Our signal handlers clobber the C errno by calling a math function
1500 # with an invalid domain value.
1501 def ok_handler(*args):
1502 self.assertRaises(ValueError, math.acosh, 0)
1503 def raising_handler(*args):
1504 self.assertRaises(ValueError, math.acosh, 0)
1505 1 // 0
1506 c, s = socket.socketpair()
1507 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1508 try:
1509 if with_timeout:
1510 # Just above the one second minimum for signal.alarm
1511 c.settimeout(1.5)
1512 with self.assertRaises(ZeroDivisionError):
1513 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001514 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001515 if with_timeout:
1516 signal.signal(signal.SIGALRM, ok_handler)
1517 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001518 self.assertRaises(socket.timeout, c.sendall,
1519 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001520 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001521 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001522 signal.signal(signal.SIGALRM, old_alarm)
1523 c.close()
1524 s.close()
1525
1526 def test_sendall_interrupted(self):
1527 self.check_sendall_interrupted(False)
1528
1529 def test_sendall_interrupted_with_timeout(self):
1530 self.check_sendall_interrupted(True)
1531
Antoine Pitroue033e062010-10-29 10:38:18 +00001532 def test_dealloc_warn(self):
1533 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1534 r = repr(sock)
1535 with self.assertWarns(ResourceWarning) as cm:
1536 sock = None
1537 support.gc_collect()
1538 self.assertIn(r, str(cm.warning.args[0]))
1539 # An open socket file object gets dereferenced after the socket
1540 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1541 f = sock.makefile('rb')
1542 r = repr(sock)
1543 sock = None
1544 support.gc_collect()
1545 with self.assertWarns(ResourceWarning):
1546 f = None
1547 support.gc_collect()
1548
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001549 def test_name_closed_socketio(self):
1550 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1551 fp = sock.makefile("rb")
1552 fp.close()
1553 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1554
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001555 def test_unusable_closed_socketio(self):
1556 with socket.socket() as sock:
1557 fp = sock.makefile("rb", buffering=0)
1558 self.assertTrue(fp.readable())
1559 self.assertFalse(fp.writable())
1560 self.assertFalse(fp.seekable())
1561 fp.close()
1562 self.assertRaises(ValueError, fp.readable)
1563 self.assertRaises(ValueError, fp.writable)
1564 self.assertRaises(ValueError, fp.seekable)
1565
Christian Heimesd0e31b92018-01-27 09:54:13 +01001566 def test_socket_close(self):
1567 sock = socket.socket()
1568 try:
1569 sock.bind((HOST, 0))
1570 socket.close(sock.fileno())
1571 with self.assertRaises(OSError):
1572 sock.listen(1)
1573 finally:
1574 with self.assertRaises(OSError):
1575 # sock.close() fails with EBADF
1576 sock.close()
1577 with self.assertRaises(TypeError):
1578 socket.close(None)
1579 with self.assertRaises(OSError):
1580 socket.close(-1)
1581
Berker Peksag3fe64d02016-02-18 17:34:00 +02001582 def test_makefile_mode(self):
1583 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1584 with self.subTest(mode=mode):
1585 with socket.socket() as sock:
1586 with sock.makefile(mode) as fp:
1587 self.assertEqual(fp.mode, mode)
1588
1589 def test_makefile_invalid_mode(self):
1590 for mode in 'rt', 'x', '+', 'a':
1591 with self.subTest(mode=mode):
1592 with socket.socket() as sock:
1593 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1594 sock.makefile(mode)
1595
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001596 def test_pickle(self):
1597 sock = socket.socket()
1598 with sock:
1599 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1600 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001601 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1602 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1603 self.assertEqual(family, socket.AF_INET)
1604 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1605 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001606
Serhiy Storchaka78980432013-01-15 01:12:17 +02001607 def test_listen_backlog(self):
1608 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001609 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1610 srv.bind((HOST, 0))
1611 srv.listen(backlog)
1612
1613 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001614 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001615 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001616
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001617 @support.cpython_only
1618 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001619 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001620 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001621 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1622 srv.bind((HOST, 0))
1623 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001624
Charles-François Natali42663332012-01-02 15:57:30 +01001625 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001626 def test_flowinfo(self):
1627 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001628 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001629 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001630 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001631
Коренберг Марк7766b962018-02-13 00:47:42 +05001632 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1633 def test_getaddrinfo_ipv6_basic(self):
1634 ((*_, sockaddr),) = socket.getaddrinfo(
1635 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1636 1234, socket.AF_INET6,
1637 socket.SOCK_DGRAM,
1638 socket.IPPROTO_UDP
1639 )
1640 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1641
1642 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001643 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001644 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001645 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1646 # Just pick up any network interface (Linux, Mac OS X)
1647 (ifindex, test_interface) = socket.if_nameindex()[0]
1648 ((*_, sockaddr),) = socket.getaddrinfo(
1649 'ff02::1de:c0:face:8D%' + test_interface,
1650 1234, socket.AF_INET6,
1651 socket.SOCK_DGRAM,
1652 socket.IPPROTO_UDP
1653 )
1654 # Note missing interface name part in IPv6 address
1655 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1656
1657 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1658 @unittest.skipUnless(
1659 sys.platform == 'win32',
1660 'Numeric scope id does not work or undocumented')
1661 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1662 # Also works on Linux and Mac OS X, but is not documented (?)
1663 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1664 ifindex = 42
1665 ((*_, sockaddr),) = socket.getaddrinfo(
1666 'ff02::1de:c0:face:8D%' + str(ifindex),
1667 1234, socket.AF_INET6,
1668 socket.SOCK_DGRAM,
1669 socket.IPPROTO_UDP
1670 )
1671 # Note missing interface name part in IPv6 address
1672 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1673
1674 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001675 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001676 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001677 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1678 # Just pick up any network interface.
1679 (ifindex, test_interface) = socket.if_nameindex()[0]
1680 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1681 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1682 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1683
1684 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001685 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001686 'Numeric scope id does not work or undocumented')
1687 def test_getnameinfo_ipv6_scopeid_numeric(self):
1688 # Also works on Linux (undocumented), but does not work on Mac OS X
1689 # Windows and Linux allow nonexistent interface numbers here.
1690 ifindex = 42
1691 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1692 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1693 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1694
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001695 def test_str_for_enums(self):
1696 # Make sure that the AF_* and SOCK_* constants have enum-like string
1697 # reprs.
1698 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1699 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001700 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001701
Yury Selivanov98181422017-12-18 20:02:54 -05001702 def test_socket_consistent_sock_type(self):
1703 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1704 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1705 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1706
1707 with socket.socket(socket.AF_INET, sock_type) as s:
1708 self.assertEqual(s.type, socket.SOCK_STREAM)
1709 s.settimeout(1)
1710 self.assertEqual(s.type, socket.SOCK_STREAM)
1711 s.settimeout(0)
1712 self.assertEqual(s.type, socket.SOCK_STREAM)
1713 s.setblocking(True)
1714 self.assertEqual(s.type, socket.SOCK_STREAM)
1715 s.setblocking(False)
1716 self.assertEqual(s.type, socket.SOCK_STREAM)
1717
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001718 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001719 # Test that when created with a family that's not one of the known
1720 # AF_*/SOCK_* constants, socket.family just returns the number.
1721 #
1722 # To do this we fool socket.socket into believing it already has an
1723 # open fd because on this path it doesn't actually verify the family and
1724 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001725 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1726 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001727 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1728
1729 unknown_type = max(
1730 kind
1731 for name, kind in socket.SocketKind.__members__.items()
1732 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1733 ) + 1
1734
1735 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001736 family=unknown_family, type=unknown_type, proto=23,
1737 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001738 self.assertEqual(s.family, unknown_family)
1739 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001740 # some OS like macOS ignore proto
1741 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001742
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001743 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1744 def test__sendfile_use_sendfile(self):
1745 class File:
1746 def __init__(self, fd):
1747 self.fd = fd
1748
1749 def fileno(self):
1750 return self.fd
1751 with socket.socket() as sock:
1752 fd = os.open(os.curdir, os.O_RDONLY)
1753 os.close(fd)
1754 with self.assertRaises(socket._GiveupOnSendfile):
1755 sock._sendfile_use_sendfile(File(fd))
1756 with self.assertRaises(OverflowError):
1757 sock._sendfile_use_sendfile(File(2**1000))
1758 with self.assertRaises(TypeError):
1759 sock._sendfile_use_sendfile(File(None))
1760
Christian Heimesb6e43af2018-01-29 22:37:58 +01001761 def _test_socket_fileno(self, s, family, stype):
1762 self.assertEqual(s.family, family)
1763 self.assertEqual(s.type, stype)
1764
1765 fd = s.fileno()
1766 s2 = socket.socket(fileno=fd)
1767 self.addCleanup(s2.close)
1768 # detach old fd to avoid double close
1769 s.detach()
1770 self.assertEqual(s2.family, family)
1771 self.assertEqual(s2.type, stype)
1772 self.assertEqual(s2.fileno(), fd)
1773
1774 def test_socket_fileno(self):
1775 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1776 self.addCleanup(s.close)
1777 s.bind((support.HOST, 0))
1778 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1779
1780 if hasattr(socket, "SOCK_DGRAM"):
1781 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1782 self.addCleanup(s.close)
1783 s.bind((support.HOST, 0))
1784 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1785
1786 if support.IPV6_ENABLED:
1787 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1788 self.addCleanup(s.close)
1789 s.bind((support.HOSTv6, 0, 0, 0))
1790 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1791
1792 if hasattr(socket, "AF_UNIX"):
1793 tmpdir = tempfile.mkdtemp()
1794 self.addCleanup(shutil.rmtree, tmpdir)
1795 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1796 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001797 try:
1798 s.bind(os.path.join(tmpdir, 'socket'))
1799 except PermissionError:
1800 pass
1801 else:
1802 self._test_socket_fileno(s, socket.AF_UNIX,
1803 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001804
Dima Tisneke9912702018-12-17 22:07:55 +09001805 def test_socket_fileno_rejects_float(self):
1806 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1807 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1808
1809 def test_socket_fileno_rejects_other_types(self):
1810 with self.assertRaisesRegex(TypeError, "integer is required"):
1811 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1812
1813 def test_socket_fileno_rejects_invalid_socket(self):
1814 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1815 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1816
1817 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1818 def test_socket_fileno_rejects_negative(self):
1819 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1820 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1821
1822 def test_socket_fileno_requires_valid_fd(self):
1823 WSAENOTSOCK = 10038
1824 with self.assertRaises(OSError) as cm:
1825 socket.socket(fileno=support.make_bad_fd())
1826 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1827
1828 with self.assertRaises(OSError) as cm:
1829 socket.socket(
1830 socket.AF_INET,
1831 socket.SOCK_STREAM,
1832 fileno=support.make_bad_fd())
1833 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1834
1835 def test_socket_fileno_requires_socket_fd(self):
1836 with tempfile.NamedTemporaryFile() as afile:
1837 with self.assertRaises(OSError):
1838 socket.socket(fileno=afile.fileno())
1839
1840 with self.assertRaises(OSError) as cm:
1841 socket.socket(
1842 socket.AF_INET,
1843 socket.SOCK_STREAM,
1844 fileno=afile.fileno())
1845 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1846
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001847
Charles-François Natali47413c12011-10-06 19:47:44 +02001848@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1849class BasicCANTest(unittest.TestCase):
1850
1851 def testCrucialConstants(self):
1852 socket.AF_CAN
1853 socket.PF_CAN
1854 socket.CAN_RAW
1855
Charles-François Natali773e42d2013-02-05 19:42:01 +01001856 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1857 'socket.CAN_BCM required for this test.')
1858 def testBCMConstants(self):
1859 socket.CAN_BCM
1860
1861 # opcodes
1862 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1863 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1864 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1865 socket.CAN_BCM_TX_SEND # send one CAN frame
1866 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1867 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1868 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1869 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1870 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1871 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1872 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1873 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1874
Miss Islington (bot)d8b914a2019-07-31 02:10:38 -07001875 # flags
1876 socket.CAN_BCM_SETTIMER
1877 socket.CAN_BCM_STARTTIMER
1878 socket.CAN_BCM_TX_COUNTEVT
1879 socket.CAN_BCM_TX_ANNOUNCE
1880 socket.CAN_BCM_TX_CP_CAN_ID
1881 socket.CAN_BCM_RX_FILTER_ID
1882 socket.CAN_BCM_RX_CHECK_DLC
1883 socket.CAN_BCM_RX_NO_AUTOTIMER
1884 socket.CAN_BCM_RX_ANNOUNCE_RESUME
1885 socket.CAN_BCM_TX_RESET_MULTI_IDX
1886 socket.CAN_BCM_RX_RTR_FRAME
1887
Charles-François Natali47413c12011-10-06 19:47:44 +02001888 def testCreateSocket(self):
1889 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1890 pass
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 testCreateBCMSocket(self):
1895 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1896 pass
1897
Charles-François Natali47413c12011-10-06 19:47:44 +02001898 def testBindAny(self):
1899 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1900 s.bind(('', ))
1901
1902 def testTooLongInterfaceName(self):
1903 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1904 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001905 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001906 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001907
1908 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1909 'socket.CAN_RAW_LOOPBACK required for this test.')
1910 def testLoopback(self):
1911 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1912 for loopback in (0, 1):
1913 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1914 loopback)
1915 self.assertEqual(loopback,
1916 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1917
1918 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1919 'socket.CAN_RAW_FILTER required for this test.')
1920 def testFilter(self):
1921 can_id, can_mask = 0x200, 0x700
1922 can_filter = struct.pack("=II", can_id, can_mask)
1923 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1924 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1925 self.assertEqual(can_filter,
1926 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001927 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001928
1929
1930@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001931class CANTest(ThreadedCANSocketTest):
1932
Charles-François Natali47413c12011-10-06 19:47:44 +02001933 def __init__(self, methodName='runTest'):
1934 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1935
1936 @classmethod
1937 def build_can_frame(cls, can_id, data):
1938 """Build a CAN frame."""
1939 can_dlc = len(data)
1940 data = data.ljust(8, b'\x00')
1941 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1942
1943 @classmethod
1944 def dissect_can_frame(cls, frame):
1945 """Dissect a CAN frame."""
1946 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1947 return (can_id, can_dlc, data[:can_dlc])
1948
1949 def testSendFrame(self):
1950 cf, addr = self.s.recvfrom(self.bufsize)
1951 self.assertEqual(self.cf, cf)
1952 self.assertEqual(addr[0], self.interface)
1953 self.assertEqual(addr[1], socket.AF_CAN)
1954
1955 def _testSendFrame(self):
1956 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1957 self.cli.send(self.cf)
1958
1959 def testSendMaxFrame(self):
1960 cf, addr = self.s.recvfrom(self.bufsize)
1961 self.assertEqual(self.cf, cf)
1962
1963 def _testSendMaxFrame(self):
1964 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1965 self.cli.send(self.cf)
1966
1967 def testSendMultiFrames(self):
1968 cf, addr = self.s.recvfrom(self.bufsize)
1969 self.assertEqual(self.cf1, cf)
1970
1971 cf, addr = self.s.recvfrom(self.bufsize)
1972 self.assertEqual(self.cf2, cf)
1973
1974 def _testSendMultiFrames(self):
1975 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1976 self.cli.send(self.cf1)
1977
1978 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1979 self.cli.send(self.cf2)
1980
Charles-François Natali773e42d2013-02-05 19:42:01 +01001981 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1982 'socket.CAN_BCM required for this test.')
1983 def _testBCM(self):
1984 cf, addr = self.cli.recvfrom(self.bufsize)
1985 self.assertEqual(self.cf, cf)
1986 can_id, can_dlc, data = self.dissect_can_frame(cf)
1987 self.assertEqual(self.can_id, can_id)
1988 self.assertEqual(self.data, data)
1989
1990 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1991 'socket.CAN_BCM required for this test.')
1992 def testBCM(self):
1993 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1994 self.addCleanup(bcm.close)
1995 bcm.connect((self.interface,))
1996 self.can_id = 0x123
1997 self.data = bytes([0xc0, 0xff, 0xee])
1998 self.cf = self.build_can_frame(self.can_id, self.data)
1999 opcode = socket.CAN_BCM_TX_SEND
2000 flags = 0
2001 count = 0
2002 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2003 bcm_can_id = 0x0222
2004 nframes = 1
2005 assert len(self.cf) == 16
2006 header = struct.pack(self.bcm_cmd_msg_fmt,
2007 opcode,
2008 flags,
2009 count,
2010 ival1_seconds,
2011 ival1_usec,
2012 ival2_seconds,
2013 ival2_usec,
2014 bcm_can_id,
2015 nframes,
2016 )
2017 header_plus_frame = header + self.cf
2018 bytes_sent = bcm.send(header_plus_frame)
2019 self.assertEqual(bytes_sent, len(header_plus_frame))
2020
Charles-François Natali47413c12011-10-06 19:47:44 +02002021
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002022@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2023class ISOTPTest(unittest.TestCase):
2024
2025 def __init__(self, *args, **kwargs):
2026 super().__init__(*args, **kwargs)
2027 self.interface = "vcan0"
2028
2029 def testCrucialConstants(self):
2030 socket.AF_CAN
2031 socket.PF_CAN
2032 socket.CAN_ISOTP
2033 socket.SOCK_DGRAM
2034
2035 def testCreateSocket(self):
2036 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2037 pass
2038
2039 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2040 'socket.CAN_ISOTP required for this test.')
2041 def testCreateISOTPSocket(self):
2042 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2043 pass
2044
2045 def testTooLongInterfaceName(self):
2046 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2047 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2048 with self.assertRaisesRegex(OSError, 'interface name too long'):
2049 s.bind(('x' * 1024, 1, 2))
2050
2051 def testBind(self):
2052 try:
2053 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2054 addr = self.interface, 0x123, 0x456
2055 s.bind(addr)
2056 self.assertEqual(s.getsockname(), addr)
2057 except OSError as e:
2058 if e.errno == errno.ENODEV:
2059 self.skipTest('network interface `%s` does not exist' %
2060 self.interface)
2061 else:
2062 raise
2063
2064
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002065@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2066class BasicRDSTest(unittest.TestCase):
2067
2068 def testCrucialConstants(self):
2069 socket.AF_RDS
2070 socket.PF_RDS
2071
2072 def testCreateSocket(self):
2073 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2074 pass
2075
2076 def testSocketBufferSize(self):
2077 bufsize = 16384
2078 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2079 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2080 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2081
2082
2083@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002084class RDSTest(ThreadedRDSSocketTest):
2085
2086 def __init__(self, methodName='runTest'):
2087 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2088
Charles-François Natali240c55f2011-11-10 20:33:36 +01002089 def setUp(self):
2090 super().setUp()
2091 self.evt = threading.Event()
2092
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002093 def testSendAndRecv(self):
2094 data, addr = self.serv.recvfrom(self.bufsize)
2095 self.assertEqual(self.data, data)
2096 self.assertEqual(self.cli_addr, addr)
2097
2098 def _testSendAndRecv(self):
2099 self.data = b'spam'
2100 self.cli.sendto(self.data, 0, (HOST, self.port))
2101
2102 def testPeek(self):
2103 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2104 self.assertEqual(self.data, data)
2105 data, addr = self.serv.recvfrom(self.bufsize)
2106 self.assertEqual(self.data, data)
2107
2108 def _testPeek(self):
2109 self.data = b'spam'
2110 self.cli.sendto(self.data, 0, (HOST, self.port))
2111
2112 @requireAttrs(socket.socket, 'recvmsg')
2113 def testSendAndRecvMsg(self):
2114 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2115 self.assertEqual(self.data, data)
2116
2117 @requireAttrs(socket.socket, 'sendmsg')
2118 def _testSendAndRecvMsg(self):
2119 self.data = b'hello ' * 10
2120 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2121
2122 def testSendAndRecvMulti(self):
2123 data, addr = self.serv.recvfrom(self.bufsize)
2124 self.assertEqual(self.data1, data)
2125
2126 data, addr = self.serv.recvfrom(self.bufsize)
2127 self.assertEqual(self.data2, data)
2128
2129 def _testSendAndRecvMulti(self):
2130 self.data1 = b'bacon'
2131 self.cli.sendto(self.data1, 0, (HOST, self.port))
2132
2133 self.data2 = b'egg'
2134 self.cli.sendto(self.data2, 0, (HOST, self.port))
2135
2136 def testSelect(self):
2137 r, w, x = select.select([self.serv], [], [], 3.0)
2138 self.assertIn(self.serv, r)
2139 data, addr = self.serv.recvfrom(self.bufsize)
2140 self.assertEqual(self.data, data)
2141
2142 def _testSelect(self):
2143 self.data = b'select'
2144 self.cli.sendto(self.data, 0, (HOST, self.port))
2145
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002146@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2147 'QIPCRTR sockets required for this test.')
2148class BasicQIPCRTRTest(unittest.TestCase):
2149
2150 def testCrucialConstants(self):
2151 socket.AF_QIPCRTR
2152
2153 def testCreateSocket(self):
2154 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2155 pass
2156
2157 def testUnbound(self):
2158 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2159 self.assertEqual(s.getsockname()[1], 0)
2160
2161 def testBindSock(self):
2162 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2163 support.bind_port(s, host=s.getsockname()[0])
2164 self.assertNotEqual(s.getsockname()[1], 0)
2165
2166 def testInvalidBindSock(self):
2167 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2168 self.assertRaises(OSError, support.bind_port, s, host=-2)
2169
2170 def testAutoBindSock(self):
2171 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2172 s.connect((123, 123))
2173 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002174
caaveryeffc12f2017-09-06 18:18:10 -04002175@unittest.skipIf(fcntl is None, "need fcntl")
2176@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2177 'VSOCK sockets required for this test.')
2178class BasicVSOCKTest(unittest.TestCase):
2179
2180 def testCrucialConstants(self):
2181 socket.AF_VSOCK
2182
2183 def testVSOCKConstants(self):
2184 socket.SO_VM_SOCKETS_BUFFER_SIZE
2185 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2186 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2187 socket.VMADDR_CID_ANY
2188 socket.VMADDR_PORT_ANY
2189 socket.VMADDR_CID_HOST
2190 socket.VM_SOCKETS_INVALID_VERSION
2191 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2192
2193 def testCreateSocket(self):
2194 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2195 pass
2196
2197 def testSocketBufferSize(self):
2198 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2199 orig_max = s.getsockopt(socket.AF_VSOCK,
2200 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2201 orig = s.getsockopt(socket.AF_VSOCK,
2202 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2203 orig_min = s.getsockopt(socket.AF_VSOCK,
2204 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2205
2206 s.setsockopt(socket.AF_VSOCK,
2207 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2208 s.setsockopt(socket.AF_VSOCK,
2209 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2210 s.setsockopt(socket.AF_VSOCK,
2211 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2212
2213 self.assertEqual(orig_max * 2,
2214 s.getsockopt(socket.AF_VSOCK,
2215 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2216 self.assertEqual(orig * 2,
2217 s.getsockopt(socket.AF_VSOCK,
2218 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2219 self.assertEqual(orig_min * 2,
2220 s.getsockopt(socket.AF_VSOCK,
2221 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2222
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002223
Guido van Rossum24e4af82002-06-12 19:18:08 +00002224class BasicTCPTest(SocketConnectedTest):
2225
2226 def __init__(self, methodName='runTest'):
2227 SocketConnectedTest.__init__(self, methodName=methodName)
2228
2229 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002230 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002231 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002232 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002233
2234 def _testRecv(self):
2235 self.serv_conn.send(MSG)
2236
2237 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002238 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002239 seg1 = self.cli_conn.recv(len(MSG) - 3)
2240 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002241 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002242 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002243
2244 def _testOverFlowRecv(self):
2245 self.serv_conn.send(MSG)
2246
2247 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002248 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002249 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002250 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002251
2252 def _testRecvFrom(self):
2253 self.serv_conn.send(MSG)
2254
2255 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002256 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002257 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2258 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002259 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002260 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002261
2262 def _testOverFlowRecvFrom(self):
2263 self.serv_conn.send(MSG)
2264
2265 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002266 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002267 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002268 while 1:
2269 read = self.cli_conn.recv(1024)
2270 if not read:
2271 break
Guido van Rossume531e292002-08-08 20:28:34 +00002272 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002273 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002274
2275 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002276 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002277 self.serv_conn.sendall(big_chunk)
2278
2279 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002280 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002281 fd = self.cli_conn.fileno()
2282 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002283 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002284 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002285 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002286 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002287
2288 def _testFromFd(self):
2289 self.serv_conn.send(MSG)
2290
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002291 def testDup(self):
2292 # Testing dup()
2293 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002294 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002295 msg = sock.recv(1024)
2296 self.assertEqual(msg, MSG)
2297
2298 def _testDup(self):
2299 self.serv_conn.send(MSG)
2300
Guido van Rossum24e4af82002-06-12 19:18:08 +00002301 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002302 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002303 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002304 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002305 # wait for _testShutdown to finish: on OS X, when the server
2306 # closes the connection the client also becomes disconnected,
2307 # and the client's shutdown call will fail. (Issue #4397.)
2308 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002309
2310 def _testShutdown(self):
2311 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002312 self.serv_conn.shutdown(2)
2313
2314 testShutdown_overflow = support.cpython_only(testShutdown)
2315
2316 @support.cpython_only
2317 def _testShutdown_overflow(self):
2318 import _testcapi
2319 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002320 # Issue 15989
2321 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2322 _testcapi.INT_MAX + 1)
2323 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2324 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002325 self.serv_conn.shutdown(2)
2326
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002327 def testDetach(self):
2328 # Testing detach()
2329 fileno = self.cli_conn.fileno()
2330 f = self.cli_conn.detach()
2331 self.assertEqual(f, fileno)
2332 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002333 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002334 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002335 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002336 # ...but we can create another socket using the (still open)
2337 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002338 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002339 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002340 msg = sock.recv(1024)
2341 self.assertEqual(msg, MSG)
2342
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002343 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002344 self.serv_conn.send(MSG)
2345
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002346
Guido van Rossum24e4af82002-06-12 19:18:08 +00002347class BasicUDPTest(ThreadedUDPSocketTest):
2348
2349 def __init__(self, methodName='runTest'):
2350 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2351
2352 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002353 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002354 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002355 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002356
2357 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002358 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002359
Guido van Rossum1c938012002-06-12 21:17:20 +00002360 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002361 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002362 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002363 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002364
Guido van Rossum1c938012002-06-12 21:17:20 +00002365 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002366 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002367
Guido van Rossumd8faa362007-04-27 19:54:29 +00002368 def testRecvFromNegative(self):
2369 # Negative lengths passed to recvfrom should give ValueError.
2370 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2371
2372 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002373 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002374
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002375# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2376# same test code is used with different families and types of socket
2377# (e.g. stream, datagram), and tests using recvmsg() are repeated
2378# using recvmsg_into().
2379#
2380# The generic test classes such as SendmsgTests and
2381# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2382# supplied with sockets cli_sock and serv_sock representing the
2383# client's and the server's end of the connection respectively, and
2384# attributes cli_addr and serv_addr holding their (numeric where
2385# appropriate) addresses.
2386#
2387# The final concrete test classes combine these with subclasses of
2388# SocketTestBase which set up client and server sockets of a specific
2389# type, and with subclasses of SendrecvmsgBase such as
2390# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2391# sockets to cli_sock and serv_sock and override the methods and
2392# attributes of SendrecvmsgBase to fill in destination addresses if
2393# needed when sending, check for specific flags in msg_flags, etc.
2394#
2395# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2396# recvmsg_into().
2397
2398# XXX: like the other datagram (UDP) tests in this module, the code
2399# here assumes that datagram delivery on the local machine will be
2400# reliable.
2401
2402class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2403 # Base class for sendmsg()/recvmsg() tests.
2404
2405 # Time in seconds to wait before considering a test failed, or
2406 # None for no timeout. Not all tests actually set a timeout.
2407 fail_timeout = 3.0
2408
2409 def setUp(self):
2410 self.misc_event = threading.Event()
2411 super().setUp()
2412
2413 def sendToServer(self, msg):
2414 # Send msg to the server.
2415 return self.cli_sock.send(msg)
2416
2417 # Tuple of alternative default arguments for sendmsg() when called
2418 # via sendmsgToServer() (e.g. to include a destination address).
2419 sendmsg_to_server_defaults = ()
2420
2421 def sendmsgToServer(self, *args):
2422 # Call sendmsg() on self.cli_sock with the given arguments,
2423 # filling in any arguments which are not supplied with the
2424 # corresponding items of self.sendmsg_to_server_defaults, if
2425 # any.
2426 return self.cli_sock.sendmsg(
2427 *(args + self.sendmsg_to_server_defaults[len(args):]))
2428
2429 def doRecvmsg(self, sock, bufsize, *args):
2430 # Call recvmsg() on sock with given arguments and return its
2431 # result. Should be used for tests which can use either
2432 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2433 # this method with one which emulates it using recvmsg_into(),
2434 # thus allowing the same test to be used for both methods.
2435 result = sock.recvmsg(bufsize, *args)
2436 self.registerRecvmsgResult(result)
2437 return result
2438
2439 def registerRecvmsgResult(self, result):
2440 # Called by doRecvmsg() with the return value of recvmsg() or
2441 # recvmsg_into(). Can be overridden to arrange cleanup based
2442 # on the returned ancillary data, for instance.
2443 pass
2444
2445 def checkRecvmsgAddress(self, addr1, addr2):
2446 # Called to compare the received address with the address of
2447 # the peer.
2448 self.assertEqual(addr1, addr2)
2449
2450 # Flags that are normally unset in msg_flags
2451 msg_flags_common_unset = 0
2452 for name in ("MSG_CTRUNC", "MSG_OOB"):
2453 msg_flags_common_unset |= getattr(socket, name, 0)
2454
2455 # Flags that are normally set
2456 msg_flags_common_set = 0
2457
2458 # Flags set when a complete record has been received (e.g. MSG_EOR
2459 # for SCTP)
2460 msg_flags_eor_indicator = 0
2461
2462 # Flags set when a complete record has not been received
2463 # (e.g. MSG_TRUNC for datagram sockets)
2464 msg_flags_non_eor_indicator = 0
2465
2466 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2467 # Method to check the value of msg_flags returned by recvmsg[_into]().
2468 #
2469 # Checks that all bits in msg_flags_common_set attribute are
2470 # set in "flags" and all bits in msg_flags_common_unset are
2471 # unset.
2472 #
2473 # The "eor" argument specifies whether the flags should
2474 # indicate that a full record (or datagram) has been received.
2475 # If "eor" is None, no checks are done; otherwise, checks
2476 # that:
2477 #
2478 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2479 # set and all bits in msg_flags_non_eor_indicator are unset
2480 #
2481 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2482 # are set and all bits in msg_flags_eor_indicator are unset
2483 #
2484 # If "checkset" and/or "checkunset" are supplied, they require
2485 # the given bits to be set or unset respectively, overriding
2486 # what the attributes require for those bits.
2487 #
2488 # If any bits are set in "ignore", they will not be checked,
2489 # regardless of the other inputs.
2490 #
2491 # Will raise Exception if the inputs require a bit to be both
2492 # set and unset, and it is not ignored.
2493
2494 defaultset = self.msg_flags_common_set
2495 defaultunset = self.msg_flags_common_unset
2496
2497 if eor:
2498 defaultset |= self.msg_flags_eor_indicator
2499 defaultunset |= self.msg_flags_non_eor_indicator
2500 elif eor is not None:
2501 defaultset |= self.msg_flags_non_eor_indicator
2502 defaultunset |= self.msg_flags_eor_indicator
2503
2504 # Function arguments override defaults
2505 defaultset &= ~checkunset
2506 defaultunset &= ~checkset
2507
2508 # Merge arguments with remaining defaults, and check for conflicts
2509 checkset |= defaultset
2510 checkunset |= defaultunset
2511 inboth = checkset & checkunset & ~ignore
2512 if inboth:
2513 raise Exception("contradictory set, unset requirements for flags "
2514 "{0:#x}".format(inboth))
2515
2516 # Compare with given msg_flags value
2517 mask = (checkset | checkunset) & ~ignore
2518 self.assertEqual(flags & mask, checkset & mask)
2519
2520
2521class RecvmsgIntoMixin(SendrecvmsgBase):
2522 # Mixin to implement doRecvmsg() using recvmsg_into().
2523
2524 def doRecvmsg(self, sock, bufsize, *args):
2525 buf = bytearray(bufsize)
2526 result = sock.recvmsg_into([buf], *args)
2527 self.registerRecvmsgResult(result)
2528 self.assertGreaterEqual(result[0], 0)
2529 self.assertLessEqual(result[0], bufsize)
2530 return (bytes(buf[:result[0]]),) + result[1:]
2531
2532
2533class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2534 # Defines flags to be checked in msg_flags for datagram sockets.
2535
2536 @property
2537 def msg_flags_non_eor_indicator(self):
2538 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2539
2540
2541class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2542 # Defines flags to be checked in msg_flags for SCTP sockets.
2543
2544 @property
2545 def msg_flags_eor_indicator(self):
2546 return super().msg_flags_eor_indicator | socket.MSG_EOR
2547
2548
2549class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2550 # Base class for tests on connectionless-mode sockets. Users must
2551 # supply sockets on attributes cli and serv to be mapped to
2552 # cli_sock and serv_sock respectively.
2553
2554 @property
2555 def serv_sock(self):
2556 return self.serv
2557
2558 @property
2559 def cli_sock(self):
2560 return self.cli
2561
2562 @property
2563 def sendmsg_to_server_defaults(self):
2564 return ([], [], 0, self.serv_addr)
2565
2566 def sendToServer(self, msg):
2567 return self.cli_sock.sendto(msg, self.serv_addr)
2568
2569
2570class SendrecvmsgConnectedBase(SendrecvmsgBase):
2571 # Base class for tests on connected sockets. Users must supply
2572 # sockets on attributes serv_conn and cli_conn (representing the
2573 # connections *to* the server and the client), to be mapped to
2574 # cli_sock and serv_sock respectively.
2575
2576 @property
2577 def serv_sock(self):
2578 return self.cli_conn
2579
2580 @property
2581 def cli_sock(self):
2582 return self.serv_conn
2583
2584 def checkRecvmsgAddress(self, addr1, addr2):
2585 # Address is currently "unspecified" for a connected socket,
2586 # so we don't examine it
2587 pass
2588
2589
2590class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2591 # Base class to set a timeout on server's socket.
2592
2593 def setUp(self):
2594 super().setUp()
2595 self.serv_sock.settimeout(self.fail_timeout)
2596
2597
2598class SendmsgTests(SendrecvmsgServerTimeoutBase):
2599 # Tests for sendmsg() which can use any socket type and do not
2600 # involve recvmsg() or recvmsg_into().
2601
2602 def testSendmsg(self):
2603 # Send a simple message with sendmsg().
2604 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2605
2606 def _testSendmsg(self):
2607 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2608
2609 def testSendmsgDataGenerator(self):
2610 # Send from buffer obtained from a generator (not a sequence).
2611 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2612
2613 def _testSendmsgDataGenerator(self):
2614 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2615 len(MSG))
2616
2617 def testSendmsgAncillaryGenerator(self):
2618 # Gather (empty) ancillary data from a generator.
2619 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2620
2621 def _testSendmsgAncillaryGenerator(self):
2622 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2623 len(MSG))
2624
2625 def testSendmsgArray(self):
2626 # Send data from an array instead of the usual bytes object.
2627 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2628
2629 def _testSendmsgArray(self):
2630 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2631 len(MSG))
2632
2633 def testSendmsgGather(self):
2634 # Send message data from more than one buffer (gather write).
2635 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2636
2637 def _testSendmsgGather(self):
2638 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2639
2640 def testSendmsgBadArgs(self):
2641 # Check that sendmsg() rejects invalid arguments.
2642 self.assertEqual(self.serv_sock.recv(1000), b"done")
2643
2644 def _testSendmsgBadArgs(self):
2645 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2646 self.assertRaises(TypeError, self.sendmsgToServer,
2647 b"not in an iterable")
2648 self.assertRaises(TypeError, self.sendmsgToServer,
2649 object())
2650 self.assertRaises(TypeError, self.sendmsgToServer,
2651 [object()])
2652 self.assertRaises(TypeError, self.sendmsgToServer,
2653 [MSG, object()])
2654 self.assertRaises(TypeError, self.sendmsgToServer,
2655 [MSG], object())
2656 self.assertRaises(TypeError, self.sendmsgToServer,
2657 [MSG], [], object())
2658 self.assertRaises(TypeError, self.sendmsgToServer,
2659 [MSG], [], 0, object())
2660 self.sendToServer(b"done")
2661
2662 def testSendmsgBadCmsg(self):
2663 # Check that invalid ancillary data items are rejected.
2664 self.assertEqual(self.serv_sock.recv(1000), b"done")
2665
2666 def _testSendmsgBadCmsg(self):
2667 self.assertRaises(TypeError, self.sendmsgToServer,
2668 [MSG], [object()])
2669 self.assertRaises(TypeError, self.sendmsgToServer,
2670 [MSG], [(object(), 0, b"data")])
2671 self.assertRaises(TypeError, self.sendmsgToServer,
2672 [MSG], [(0, object(), b"data")])
2673 self.assertRaises(TypeError, self.sendmsgToServer,
2674 [MSG], [(0, 0, object())])
2675 self.assertRaises(TypeError, self.sendmsgToServer,
2676 [MSG], [(0, 0)])
2677 self.assertRaises(TypeError, self.sendmsgToServer,
2678 [MSG], [(0, 0, b"data", 42)])
2679 self.sendToServer(b"done")
2680
2681 @requireAttrs(socket, "CMSG_SPACE")
2682 def testSendmsgBadMultiCmsg(self):
2683 # Check that invalid ancillary data items are rejected when
2684 # more than one item is present.
2685 self.assertEqual(self.serv_sock.recv(1000), b"done")
2686
2687 @testSendmsgBadMultiCmsg.client_skip
2688 def _testSendmsgBadMultiCmsg(self):
2689 self.assertRaises(TypeError, self.sendmsgToServer,
2690 [MSG], [0, 0, b""])
2691 self.assertRaises(TypeError, self.sendmsgToServer,
2692 [MSG], [(0, 0, b""), object()])
2693 self.sendToServer(b"done")
2694
2695 def testSendmsgExcessCmsgReject(self):
2696 # Check that sendmsg() rejects excess ancillary data items
2697 # when the number that can be sent is limited.
2698 self.assertEqual(self.serv_sock.recv(1000), b"done")
2699
2700 def _testSendmsgExcessCmsgReject(self):
2701 if not hasattr(socket, "CMSG_SPACE"):
2702 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002703 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002704 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2705 self.assertIsNone(cm.exception.errno)
2706 self.sendToServer(b"done")
2707
2708 def testSendmsgAfterClose(self):
2709 # Check that sendmsg() fails on a closed socket.
2710 pass
2711
2712 def _testSendmsgAfterClose(self):
2713 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002714 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002715
2716
2717class SendmsgStreamTests(SendmsgTests):
2718 # Tests for sendmsg() which require a stream socket and do not
2719 # involve recvmsg() or recvmsg_into().
2720
2721 def testSendmsgExplicitNoneAddr(self):
2722 # Check that peer address can be specified as None.
2723 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2724
2725 def _testSendmsgExplicitNoneAddr(self):
2726 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2727
2728 def testSendmsgTimeout(self):
2729 # Check that timeout works with sendmsg().
2730 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2731 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2732
2733 def _testSendmsgTimeout(self):
2734 try:
2735 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002736 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002737 while True:
2738 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002739 except socket.timeout:
2740 pass
2741 except OSError as exc:
2742 if exc.errno != errno.ENOMEM:
2743 raise
2744 # bpo-33937 the test randomly fails on Travis CI with
2745 # "OSError: [Errno 12] Cannot allocate memory"
2746 else:
2747 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002748 finally:
2749 self.misc_event.set()
2750
2751 # XXX: would be nice to have more tests for sendmsg flags argument.
2752
2753 # Linux supports MSG_DONTWAIT when sending, but in general, it
2754 # only works when receiving. Could add other platforms if they
2755 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002756 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002757 "MSG_DONTWAIT not known to work on this platform when "
2758 "sending")
2759 def testSendmsgDontWait(self):
2760 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2761 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2762 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2763
2764 @testSendmsgDontWait.client_skip
2765 def _testSendmsgDontWait(self):
2766 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002767 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002768 while True:
2769 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002770 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2771 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002772 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002773 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002774 finally:
2775 self.misc_event.set()
2776
2777
2778class SendmsgConnectionlessTests(SendmsgTests):
2779 # Tests for sendmsg() which require a connectionless-mode
2780 # (e.g. datagram) socket, and do not involve recvmsg() or
2781 # recvmsg_into().
2782
2783 def testSendmsgNoDestAddr(self):
2784 # Check that sendmsg() fails when no destination address is
2785 # given for unconnected socket.
2786 pass
2787
2788 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002789 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002790 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002791 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002792 [MSG], [], 0, None)
2793
2794
2795class RecvmsgGenericTests(SendrecvmsgBase):
2796 # Tests for recvmsg() which can also be emulated using
2797 # recvmsg_into(), and can use any socket type.
2798
2799 def testRecvmsg(self):
2800 # Receive a simple message with recvmsg[_into]().
2801 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2802 self.assertEqual(msg, MSG)
2803 self.checkRecvmsgAddress(addr, self.cli_addr)
2804 self.assertEqual(ancdata, [])
2805 self.checkFlags(flags, eor=True)
2806
2807 def _testRecvmsg(self):
2808 self.sendToServer(MSG)
2809
2810 def testRecvmsgExplicitDefaults(self):
2811 # Test recvmsg[_into]() with default arguments provided explicitly.
2812 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2813 len(MSG), 0, 0)
2814 self.assertEqual(msg, MSG)
2815 self.checkRecvmsgAddress(addr, self.cli_addr)
2816 self.assertEqual(ancdata, [])
2817 self.checkFlags(flags, eor=True)
2818
2819 def _testRecvmsgExplicitDefaults(self):
2820 self.sendToServer(MSG)
2821
2822 def testRecvmsgShorter(self):
2823 # Receive a message smaller than buffer.
2824 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2825 len(MSG) + 42)
2826 self.assertEqual(msg, MSG)
2827 self.checkRecvmsgAddress(addr, self.cli_addr)
2828 self.assertEqual(ancdata, [])
2829 self.checkFlags(flags, eor=True)
2830
2831 def _testRecvmsgShorter(self):
2832 self.sendToServer(MSG)
2833
2834 def testRecvmsgTrunc(self):
2835 # Receive part of message, check for truncation indicators.
2836 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2837 len(MSG) - 3)
2838 self.assertEqual(msg, MSG[:-3])
2839 self.checkRecvmsgAddress(addr, self.cli_addr)
2840 self.assertEqual(ancdata, [])
2841 self.checkFlags(flags, eor=False)
2842
2843 def _testRecvmsgTrunc(self):
2844 self.sendToServer(MSG)
2845
2846 def testRecvmsgShortAncillaryBuf(self):
2847 # Test ancillary data buffer too small to hold any ancillary data.
2848 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2849 len(MSG), 1)
2850 self.assertEqual(msg, MSG)
2851 self.checkRecvmsgAddress(addr, self.cli_addr)
2852 self.assertEqual(ancdata, [])
2853 self.checkFlags(flags, eor=True)
2854
2855 def _testRecvmsgShortAncillaryBuf(self):
2856 self.sendToServer(MSG)
2857
2858 def testRecvmsgLongAncillaryBuf(self):
2859 # Test large ancillary data buffer.
2860 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2861 len(MSG), 10240)
2862 self.assertEqual(msg, MSG)
2863 self.checkRecvmsgAddress(addr, self.cli_addr)
2864 self.assertEqual(ancdata, [])
2865 self.checkFlags(flags, eor=True)
2866
2867 def _testRecvmsgLongAncillaryBuf(self):
2868 self.sendToServer(MSG)
2869
2870 def testRecvmsgAfterClose(self):
2871 # Check that recvmsg[_into]() fails on a closed socket.
2872 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002873 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002874
2875 def _testRecvmsgAfterClose(self):
2876 pass
2877
2878 def testRecvmsgTimeout(self):
2879 # Check that timeout works.
2880 try:
2881 self.serv_sock.settimeout(0.03)
2882 self.assertRaises(socket.timeout,
2883 self.doRecvmsg, self.serv_sock, len(MSG))
2884 finally:
2885 self.misc_event.set()
2886
2887 def _testRecvmsgTimeout(self):
2888 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2889
2890 @requireAttrs(socket, "MSG_PEEK")
2891 def testRecvmsgPeek(self):
2892 # Check that MSG_PEEK in flags enables examination of pending
2893 # data without consuming it.
2894
2895 # Receive part of data with MSG_PEEK.
2896 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2897 len(MSG) - 3, 0,
2898 socket.MSG_PEEK)
2899 self.assertEqual(msg, MSG[:-3])
2900 self.checkRecvmsgAddress(addr, self.cli_addr)
2901 self.assertEqual(ancdata, [])
2902 # Ignoring MSG_TRUNC here (so this test is the same for stream
2903 # and datagram sockets). Some wording in POSIX seems to
2904 # suggest that it needn't be set when peeking, but that may
2905 # just be a slip.
2906 self.checkFlags(flags, eor=False,
2907 ignore=getattr(socket, "MSG_TRUNC", 0))
2908
2909 # Receive all data with MSG_PEEK.
2910 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2911 len(MSG), 0,
2912 socket.MSG_PEEK)
2913 self.assertEqual(msg, MSG)
2914 self.checkRecvmsgAddress(addr, self.cli_addr)
2915 self.assertEqual(ancdata, [])
2916 self.checkFlags(flags, eor=True)
2917
2918 # Check that the same data can still be received normally.
2919 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2920 self.assertEqual(msg, MSG)
2921 self.checkRecvmsgAddress(addr, self.cli_addr)
2922 self.assertEqual(ancdata, [])
2923 self.checkFlags(flags, eor=True)
2924
2925 @testRecvmsgPeek.client_skip
2926 def _testRecvmsgPeek(self):
2927 self.sendToServer(MSG)
2928
2929 @requireAttrs(socket.socket, "sendmsg")
2930 def testRecvmsgFromSendmsg(self):
2931 # Test receiving with recvmsg[_into]() when message is sent
2932 # using sendmsg().
2933 self.serv_sock.settimeout(self.fail_timeout)
2934 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2935 self.assertEqual(msg, MSG)
2936 self.checkRecvmsgAddress(addr, self.cli_addr)
2937 self.assertEqual(ancdata, [])
2938 self.checkFlags(flags, eor=True)
2939
2940 @testRecvmsgFromSendmsg.client_skip
2941 def _testRecvmsgFromSendmsg(self):
2942 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2943
2944
2945class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2946 # Tests which require a stream socket and can use either recvmsg()
2947 # or recvmsg_into().
2948
2949 def testRecvmsgEOF(self):
2950 # Receive end-of-stream indicator (b"", peer socket closed).
2951 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2952 self.assertEqual(msg, b"")
2953 self.checkRecvmsgAddress(addr, self.cli_addr)
2954 self.assertEqual(ancdata, [])
2955 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2956
2957 def _testRecvmsgEOF(self):
2958 self.cli_sock.close()
2959
2960 def testRecvmsgOverflow(self):
2961 # Receive a message in more than one chunk.
2962 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2963 len(MSG) - 3)
2964 self.checkRecvmsgAddress(addr, self.cli_addr)
2965 self.assertEqual(ancdata, [])
2966 self.checkFlags(flags, eor=False)
2967
2968 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2969 self.checkRecvmsgAddress(addr, self.cli_addr)
2970 self.assertEqual(ancdata, [])
2971 self.checkFlags(flags, eor=True)
2972
2973 msg = seg1 + seg2
2974 self.assertEqual(msg, MSG)
2975
2976 def _testRecvmsgOverflow(self):
2977 self.sendToServer(MSG)
2978
2979
2980class RecvmsgTests(RecvmsgGenericTests):
2981 # Tests for recvmsg() which can use any socket type.
2982
2983 def testRecvmsgBadArgs(self):
2984 # Check that recvmsg() rejects invalid arguments.
2985 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2986 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2987 -1, 0, 0)
2988 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2989 len(MSG), -1, 0)
2990 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2991 [bytearray(10)], 0, 0)
2992 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2993 object(), 0, 0)
2994 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2995 len(MSG), object(), 0)
2996 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2997 len(MSG), 0, object())
2998
2999 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3000 self.assertEqual(msg, MSG)
3001 self.checkRecvmsgAddress(addr, self.cli_addr)
3002 self.assertEqual(ancdata, [])
3003 self.checkFlags(flags, eor=True)
3004
3005 def _testRecvmsgBadArgs(self):
3006 self.sendToServer(MSG)
3007
3008
3009class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3010 # Tests for recvmsg_into() which can use any socket type.
3011
3012 def testRecvmsgIntoBadArgs(self):
3013 # Check that recvmsg_into() rejects invalid arguments.
3014 buf = bytearray(len(MSG))
3015 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3016 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3017 len(MSG), 0, 0)
3018 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3019 buf, 0, 0)
3020 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3021 [object()], 0, 0)
3022 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3023 [b"I'm not writable"], 0, 0)
3024 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3025 [buf, object()], 0, 0)
3026 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3027 [buf], -1, 0)
3028 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3029 [buf], object(), 0)
3030 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3031 [buf], 0, object())
3032
3033 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3034 self.assertEqual(nbytes, len(MSG))
3035 self.assertEqual(buf, bytearray(MSG))
3036 self.checkRecvmsgAddress(addr, self.cli_addr)
3037 self.assertEqual(ancdata, [])
3038 self.checkFlags(flags, eor=True)
3039
3040 def _testRecvmsgIntoBadArgs(self):
3041 self.sendToServer(MSG)
3042
3043 def testRecvmsgIntoGenerator(self):
3044 # Receive into buffer obtained from a generator (not a sequence).
3045 buf = bytearray(len(MSG))
3046 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3047 (o for o in [buf]))
3048 self.assertEqual(nbytes, len(MSG))
3049 self.assertEqual(buf, bytearray(MSG))
3050 self.checkRecvmsgAddress(addr, self.cli_addr)
3051 self.assertEqual(ancdata, [])
3052 self.checkFlags(flags, eor=True)
3053
3054 def _testRecvmsgIntoGenerator(self):
3055 self.sendToServer(MSG)
3056
3057 def testRecvmsgIntoArray(self):
3058 # Receive into an array rather than the usual bytearray.
3059 buf = array.array("B", [0] * len(MSG))
3060 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3061 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003062 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003063 self.checkRecvmsgAddress(addr, self.cli_addr)
3064 self.assertEqual(ancdata, [])
3065 self.checkFlags(flags, eor=True)
3066
3067 def _testRecvmsgIntoArray(self):
3068 self.sendToServer(MSG)
3069
3070 def testRecvmsgIntoScatter(self):
3071 # Receive into multiple buffers (scatter write).
3072 b1 = bytearray(b"----")
3073 b2 = bytearray(b"0123456789")
3074 b3 = bytearray(b"--------------")
3075 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3076 [b1, memoryview(b2)[2:9], b3])
3077 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3078 self.assertEqual(b1, bytearray(b"Mary"))
3079 self.assertEqual(b2, bytearray(b"01 had a 9"))
3080 self.assertEqual(b3, bytearray(b"little lamb---"))
3081 self.checkRecvmsgAddress(addr, self.cli_addr)
3082 self.assertEqual(ancdata, [])
3083 self.checkFlags(flags, eor=True)
3084
3085 def _testRecvmsgIntoScatter(self):
3086 self.sendToServer(b"Mary had a little lamb")
3087
3088
3089class CmsgMacroTests(unittest.TestCase):
3090 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3091 # assumptions used by sendmsg() and recvmsg[_into](), which share
3092 # code with these functions.
3093
3094 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003095 try:
3096 import _testcapi
3097 except ImportError:
3098 socklen_t_limit = 0x7fffffff
3099 else:
3100 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003101
3102 @requireAttrs(socket, "CMSG_LEN")
3103 def testCMSG_LEN(self):
3104 # Test CMSG_LEN() with various valid and invalid values,
3105 # checking the assumptions used by recvmsg() and sendmsg().
3106 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3107 values = list(range(257)) + list(range(toobig - 257, toobig))
3108
3109 # struct cmsghdr has at least three members, two of which are ints
3110 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3111 for n in values:
3112 ret = socket.CMSG_LEN(n)
3113 # This is how recvmsg() calculates the data size
3114 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3115 self.assertLessEqual(ret, self.socklen_t_limit)
3116
3117 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3118 # sendmsg() shares code with these functions, and requires
3119 # that it reject values over the limit.
3120 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3121 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3122
3123 @requireAttrs(socket, "CMSG_SPACE")
3124 def testCMSG_SPACE(self):
3125 # Test CMSG_SPACE() with various valid and invalid values,
3126 # checking the assumptions used by sendmsg().
3127 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3128 values = list(range(257)) + list(range(toobig - 257, toobig))
3129
3130 last = socket.CMSG_SPACE(0)
3131 # struct cmsghdr has at least three members, two of which are ints
3132 self.assertGreater(last, array.array("i").itemsize * 2)
3133 for n in values:
3134 ret = socket.CMSG_SPACE(n)
3135 self.assertGreaterEqual(ret, last)
3136 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3137 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3138 self.assertLessEqual(ret, self.socklen_t_limit)
3139 last = ret
3140
3141 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3142 # sendmsg() shares code with these functions, and requires
3143 # that it reject values over the limit.
3144 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3145 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3146
3147
3148class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3149 # Tests for file descriptor passing on Unix-domain sockets.
3150
3151 # Invalid file descriptor value that's unlikely to evaluate to a
3152 # real FD even if one of its bytes is replaced with a different
3153 # value (which shouldn't actually happen).
3154 badfd = -0x5555
3155
3156 def newFDs(self, n):
3157 # Return a list of n file descriptors for newly-created files
3158 # containing their list indices as ASCII numbers.
3159 fds = []
3160 for i in range(n):
3161 fd, path = tempfile.mkstemp()
3162 self.addCleanup(os.unlink, path)
3163 self.addCleanup(os.close, fd)
3164 os.write(fd, str(i).encode())
3165 fds.append(fd)
3166 return fds
3167
3168 def checkFDs(self, fds):
3169 # Check that the file descriptors in the given list contain
3170 # their correct list indices as ASCII numbers.
3171 for n, fd in enumerate(fds):
3172 os.lseek(fd, 0, os.SEEK_SET)
3173 self.assertEqual(os.read(fd, 1024), str(n).encode())
3174
3175 def registerRecvmsgResult(self, result):
3176 self.addCleanup(self.closeRecvmsgFDs, result)
3177
3178 def closeRecvmsgFDs(self, recvmsg_result):
3179 # Close all file descriptors specified in the ancillary data
3180 # of the given return value from recvmsg() or recvmsg_into().
3181 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3182 if (cmsg_level == socket.SOL_SOCKET and
3183 cmsg_type == socket.SCM_RIGHTS):
3184 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003185 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003186 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3187 for fd in fds:
3188 os.close(fd)
3189
3190 def createAndSendFDs(self, n):
3191 # Send n new file descriptors created by newFDs() to the
3192 # server, with the constant MSG as the non-ancillary data.
3193 self.assertEqual(
3194 self.sendmsgToServer([MSG],
3195 [(socket.SOL_SOCKET,
3196 socket.SCM_RIGHTS,
3197 array.array("i", self.newFDs(n)))]),
3198 len(MSG))
3199
3200 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3201 # Check that constant MSG was received with numfds file
3202 # descriptors in a maximum of maxcmsgs control messages (which
3203 # must contain only complete integers). By default, check
3204 # that MSG_CTRUNC is unset, but ignore any flags in
3205 # ignoreflags.
3206 msg, ancdata, flags, addr = result
3207 self.assertEqual(msg, MSG)
3208 self.checkRecvmsgAddress(addr, self.cli_addr)
3209 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3210 ignore=ignoreflags)
3211
3212 self.assertIsInstance(ancdata, list)
3213 self.assertLessEqual(len(ancdata), maxcmsgs)
3214 fds = array.array("i")
3215 for item in ancdata:
3216 self.assertIsInstance(item, tuple)
3217 cmsg_level, cmsg_type, cmsg_data = item
3218 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3219 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3220 self.assertIsInstance(cmsg_data, bytes)
3221 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003222 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003223
3224 self.assertEqual(len(fds), numfds)
3225 self.checkFDs(fds)
3226
3227 def testFDPassSimple(self):
3228 # Pass a single FD (array read from bytes object).
3229 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3230 len(MSG), 10240))
3231
3232 def _testFDPassSimple(self):
3233 self.assertEqual(
3234 self.sendmsgToServer(
3235 [MSG],
3236 [(socket.SOL_SOCKET,
3237 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003238 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003239 len(MSG))
3240
3241 def testMultipleFDPass(self):
3242 # Pass multiple FDs in a single array.
3243 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3244 len(MSG), 10240))
3245
3246 def _testMultipleFDPass(self):
3247 self.createAndSendFDs(4)
3248
3249 @requireAttrs(socket, "CMSG_SPACE")
3250 def testFDPassCMSG_SPACE(self):
3251 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3252 self.checkRecvmsgFDs(
3253 4, self.doRecvmsg(self.serv_sock, len(MSG),
3254 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3255
3256 @testFDPassCMSG_SPACE.client_skip
3257 def _testFDPassCMSG_SPACE(self):
3258 self.createAndSendFDs(4)
3259
3260 def testFDPassCMSG_LEN(self):
3261 # Test using CMSG_LEN() to calculate ancillary buffer size.
3262 self.checkRecvmsgFDs(1,
3263 self.doRecvmsg(self.serv_sock, len(MSG),
3264 socket.CMSG_LEN(4 * SIZEOF_INT)),
3265 # RFC 3542 says implementations may set
3266 # MSG_CTRUNC if there isn't enough space
3267 # for trailing padding.
3268 ignoreflags=socket.MSG_CTRUNC)
3269
3270 def _testFDPassCMSG_LEN(self):
3271 self.createAndSendFDs(1)
3272
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003273 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003274 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003275 @requireAttrs(socket, "CMSG_SPACE")
3276 def testFDPassSeparate(self):
3277 # Pass two FDs in two separate arrays. Arrays may be combined
3278 # into a single control message by the OS.
3279 self.checkRecvmsgFDs(2,
3280 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3281 maxcmsgs=2)
3282
3283 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003284 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003285 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003286 def _testFDPassSeparate(self):
3287 fd0, fd1 = self.newFDs(2)
3288 self.assertEqual(
3289 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3290 socket.SCM_RIGHTS,
3291 array.array("i", [fd0])),
3292 (socket.SOL_SOCKET,
3293 socket.SCM_RIGHTS,
3294 array.array("i", [fd1]))]),
3295 len(MSG))
3296
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003297 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003298 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003299 @requireAttrs(socket, "CMSG_SPACE")
3300 def testFDPassSeparateMinSpace(self):
3301 # Pass two FDs in two separate arrays, receiving them into the
3302 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003303 num_fds = 2
3304 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003305 self.doRecvmsg(self.serv_sock, len(MSG),
3306 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003307 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003308 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3309
3310 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003311 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003312 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003313 def _testFDPassSeparateMinSpace(self):
3314 fd0, fd1 = self.newFDs(2)
3315 self.assertEqual(
3316 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3317 socket.SCM_RIGHTS,
3318 array.array("i", [fd0])),
3319 (socket.SOL_SOCKET,
3320 socket.SCM_RIGHTS,
3321 array.array("i", [fd1]))]),
3322 len(MSG))
3323
3324 def sendAncillaryIfPossible(self, msg, ancdata):
3325 # Try to send msg and ancdata to server, but if the system
3326 # call fails, just send msg with no ancillary data.
3327 try:
3328 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003329 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003330 # Check that it was the system call that failed
3331 self.assertIsInstance(e.errno, int)
3332 nbytes = self.sendmsgToServer([msg])
3333 self.assertEqual(nbytes, len(msg))
3334
Brett Cannon3bbad122015-12-28 17:21:44 -08003335 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003336 def testFDPassEmpty(self):
3337 # Try to pass an empty FD array. Can receive either no array
3338 # or an empty array.
3339 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3340 len(MSG), 10240),
3341 ignoreflags=socket.MSG_CTRUNC)
3342
3343 def _testFDPassEmpty(self):
3344 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3345 socket.SCM_RIGHTS,
3346 b"")])
3347
3348 def testFDPassPartialInt(self):
3349 # Try to pass a truncated FD array.
3350 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3351 len(MSG), 10240)
3352 self.assertEqual(msg, MSG)
3353 self.checkRecvmsgAddress(addr, self.cli_addr)
3354 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3355 self.assertLessEqual(len(ancdata), 1)
3356 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3357 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3358 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3359 self.assertLess(len(cmsg_data), SIZEOF_INT)
3360
3361 def _testFDPassPartialInt(self):
3362 self.sendAncillaryIfPossible(
3363 MSG,
3364 [(socket.SOL_SOCKET,
3365 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003366 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003367
3368 @requireAttrs(socket, "CMSG_SPACE")
3369 def testFDPassPartialIntInMiddle(self):
3370 # Try to pass two FD arrays, the first of which is truncated.
3371 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3372 len(MSG), 10240)
3373 self.assertEqual(msg, MSG)
3374 self.checkRecvmsgAddress(addr, self.cli_addr)
3375 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3376 self.assertLessEqual(len(ancdata), 2)
3377 fds = array.array("i")
3378 # Arrays may have been combined in a single control message
3379 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3380 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3381 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003382 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003383 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3384 self.assertLessEqual(len(fds), 2)
3385 self.checkFDs(fds)
3386
3387 @testFDPassPartialIntInMiddle.client_skip
3388 def _testFDPassPartialIntInMiddle(self):
3389 fd0, fd1 = self.newFDs(2)
3390 self.sendAncillaryIfPossible(
3391 MSG,
3392 [(socket.SOL_SOCKET,
3393 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003394 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003395 (socket.SOL_SOCKET,
3396 socket.SCM_RIGHTS,
3397 array.array("i", [fd1]))])
3398
3399 def checkTruncatedHeader(self, result, ignoreflags=0):
3400 # Check that no ancillary data items are returned when data is
3401 # truncated inside the cmsghdr structure.
3402 msg, ancdata, flags, addr = result
3403 self.assertEqual(msg, MSG)
3404 self.checkRecvmsgAddress(addr, self.cli_addr)
3405 self.assertEqual(ancdata, [])
3406 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3407 ignore=ignoreflags)
3408
3409 def testCmsgTruncNoBufSize(self):
3410 # Check that no ancillary data is received when no buffer size
3411 # is specified.
3412 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3413 # BSD seems to set MSG_CTRUNC only
3414 # if an item has been partially
3415 # received.
3416 ignoreflags=socket.MSG_CTRUNC)
3417
3418 def _testCmsgTruncNoBufSize(self):
3419 self.createAndSendFDs(1)
3420
3421 def testCmsgTrunc0(self):
3422 # Check that no ancillary data is received when buffer size is 0.
3423 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3424 ignoreflags=socket.MSG_CTRUNC)
3425
3426 def _testCmsgTrunc0(self):
3427 self.createAndSendFDs(1)
3428
3429 # Check that no ancillary data is returned for various non-zero
3430 # (but still too small) buffer sizes.
3431
3432 def testCmsgTrunc1(self):
3433 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3434
3435 def _testCmsgTrunc1(self):
3436 self.createAndSendFDs(1)
3437
3438 def testCmsgTrunc2Int(self):
3439 # The cmsghdr structure has at least three members, two of
3440 # which are ints, so we still shouldn't see any ancillary
3441 # data.
3442 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3443 SIZEOF_INT * 2))
3444
3445 def _testCmsgTrunc2Int(self):
3446 self.createAndSendFDs(1)
3447
3448 def testCmsgTruncLen0Minus1(self):
3449 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3450 socket.CMSG_LEN(0) - 1))
3451
3452 def _testCmsgTruncLen0Minus1(self):
3453 self.createAndSendFDs(1)
3454
3455 # The following tests try to truncate the control message in the
3456 # middle of the FD array.
3457
3458 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3459 # Check that file descriptor data is truncated to between
3460 # mindata and maxdata bytes when received with buffer size
3461 # ancbuf, and that any complete file descriptor numbers are
3462 # valid.
3463 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3464 len(MSG), ancbuf)
3465 self.assertEqual(msg, MSG)
3466 self.checkRecvmsgAddress(addr, self.cli_addr)
3467 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3468
3469 if mindata == 0 and ancdata == []:
3470 return
3471 self.assertEqual(len(ancdata), 1)
3472 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3473 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3474 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3475 self.assertGreaterEqual(len(cmsg_data), mindata)
3476 self.assertLessEqual(len(cmsg_data), maxdata)
3477 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003478 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003479 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3480 self.checkFDs(fds)
3481
3482 def testCmsgTruncLen0(self):
3483 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3484
3485 def _testCmsgTruncLen0(self):
3486 self.createAndSendFDs(1)
3487
3488 def testCmsgTruncLen0Plus1(self):
3489 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3490
3491 def _testCmsgTruncLen0Plus1(self):
3492 self.createAndSendFDs(2)
3493
3494 def testCmsgTruncLen1(self):
3495 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3496 maxdata=SIZEOF_INT)
3497
3498 def _testCmsgTruncLen1(self):
3499 self.createAndSendFDs(2)
3500
3501 def testCmsgTruncLen2Minus1(self):
3502 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3503 maxdata=(2 * SIZEOF_INT) - 1)
3504
3505 def _testCmsgTruncLen2Minus1(self):
3506 self.createAndSendFDs(2)
3507
3508
3509class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3510 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3511 # features of the RFC 3542 Advanced Sockets API for IPv6.
3512 # Currently we can only handle certain data items (e.g. traffic
3513 # class, hop limit, MTU discovery and fragmentation settings)
3514 # without resorting to unportable means such as the struct module,
3515 # but the tests here are aimed at testing the ancillary data
3516 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3517 # itself.
3518
3519 # Test value to use when setting hop limit of packet
3520 hop_limit = 2
3521
3522 # Test value to use when setting traffic class of packet.
3523 # -1 means "use kernel default".
3524 traffic_class = -1
3525
3526 def ancillaryMapping(self, ancdata):
3527 # Given ancillary data list ancdata, return a mapping from
3528 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3529 # Check that no (level, type) pair appears more than once.
3530 d = {}
3531 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3532 self.assertNotIn((cmsg_level, cmsg_type), d)
3533 d[(cmsg_level, cmsg_type)] = cmsg_data
3534 return d
3535
3536 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3537 # Receive hop limit into ancbufsize bytes of ancillary data
3538 # space. Check that data is MSG, ancillary data is not
3539 # truncated (but ignore any flags in ignoreflags), and hop
3540 # limit is between 0 and maxhop inclusive.
3541 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3542 socket.IPV6_RECVHOPLIMIT, 1)
3543 self.misc_event.set()
3544 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3545 len(MSG), ancbufsize)
3546
3547 self.assertEqual(msg, MSG)
3548 self.checkRecvmsgAddress(addr, self.cli_addr)
3549 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3550 ignore=ignoreflags)
3551
3552 self.assertEqual(len(ancdata), 1)
3553 self.assertIsInstance(ancdata[0], tuple)
3554 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3555 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3556 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3557 self.assertIsInstance(cmsg_data, bytes)
3558 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3559 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003560 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003561 self.assertGreaterEqual(a[0], 0)
3562 self.assertLessEqual(a[0], maxhop)
3563
3564 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3565 def testRecvHopLimit(self):
3566 # Test receiving the packet hop limit as ancillary data.
3567 self.checkHopLimit(ancbufsize=10240)
3568
3569 @testRecvHopLimit.client_skip
3570 def _testRecvHopLimit(self):
3571 # Need to wait until server has asked to receive ancillary
3572 # data, as implementations are not required to buffer it
3573 # otherwise.
3574 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3575 self.sendToServer(MSG)
3576
3577 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3578 def testRecvHopLimitCMSG_SPACE(self):
3579 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3580 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3581
3582 @testRecvHopLimitCMSG_SPACE.client_skip
3583 def _testRecvHopLimitCMSG_SPACE(self):
3584 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3585 self.sendToServer(MSG)
3586
3587 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3588 # 3542 says portable applications must provide space for trailing
3589 # padding. Implementations may set MSG_CTRUNC if there isn't
3590 # enough space for the padding.
3591
3592 @requireAttrs(socket.socket, "sendmsg")
3593 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3594 def testSetHopLimit(self):
3595 # Test setting hop limit on outgoing packet and receiving it
3596 # at the other end.
3597 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3598
3599 @testSetHopLimit.client_skip
3600 def _testSetHopLimit(self):
3601 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3602 self.assertEqual(
3603 self.sendmsgToServer([MSG],
3604 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3605 array.array("i", [self.hop_limit]))]),
3606 len(MSG))
3607
3608 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3609 ignoreflags=0):
3610 # Receive traffic class and hop limit into ancbufsize bytes of
3611 # ancillary data space. Check that data is MSG, ancillary
3612 # data is not truncated (but ignore any flags in ignoreflags),
3613 # and traffic class and hop limit are in range (hop limit no
3614 # more than maxhop).
3615 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3616 socket.IPV6_RECVHOPLIMIT, 1)
3617 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3618 socket.IPV6_RECVTCLASS, 1)
3619 self.misc_event.set()
3620 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3621 len(MSG), ancbufsize)
3622
3623 self.assertEqual(msg, MSG)
3624 self.checkRecvmsgAddress(addr, self.cli_addr)
3625 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3626 ignore=ignoreflags)
3627 self.assertEqual(len(ancdata), 2)
3628 ancmap = self.ancillaryMapping(ancdata)
3629
3630 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3631 self.assertEqual(len(tcdata), SIZEOF_INT)
3632 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003633 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003634 self.assertGreaterEqual(a[0], 0)
3635 self.assertLessEqual(a[0], 255)
3636
3637 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3638 self.assertEqual(len(hldata), SIZEOF_INT)
3639 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003640 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003641 self.assertGreaterEqual(a[0], 0)
3642 self.assertLessEqual(a[0], maxhop)
3643
3644 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3645 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3646 def testRecvTrafficClassAndHopLimit(self):
3647 # Test receiving traffic class and hop limit as ancillary data.
3648 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3649
3650 @testRecvTrafficClassAndHopLimit.client_skip
3651 def _testRecvTrafficClassAndHopLimit(self):
3652 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3653 self.sendToServer(MSG)
3654
3655 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3656 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3657 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3658 # Test receiving traffic class and hop limit, using
3659 # CMSG_SPACE() to calculate buffer size.
3660 self.checkTrafficClassAndHopLimit(
3661 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3662
3663 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3664 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3665 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3666 self.sendToServer(MSG)
3667
3668 @requireAttrs(socket.socket, "sendmsg")
3669 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3670 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3671 def testSetTrafficClassAndHopLimit(self):
3672 # Test setting traffic class and hop limit on outgoing packet,
3673 # and receiving them at the other end.
3674 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3675 maxhop=self.hop_limit)
3676
3677 @testSetTrafficClassAndHopLimit.client_skip
3678 def _testSetTrafficClassAndHopLimit(self):
3679 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3680 self.assertEqual(
3681 self.sendmsgToServer([MSG],
3682 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3683 array.array("i", [self.traffic_class])),
3684 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3685 array.array("i", [self.hop_limit]))]),
3686 len(MSG))
3687
3688 @requireAttrs(socket.socket, "sendmsg")
3689 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3690 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3691 def testOddCmsgSize(self):
3692 # Try to send ancillary data with first item one byte too
3693 # long. Fall back to sending with correct size if this fails,
3694 # and check that second item was handled correctly.
3695 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3696 maxhop=self.hop_limit)
3697
3698 @testOddCmsgSize.client_skip
3699 def _testOddCmsgSize(self):
3700 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3701 try:
3702 nbytes = self.sendmsgToServer(
3703 [MSG],
3704 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003705 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003706 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3707 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003708 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003709 self.assertIsInstance(e.errno, int)
3710 nbytes = self.sendmsgToServer(
3711 [MSG],
3712 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3713 array.array("i", [self.traffic_class])),
3714 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3715 array.array("i", [self.hop_limit]))])
3716 self.assertEqual(nbytes, len(MSG))
3717
3718 # Tests for proper handling of truncated ancillary data
3719
3720 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3721 # Receive hop limit into ancbufsize bytes of ancillary data
3722 # space, which should be too small to contain the ancillary
3723 # data header (if ancbufsize is None, pass no second argument
3724 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3725 # (unless included in ignoreflags), and no ancillary data is
3726 # returned.
3727 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3728 socket.IPV6_RECVHOPLIMIT, 1)
3729 self.misc_event.set()
3730 args = () if ancbufsize is None else (ancbufsize,)
3731 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3732 len(MSG), *args)
3733
3734 self.assertEqual(msg, MSG)
3735 self.checkRecvmsgAddress(addr, self.cli_addr)
3736 self.assertEqual(ancdata, [])
3737 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3738 ignore=ignoreflags)
3739
3740 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3741 def testCmsgTruncNoBufSize(self):
3742 # Check that no ancillary data is received when no ancillary
3743 # buffer size is provided.
3744 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3745 # BSD seems to set
3746 # MSG_CTRUNC only if an item
3747 # has been partially
3748 # received.
3749 ignoreflags=socket.MSG_CTRUNC)
3750
3751 @testCmsgTruncNoBufSize.client_skip
3752 def _testCmsgTruncNoBufSize(self):
3753 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3754 self.sendToServer(MSG)
3755
3756 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3757 def testSingleCmsgTrunc0(self):
3758 # Check that no ancillary data is received when ancillary
3759 # buffer size is zero.
3760 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3761 ignoreflags=socket.MSG_CTRUNC)
3762
3763 @testSingleCmsgTrunc0.client_skip
3764 def _testSingleCmsgTrunc0(self):
3765 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3766 self.sendToServer(MSG)
3767
3768 # Check that no ancillary data is returned for various non-zero
3769 # (but still too small) buffer sizes.
3770
3771 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3772 def testSingleCmsgTrunc1(self):
3773 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3774
3775 @testSingleCmsgTrunc1.client_skip
3776 def _testSingleCmsgTrunc1(self):
3777 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3778 self.sendToServer(MSG)
3779
3780 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3781 def testSingleCmsgTrunc2Int(self):
3782 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3783
3784 @testSingleCmsgTrunc2Int.client_skip
3785 def _testSingleCmsgTrunc2Int(self):
3786 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3787 self.sendToServer(MSG)
3788
3789 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3790 def testSingleCmsgTruncLen0Minus1(self):
3791 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3792
3793 @testSingleCmsgTruncLen0Minus1.client_skip
3794 def _testSingleCmsgTruncLen0Minus1(self):
3795 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3796 self.sendToServer(MSG)
3797
3798 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3799 def testSingleCmsgTruncInData(self):
3800 # Test truncation of a control message inside its associated
3801 # data. The message may be returned with its data truncated,
3802 # or not returned at all.
3803 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3804 socket.IPV6_RECVHOPLIMIT, 1)
3805 self.misc_event.set()
3806 msg, ancdata, flags, addr = self.doRecvmsg(
3807 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3808
3809 self.assertEqual(msg, MSG)
3810 self.checkRecvmsgAddress(addr, self.cli_addr)
3811 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3812
3813 self.assertLessEqual(len(ancdata), 1)
3814 if ancdata:
3815 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3816 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3817 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3818 self.assertLess(len(cmsg_data), SIZEOF_INT)
3819
3820 @testSingleCmsgTruncInData.client_skip
3821 def _testSingleCmsgTruncInData(self):
3822 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3823 self.sendToServer(MSG)
3824
3825 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3826 # Receive traffic class and hop limit into ancbufsize bytes of
3827 # ancillary data space, which should be large enough to
3828 # contain the first item, but too small to contain the header
3829 # of the second. Check that data is MSG, MSG_CTRUNC is set
3830 # (unless included in ignoreflags), and only one ancillary
3831 # data item is returned.
3832 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3833 socket.IPV6_RECVHOPLIMIT, 1)
3834 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3835 socket.IPV6_RECVTCLASS, 1)
3836 self.misc_event.set()
3837 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3838 len(MSG), ancbufsize)
3839
3840 self.assertEqual(msg, MSG)
3841 self.checkRecvmsgAddress(addr, self.cli_addr)
3842 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3843 ignore=ignoreflags)
3844
3845 self.assertEqual(len(ancdata), 1)
3846 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3847 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3848 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3849 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3850 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003851 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003852 self.assertGreaterEqual(a[0], 0)
3853 self.assertLessEqual(a[0], 255)
3854
3855 # Try the above test with various buffer sizes.
3856
3857 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3858 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3859 def testSecondCmsgTrunc0(self):
3860 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3861 ignoreflags=socket.MSG_CTRUNC)
3862
3863 @testSecondCmsgTrunc0.client_skip
3864 def _testSecondCmsgTrunc0(self):
3865 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3866 self.sendToServer(MSG)
3867
3868 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3869 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3870 def testSecondCmsgTrunc1(self):
3871 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3872
3873 @testSecondCmsgTrunc1.client_skip
3874 def _testSecondCmsgTrunc1(self):
3875 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3876 self.sendToServer(MSG)
3877
3878 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3879 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3880 def testSecondCmsgTrunc2Int(self):
3881 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3882 2 * SIZEOF_INT)
3883
3884 @testSecondCmsgTrunc2Int.client_skip
3885 def _testSecondCmsgTrunc2Int(self):
3886 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3887 self.sendToServer(MSG)
3888
3889 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3890 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3891 def testSecondCmsgTruncLen0Minus1(self):
3892 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3893 socket.CMSG_LEN(0) - 1)
3894
3895 @testSecondCmsgTruncLen0Minus1.client_skip
3896 def _testSecondCmsgTruncLen0Minus1(self):
3897 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3898 self.sendToServer(MSG)
3899
3900 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3901 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3902 def testSecomdCmsgTruncInData(self):
3903 # Test truncation of the second of two control messages inside
3904 # its associated data.
3905 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3906 socket.IPV6_RECVHOPLIMIT, 1)
3907 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3908 socket.IPV6_RECVTCLASS, 1)
3909 self.misc_event.set()
3910 msg, ancdata, flags, addr = self.doRecvmsg(
3911 self.serv_sock, len(MSG),
3912 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3913
3914 self.assertEqual(msg, MSG)
3915 self.checkRecvmsgAddress(addr, self.cli_addr)
3916 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3917
3918 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3919
3920 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3921 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3922 cmsg_types.remove(cmsg_type)
3923 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3924 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003925 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003926 self.assertGreaterEqual(a[0], 0)
3927 self.assertLessEqual(a[0], 255)
3928
3929 if ancdata:
3930 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3931 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3932 cmsg_types.remove(cmsg_type)
3933 self.assertLess(len(cmsg_data), SIZEOF_INT)
3934
3935 self.assertEqual(ancdata, [])
3936
3937 @testSecomdCmsgTruncInData.client_skip
3938 def _testSecomdCmsgTruncInData(self):
3939 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3940 self.sendToServer(MSG)
3941
3942
3943# Derive concrete test classes for different socket types.
3944
3945class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3946 SendrecvmsgConnectionlessBase,
3947 ThreadedSocketTestMixin, UDPTestBase):
3948 pass
3949
3950@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003951class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3952 pass
3953
3954@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003955class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3956 pass
3957
3958@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003959class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3960 pass
3961
3962
3963class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3964 SendrecvmsgConnectionlessBase,
3965 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003966
3967 def checkRecvmsgAddress(self, addr1, addr2):
3968 # Called to compare the received address with the address of
3969 # the peer, ignoring scope ID
3970 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003971
3972@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003973@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003975class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3976 pass
3977
3978@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003979@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003980@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003981class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3982 pass
3983
3984@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003985@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003986@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003987class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3988 pass
3989
3990@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003991@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003992@requireAttrs(socket, "IPPROTO_IPV6")
3993@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003994class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3995 SendrecvmsgUDP6TestBase):
3996 pass
3997
3998@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003999@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004000@requireAttrs(socket, "IPPROTO_IPV6")
4001@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004002class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4003 RFC3542AncillaryTest,
4004 SendrecvmsgUDP6TestBase):
4005 pass
4006
4007
4008class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4009 ConnectedStreamTestMixin, TCPTestBase):
4010 pass
4011
4012@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004013class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4014 pass
4015
4016@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004017class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4018 SendrecvmsgTCPTestBase):
4019 pass
4020
4021@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004022class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4023 SendrecvmsgTCPTestBase):
4024 pass
4025
4026
4027class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4028 SendrecvmsgConnectedBase,
4029 ConnectedStreamTestMixin, SCTPStreamBase):
4030 pass
4031
4032@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004033@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004034@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004035class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4036 pass
4037
4038@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004039@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004040@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004041class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4042 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004043
4044 def testRecvmsgEOF(self):
4045 try:
4046 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4047 except OSError as e:
4048 if e.errno != errno.ENOTCONN:
4049 raise
4050 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004051
4052@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004053@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004055class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4056 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004057
4058 def testRecvmsgEOF(self):
4059 try:
4060 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4061 except OSError as e:
4062 if e.errno != errno.ENOTCONN:
4063 raise
4064 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004065
4066
4067class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4068 ConnectedStreamTestMixin, UnixStreamBase):
4069 pass
4070
4071@requireAttrs(socket.socket, "sendmsg")
4072@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004073class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4074 pass
4075
4076@requireAttrs(socket.socket, "recvmsg")
4077@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004078class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4079 SendrecvmsgUnixStreamTestBase):
4080 pass
4081
4082@requireAttrs(socket.socket, "recvmsg_into")
4083@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4085 SendrecvmsgUnixStreamTestBase):
4086 pass
4087
4088@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4089@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004090class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4091 pass
4092
4093@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4094@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004095class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4096 SendrecvmsgUnixStreamTestBase):
4097 pass
4098
4099
4100# Test interrupting the interruptible send/receive methods with a
4101# signal when a timeout is set. These tests avoid having multiple
4102# threads alive during the test so that the OS cannot deliver the
4103# signal to the wrong one.
4104
4105class InterruptedTimeoutBase(unittest.TestCase):
4106 # Base class for interrupted send/receive tests. Installs an
4107 # empty handler for SIGALRM and removes it on teardown, along with
4108 # any scheduled alarms.
4109
4110 def setUp(self):
4111 super().setUp()
4112 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004113 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004114 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004115
4116 # Timeout for socket operations
4117 timeout = 4.0
4118
4119 # Provide setAlarm() method to schedule delivery of SIGALRM after
4120 # given number of seconds, or cancel it if zero, and an
4121 # appropriate time value to use. Use setitimer() if available.
4122 if hasattr(signal, "setitimer"):
4123 alarm_time = 0.05
4124
4125 def setAlarm(self, seconds):
4126 signal.setitimer(signal.ITIMER_REAL, seconds)
4127 else:
4128 # Old systems may deliver the alarm up to one second early
4129 alarm_time = 2
4130
4131 def setAlarm(self, seconds):
4132 signal.alarm(seconds)
4133
4134
4135# Require siginterrupt() in order to ensure that system calls are
4136# interrupted by default.
4137@requireAttrs(signal, "siginterrupt")
4138@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4139 "Don't have signal.alarm or signal.setitimer")
4140class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4141 # Test interrupting the recv*() methods with signals when a
4142 # timeout is set.
4143
4144 def setUp(self):
4145 super().setUp()
4146 self.serv.settimeout(self.timeout)
4147
4148 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004149 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004150 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004151 try:
4152 self.setAlarm(self.alarm_time)
4153 with self.assertRaises(ZeroDivisionError) as cm:
4154 func(*args, **kwargs)
4155 finally:
4156 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004157
4158 def testInterruptedRecvTimeout(self):
4159 self.checkInterruptedRecv(self.serv.recv, 1024)
4160
4161 def testInterruptedRecvIntoTimeout(self):
4162 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4163
4164 def testInterruptedRecvfromTimeout(self):
4165 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4166
4167 def testInterruptedRecvfromIntoTimeout(self):
4168 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4169
4170 @requireAttrs(socket.socket, "recvmsg")
4171 def testInterruptedRecvmsgTimeout(self):
4172 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4173
4174 @requireAttrs(socket.socket, "recvmsg_into")
4175 def testInterruptedRecvmsgIntoTimeout(self):
4176 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4177
4178
4179# Require siginterrupt() in order to ensure that system calls are
4180# interrupted by default.
4181@requireAttrs(signal, "siginterrupt")
4182@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4183 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004184class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4185 ThreadSafeCleanupTestCase,
4186 SocketListeningTestMixin, TCPTestBase):
4187 # Test interrupting the interruptible send*() methods with signals
4188 # when a timeout is set.
4189
4190 def setUp(self):
4191 super().setUp()
4192 self.serv_conn = self.newSocket()
4193 self.addCleanup(self.serv_conn.close)
4194 # Use a thread to complete the connection, but wait for it to
4195 # terminate before running the test, so that there is only one
4196 # thread to accept the signal.
4197 cli_thread = threading.Thread(target=self.doConnect)
4198 cli_thread.start()
4199 self.cli_conn, addr = self.serv.accept()
4200 self.addCleanup(self.cli_conn.close)
4201 cli_thread.join()
4202 self.serv_conn.settimeout(self.timeout)
4203
4204 def doConnect(self):
4205 self.serv_conn.connect(self.serv_addr)
4206
4207 def checkInterruptedSend(self, func, *args, **kwargs):
4208 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004209 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004210 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004211 try:
4212 with self.assertRaises(ZeroDivisionError) as cm:
4213 while True:
4214 self.setAlarm(self.alarm_time)
4215 func(*args, **kwargs)
4216 finally:
4217 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004218
Ned Deilyc5640382014-02-03 13:58:31 -08004219 # Issue #12958: The following tests have problems on OS X prior to 10.7
4220 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221 def testInterruptedSendTimeout(self):
4222 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4223
Ned Deilyc5640382014-02-03 13:58:31 -08004224 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004225 def testInterruptedSendtoTimeout(self):
4226 # Passing an actual address here as Python's wrapper for
4227 # sendto() doesn't allow passing a zero-length one; POSIX
4228 # requires that the address is ignored since the socket is
4229 # connection-mode, however.
4230 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4231 self.serv_addr)
4232
Ned Deilyc5640382014-02-03 13:58:31 -08004233 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004234 @requireAttrs(socket.socket, "sendmsg")
4235 def testInterruptedSendmsgTimeout(self):
4236 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4237
4238
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004239class TCPCloserTest(ThreadedTCPSocketTest):
4240
4241 def testClose(self):
4242 conn, addr = self.serv.accept()
4243 conn.close()
4244
4245 sd = self.cli
4246 read, write, err = select.select([sd], [], [], 1.0)
4247 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004248 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004249
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004250 # Calling close() many times should be safe.
4251 conn.close()
4252 conn.close()
4253
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004254 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004255 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004256 time.sleep(1.0)
4257
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004258
Dave Cole331708b2004-08-09 04:51:41 +00004259class BasicSocketPairTest(SocketPairTest):
4260
4261 def __init__(self, methodName='runTest'):
4262 SocketPairTest.__init__(self, methodName=methodName)
4263
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004264 def _check_defaults(self, sock):
4265 self.assertIsInstance(sock, socket.socket)
4266 if hasattr(socket, 'AF_UNIX'):
4267 self.assertEqual(sock.family, socket.AF_UNIX)
4268 else:
4269 self.assertEqual(sock.family, socket.AF_INET)
4270 self.assertEqual(sock.type, socket.SOCK_STREAM)
4271 self.assertEqual(sock.proto, 0)
4272
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004273 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004274 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004275
4276 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004277 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004278
Dave Cole331708b2004-08-09 04:51:41 +00004279 def testRecv(self):
4280 msg = self.serv.recv(1024)
4281 self.assertEqual(msg, MSG)
4282
4283 def _testRecv(self):
4284 self.cli.send(MSG)
4285
4286 def testSend(self):
4287 self.serv.send(MSG)
4288
4289 def _testSend(self):
4290 msg = self.cli.recv(1024)
4291 self.assertEqual(msg, MSG)
4292
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004293
Guido van Rossum24e4af82002-06-12 19:18:08 +00004294class NonBlockingTCPTests(ThreadedTCPSocketTest):
4295
4296 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004297 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004298 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4299
Victor Stinner304315d2018-11-30 13:22:44 +01004300 def assert_sock_timeout(self, sock, timeout):
4301 self.assertEqual(self.serv.gettimeout(), timeout)
4302
4303 blocking = (timeout != 0.0)
4304 self.assertEqual(sock.getblocking(), blocking)
4305
4306 if fcntl is not None:
4307 # When a Python socket has a non-zero timeout, it's switched
4308 # internally to a non-blocking mode. Later, sock.sendall(),
4309 # sock.recv(), and other socket operations use a select() call and
4310 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4311 # timeouts are enforced.
4312 fd_blocking = (timeout is None)
4313
4314 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4315 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4316
Guido van Rossum24e4af82002-06-12 19:18:08 +00004317 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004318 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004319 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004320 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004321
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004322 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004323 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004324
4325 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004326 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004327
4328 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004329 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004330
4331 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004332 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004333
4334 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004335 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004336
4337 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004338 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004339
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004340 @support.cpython_only
4341 def testSetBlocking_overflow(self):
4342 # Issue 15989
4343 import _testcapi
4344 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4345 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004346
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004347 self.serv.setblocking(False)
4348 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004349
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004350 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4351 self.assertIsNone(self.serv.gettimeout())
4352
4353 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4354
Serhiy Storchaka43767632013-11-03 21:31:38 +02004355 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4356 'test needs socket.SOCK_NONBLOCK')
4357 @support.requires_linux_version(2, 6, 28)
4358 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004359 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004360 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004361 self.serv = socket.socket(socket.AF_INET,
4362 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4363 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004364
4365 def _testInitNonBlocking(self):
4366 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004367
Victor Stinner304315d2018-11-30 13:22:44 +01004368 def testInheritFlagsBlocking(self):
4369 # bpo-7995: accept() on a listening socket with a timeout and the
4370 # default timeout is None, the resulting socket must be blocking.
4371 with socket_setdefaulttimeout(None):
4372 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004373 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004374 self.addCleanup(conn.close)
4375 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004376
Victor Stinner304315d2018-11-30 13:22:44 +01004377 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004378 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004379
4380 def testInheritFlagsTimeout(self):
4381 # bpo-7995: accept() on a listening socket with a timeout and the
4382 # default timeout is None, the resulting socket must inherit
4383 # the default timeout.
4384 default_timeout = 20.0
4385 with socket_setdefaulttimeout(default_timeout):
4386 self.serv.settimeout(10)
4387 conn, addr = self.serv.accept()
4388 self.addCleanup(conn.close)
4389 self.assertEqual(conn.gettimeout(), default_timeout)
4390
4391 def _testInheritFlagsTimeout(self):
4392 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004393
Guido van Rossum24e4af82002-06-12 19:18:08 +00004394 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004395 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004396 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004397
4398 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004399 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004400 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004401 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004402 dt = time.monotonic() - start_time
4403 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004404
4405 self.event.set()
4406
4407 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4408 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004409 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004410
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004411 # connect() completed: non-blocking accept() doesn't block
4412 conn, addr = self.serv.accept()
4413 self.addCleanup(conn.close)
4414 self.assertIsNone(conn.gettimeout())
4415
Guido van Rossum24e4af82002-06-12 19:18:08 +00004416 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004417 # don't connect before event is set to check
4418 # that non-blocking accept() raises BlockingIOError
4419 self.event.wait()
4420
Christian Heimes5e696852008-04-09 08:37:03 +00004421 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004422
Guido van Rossum24e4af82002-06-12 19:18:08 +00004423 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004424 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004425 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004426 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004427 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004428
4429 # the server didn't send data yet: non-blocking recv() fails
4430 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004431 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004432
4433 self.event.set()
4434
4435 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4436 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004437 self.fail("Error during select call to non-blocking socket.")
4438
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004439 # the server sent data yet: non-blocking recv() doesn't block
4440 msg = conn.recv(len(MSG))
4441 self.assertEqual(msg, MSG)
4442
Guido van Rossum24e4af82002-06-12 19:18:08 +00004443 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004444 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004445
4446 # don't send anything before event is set to check
4447 # that non-blocking recv() raises BlockingIOError
4448 self.event.wait()
4449
4450 # send data: recv() will no longer block
4451 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004452
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004453
Guido van Rossum24e4af82002-06-12 19:18:08 +00004454class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004455 """Unit tests for the object returned by socket.makefile()
4456
Antoine Pitrou834bd812010-10-13 16:17:14 +00004457 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004458 the client connection. You can read from this file to
4459 get output from the server.
4460
Antoine Pitrou834bd812010-10-13 16:17:14 +00004461 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004462 server connection. You can write to this file to send output
4463 to the client.
4464 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004465
Guido van Rossume9f66142002-08-07 15:46:19 +00004466 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004467 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004468 errors = 'strict'
4469 newline = None
4470
4471 read_mode = 'rb'
4472 read_msg = MSG
4473 write_mode = 'wb'
4474 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004475
Guido van Rossum24e4af82002-06-12 19:18:08 +00004476 def __init__(self, methodName='runTest'):
4477 SocketConnectedTest.__init__(self, methodName=methodName)
4478
4479 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004480 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4481 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004482 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004483 self.read_file = self.cli_conn.makefile(
4484 self.read_mode, self.bufsize,
4485 encoding = self.encoding,
4486 errors = self.errors,
4487 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004488
4489 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004490 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004491 self.read_file.close()
4492 self.assertTrue(self.read_file.closed)
4493 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004494 SocketConnectedTest.tearDown(self)
4495
4496 def clientSetUp(self):
4497 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004498 self.write_file = self.serv_conn.makefile(
4499 self.write_mode, self.bufsize,
4500 encoding = self.encoding,
4501 errors = self.errors,
4502 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004503
4504 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004505 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004506 self.write_file.close()
4507 self.assertTrue(self.write_file.closed)
4508 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004509 SocketConnectedTest.clientTearDown(self)
4510
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004511 def testReadAfterTimeout(self):
4512 # Issue #7322: A file object must disallow further reads
4513 # after a timeout has occurred.
4514 self.cli_conn.settimeout(1)
4515 self.read_file.read(3)
4516 # First read raises a timeout
4517 self.assertRaises(socket.timeout, self.read_file.read, 1)
4518 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004519 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004520 self.read_file.read(1)
4521 self.assertIn("cannot read from timed out object", str(ctx.exception))
4522
4523 def _testReadAfterTimeout(self):
4524 self.write_file.write(self.write_msg[0:3])
4525 self.write_file.flush()
4526 self.serv_finished.wait()
4527
Guido van Rossum24e4af82002-06-12 19:18:08 +00004528 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004529 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004530 first_seg = self.read_file.read(len(self.read_msg)-3)
4531 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004532 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004533 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004534
4535 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004536 self.write_file.write(self.write_msg)
4537 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004538
Guido van Rossum8c943832002-08-08 01:00:28 +00004539 def testFullRead(self):
4540 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004541 msg = self.read_file.read()
4542 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004543
4544 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004545 self.write_file.write(self.write_msg)
4546 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004547
Guido van Rossum24e4af82002-06-12 19:18:08 +00004548 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004549 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004550 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004551 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004552 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004553 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004554 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004555 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004556 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004557
4558 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004559 self.write_file.write(self.write_msg)
4560 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004561
4562 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004563 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004564 line = self.read_file.readline()
4565 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004566
4567 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004568 self.write_file.write(self.write_msg)
4569 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004570
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004571 def testCloseAfterMakefile(self):
4572 # The file returned by makefile should keep the socket open.
4573 self.cli_conn.close()
4574 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004575 msg = self.read_file.read()
4576 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004577
4578 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004579 self.write_file.write(self.write_msg)
4580 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004581
4582 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004583 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004584 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004585 if isinstance(self.read_msg, str):
4586 msg = msg.decode()
4587 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004588
4589 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004590 self.write_file.write(self.write_msg)
4591 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004592
Tim Peters116d83c2004-03-28 02:20:45 +00004593 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004594 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004595
4596 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004597 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004598
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004599 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004600 self.assertEqual(self.read_file.mode, self.read_mode)
4601 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004602
4603 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004604 self.assertEqual(self.write_file.mode, self.write_mode)
4605 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004606
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004607 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004608 self.read_file.close()
4609 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004610 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004611 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004612
4613 def _testRealClose(self):
4614 pass
4615
4616
Guido van Rossume9f66142002-08-07 15:46:19 +00004617class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4618
4619 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004620
Guido van Rossume9f66142002-08-07 15:46:19 +00004621 In this case (and in this case only), it should be possible to
4622 create a file object, read a line from it, create another file
4623 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004624 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004625 when reading multiple requests from the same socket."""
4626
4627 bufsize = 0 # Use unbuffered mode
4628
4629 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004630 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004631 line = self.read_file.readline() # first line
4632 self.assertEqual(line, b"A. " + self.write_msg) # first line
4633 self.read_file = self.cli_conn.makefile('rb', 0)
4634 line = self.read_file.readline() # second line
4635 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004636
4637 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004638 self.write_file.write(b"A. " + self.write_msg)
4639 self.write_file.write(b"B. " + self.write_msg)
4640 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004641
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004642 def testMakefileClose(self):
4643 # The file returned by makefile should keep the socket open...
4644 self.cli_conn.close()
4645 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004646 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004647 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004648 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004649 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004650
4651 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004652 self.write_file.write(self.write_msg)
4653 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004654
4655 def testMakefileCloseSocketDestroy(self):
4656 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004657 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004658 refcount_after = sys.getrefcount(self.cli_conn)
4659 self.assertEqual(refcount_before - 1, refcount_after)
4660
4661 def _testMakefileCloseSocketDestroy(self):
4662 pass
4663
Antoine Pitrou98b46702010-09-18 22:59:00 +00004664 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004665 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004666 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4667
4668 def testSmallReadNonBlocking(self):
4669 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004670 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4671 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004672 self.evt1.set()
4673 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004674 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004675 if first_seg is None:
4676 # Data not arrived (can happen under Windows), wait a bit
4677 time.sleep(0.5)
4678 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004679 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004680 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004681 self.assertEqual(n, 3)
4682 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004683 self.assertEqual(msg, self.read_msg)
4684 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4685 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004686
4687 def _testSmallReadNonBlocking(self):
4688 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004689 self.write_file.write(self.write_msg)
4690 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004691 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004692 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004693 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4694 self.serv_finished.wait(5.0)
4695
4696 def testWriteNonBlocking(self):
4697 self.cli_finished.wait(5.0)
4698 # The client thread can't skip directly - the SkipTest exception
4699 # would appear as a failure.
4700 if self.serv_skipped:
4701 self.skipTest(self.serv_skipped)
4702
4703 def _testWriteNonBlocking(self):
4704 self.serv_skipped = None
4705 self.serv_conn.setblocking(False)
4706 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004707 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004708 LIMIT = 10
4709 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004710 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004711 self.assertGreater(n, 0)
4712 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004713 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004714 if n is None:
4715 # Succeeded
4716 break
4717 self.assertGreater(n, 0)
4718 else:
4719 # Let us know that this test didn't manage to establish
4720 # the expected conditions. This is not a failure in itself but,
4721 # if it happens repeatedly, the test should be fixed.
4722 self.serv_skipped = "failed to saturate the socket buffer"
4723
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004724
Guido van Rossum8c943832002-08-08 01:00:28 +00004725class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4726
4727 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4728
4729
4730class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4731
4732 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004733
Thomas Woutersb2137042007-02-01 18:02:27 +00004734
Antoine Pitrou834bd812010-10-13 16:17:14 +00004735class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4736 """Tests for socket.makefile() in text mode (rather than binary)"""
4737
4738 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004739 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004740 write_mode = 'wb'
4741 write_msg = MSG
4742 newline = ''
4743
4744
4745class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4746 """Tests for socket.makefile() in text mode (rather than binary)"""
4747
4748 read_mode = 'rb'
4749 read_msg = MSG
4750 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004751 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004752 newline = ''
4753
4754
4755class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4756 """Tests for socket.makefile() in text mode (rather than binary)"""
4757
4758 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004759 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004760 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004761 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004762 newline = ''
4763
4764
Guido van Rossumd8faa362007-04-27 19:54:29 +00004765class NetworkConnectionTest(object):
4766 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004767
Guido van Rossumd8faa362007-04-27 19:54:29 +00004768 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004769 # We're inherited below by BasicTCPTest2, which also inherits
4770 # BasicTCPTest, which defines self.port referenced below.
4771 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004772 self.serv_conn = self.cli
4773
4774class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4775 """Tests that NetworkConnection does not break existing TCP functionality.
4776 """
4777
4778class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004779
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004780 class MockSocket(socket.socket):
4781 def connect(self, *args):
4782 raise socket.timeout('timed out')
4783
4784 @contextlib.contextmanager
4785 def mocked_socket_module(self):
4786 """Return a socket which times out on connect"""
4787 old_socket = socket.socket
4788 socket.socket = self.MockSocket
4789 try:
4790 yield
4791 finally:
4792 socket.socket = old_socket
4793
4794 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004795 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004796 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004797 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004798 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004799 cli.connect((HOST, port))
4800 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4801
4802 def test_create_connection(self):
4803 # Issue #9792: errors raised by create_connection() should have
4804 # a proper errno attribute.
4805 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004806 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004807 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004808
4809 # Issue #16257: create_connection() calls getaddrinfo() against
4810 # 'localhost'. This may result in an IPV6 addr being returned
4811 # as well as an IPV4 one:
4812 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4813 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4814 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4815 #
4816 # create_connection() enumerates through all the addresses returned
4817 # and if it doesn't successfully bind to any of them, it propagates
4818 # the last exception it encountered.
4819 #
4820 # On Solaris, ENETUNREACH is returned in this circumstance instead
4821 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4822 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02004823 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04004824 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004825
4826 def test_create_connection_timeout(self):
4827 # Issue #9792: create_connection() should not recast timeout errors
4828 # as generic socket errors.
4829 with self.mocked_socket_module():
Miss Islington (bot)c2684c62019-06-30 08:42:22 -07004830 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004831 socket.create_connection((HOST, 1234))
Miss Islington (bot)c2684c62019-06-30 08:42:22 -07004832 except socket.timeout:
4833 pass
4834 except OSError as exc:
4835 if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
4836 raise
4837 else:
4838 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004839
Guido van Rossumd8faa362007-04-27 19:54:29 +00004840
4841class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4842
4843 def __init__(self, methodName='runTest'):
4844 SocketTCPTest.__init__(self, methodName=methodName)
4845 ThreadableTest.__init__(self)
4846
4847 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004848 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004849
4850 def clientTearDown(self):
4851 self.cli.close()
4852 self.cli = None
4853 ThreadableTest.clientTearDown(self)
4854
4855 def _justAccept(self):
4856 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004857 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004858
4859 testFamily = _justAccept
4860 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004861 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004862 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004863 self.assertEqual(self.cli.family, 2)
4864
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004865 testSourceAddress = _justAccept
4866 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004867 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4868 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004869 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004870 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004871 # The port number being used is sufficient to show that the bind()
4872 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004873
Guido van Rossumd8faa362007-04-27 19:54:29 +00004874 testTimeoutDefault = _justAccept
4875 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004876 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004877 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004878 socket.setdefaulttimeout(42)
4879 try:
4880 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004881 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004882 finally:
4883 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004884 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004885
4886 testTimeoutNone = _justAccept
4887 def _testTimeoutNone(self):
4888 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004889 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004890 socket.setdefaulttimeout(30)
4891 try:
4892 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004893 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004894 finally:
4895 socket.setdefaulttimeout(None)
4896 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004897
4898 testTimeoutValueNamed = _justAccept
4899 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004900 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004901 self.assertEqual(self.cli.gettimeout(), 30)
4902
4903 testTimeoutValueNonamed = _justAccept
4904 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004905 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004906 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004907 self.assertEqual(self.cli.gettimeout(), 30)
4908
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004909
Guido van Rossumd8faa362007-04-27 19:54:29 +00004910class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4911
4912 def __init__(self, methodName='runTest'):
4913 SocketTCPTest.__init__(self, methodName=methodName)
4914 ThreadableTest.__init__(self)
4915
4916 def clientSetUp(self):
4917 pass
4918
4919 def clientTearDown(self):
4920 self.cli.close()
4921 self.cli = None
4922 ThreadableTest.clientTearDown(self)
4923
4924 def testInsideTimeout(self):
4925 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004926 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004927 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004928 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004929 testOutsideTimeout = testInsideTimeout
4930
4931 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004932 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004933 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004934 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004935
4936 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004937 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004938 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004939
4940
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004941class TCPTimeoutTest(SocketTCPTest):
4942
4943 def testTCPTimeout(self):
4944 def raise_timeout(*args, **kwargs):
4945 self.serv.settimeout(1.0)
4946 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004947 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004948 "Error generating a timeout exception (TCP)")
4949
4950 def testTimeoutZero(self):
4951 ok = False
4952 try:
4953 self.serv.settimeout(0.0)
4954 foo = self.serv.accept()
4955 except socket.timeout:
4956 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004957 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004958 ok = True
4959 except:
4960 self.fail("caught unexpected exception (TCP)")
4961 if not ok:
4962 self.fail("accept() returned success when we did not expect it")
4963
Serhiy Storchaka43767632013-11-03 21:31:38 +02004964 @unittest.skipUnless(hasattr(signal, 'alarm'),
4965 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004966 def testInterruptedTimeout(self):
4967 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004968 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004969 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004970 self.serv.settimeout(5.0) # must be longer than alarm
4971 class Alarm(Exception):
4972 pass
4973 def alarm_handler(signal, frame):
4974 raise Alarm
4975 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4976 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004977 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004978 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004979 foo = self.serv.accept()
4980 except socket.timeout:
4981 self.fail("caught timeout instead of Alarm")
4982 except Alarm:
4983 pass
4984 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004985 self.fail("caught other exception instead of Alarm:"
4986 " %s(%s):\n%s" %
4987 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004988 else:
4989 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004990 finally:
4991 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004992 except Alarm:
4993 self.fail("got Alarm in wrong place")
4994 finally:
4995 # no alarm can be pending. Safe to restore old handler.
4996 signal.signal(signal.SIGALRM, old_alarm)
4997
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004998class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004999
5000 def testUDPTimeout(self):
5001 def raise_timeout(*args, **kwargs):
5002 self.serv.settimeout(1.0)
5003 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005004 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005005 "Error generating a timeout exception (UDP)")
5006
5007 def testTimeoutZero(self):
5008 ok = False
5009 try:
5010 self.serv.settimeout(0.0)
5011 foo = self.serv.recv(1024)
5012 except socket.timeout:
5013 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005014 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005015 ok = True
5016 except:
5017 self.fail("caught unexpected exception (UDP)")
5018 if not ok:
5019 self.fail("recv() returned success when we did not expect it")
5020
5021class TestExceptions(unittest.TestCase):
5022
5023 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005024 self.assertTrue(issubclass(OSError, Exception))
5025 self.assertTrue(issubclass(socket.herror, OSError))
5026 self.assertTrue(issubclass(socket.gaierror, OSError))
5027 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005028
Yury Selivanovfa22b292016-10-18 16:03:52 -04005029 def test_setblocking_invalidfd(self):
5030 # Regression test for issue #28471
5031
5032 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5033 sock = socket.socket(
5034 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5035 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005036 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005037
5038 with self.assertRaises(OSError):
5039 sock.setblocking(False)
5040
5041
Serhiy Storchaka43767632013-11-03 21:31:38 +02005042@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005043class TestLinuxAbstractNamespace(unittest.TestCase):
5044
5045 UNIX_PATH_MAX = 108
5046
5047 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005048 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005049 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5050 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005051 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005052 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5053 s2.connect(s1.getsockname())
5054 with s1.accept()[0] as s3:
5055 self.assertEqual(s1.getsockname(), address)
5056 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005057
5058 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005059 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005060 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5061 s.bind(address)
5062 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005063
5064 def testNameOverflow(self):
5065 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005066 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005067 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005068
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005069 def testStrName(self):
5070 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005071 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5072 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005073 s.bind("\x00python\x00test\x00")
5074 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005075 finally:
5076 s.close()
5077
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005078 def testBytearrayName(self):
5079 # Check that an abstract name can be passed as a bytearray.
5080 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5081 s.bind(bytearray(b"\x00python\x00test\x00"))
5082 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5083
Serhiy Storchaka43767632013-11-03 21:31:38 +02005084@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005085class TestUnixDomain(unittest.TestCase):
5086
5087 def setUp(self):
5088 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5089
5090 def tearDown(self):
5091 self.sock.close()
5092
5093 def encoded(self, path):
5094 # Return the given path encoded in the file system encoding,
5095 # or skip the test if this is not possible.
5096 try:
5097 return os.fsencode(path)
5098 except UnicodeEncodeError:
5099 self.skipTest(
5100 "Pathname {0!a} cannot be represented in file "
5101 "system encoding {1!r}".format(
5102 path, sys.getfilesystemencoding()))
5103
Antoine Pitrou16374872011-12-16 15:04:12 +01005104 def bind(self, sock, path):
5105 # Bind the socket
5106 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005107 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005108 except OSError as e:
5109 if str(e) == "AF_UNIX path too long":
5110 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005111 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005112 .format(path))
5113 else:
5114 raise
5115
Antoine Pitrou495b5022017-05-02 17:20:00 +02005116 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005117 # Issue #30205 (note getsockname() can return None on OS X)
5118 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005119
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005120 def testStrAddr(self):
5121 # Test binding to and retrieving a normal string pathname.
5122 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005123 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005124 self.addCleanup(support.unlink, path)
5125 self.assertEqual(self.sock.getsockname(), path)
5126
5127 def testBytesAddr(self):
5128 # Test binding to a bytes pathname.
5129 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005130 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005131 self.addCleanup(support.unlink, path)
5132 self.assertEqual(self.sock.getsockname(), path)
5133
5134 def testSurrogateescapeBind(self):
5135 # Test binding to a valid non-ASCII pathname, with the
5136 # non-ASCII bytes supplied using surrogateescape encoding.
5137 path = os.path.abspath(support.TESTFN_UNICODE)
5138 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005139 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005140 self.addCleanup(support.unlink, path)
5141 self.assertEqual(self.sock.getsockname(), path)
5142
5143 def testUnencodableAddr(self):
5144 # Test binding to a pathname that cannot be encoded in the
5145 # file system encoding.
5146 if support.TESTFN_UNENCODABLE is None:
5147 self.skipTest("No unencodable filename available")
5148 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005149 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005150 self.addCleanup(support.unlink, path)
5151 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005152
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005153
Thomas Wouters477c8d52006-05-27 19:21:47 +00005154class BufferIOTest(SocketConnectedTest):
5155 """
5156 Test the buffer versions of socket.recv() and socket.send().
5157 """
5158 def __init__(self, methodName='runTest'):
5159 SocketConnectedTest.__init__(self, methodName=methodName)
5160
Antoine Pitrou25480782010-03-17 22:50:28 +00005161 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005162 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005163 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005164 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005165 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005166 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005167 self.assertEqual(msg, MSG)
5168
Antoine Pitrou25480782010-03-17 22:50:28 +00005169 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005170 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005171 self.serv_conn.send(buf)
5172
Antoine Pitrou25480782010-03-17 22:50:28 +00005173 def testRecvIntoBytearray(self):
5174 buf = bytearray(1024)
5175 nbytes = self.cli_conn.recv_into(buf)
5176 self.assertEqual(nbytes, len(MSG))
5177 msg = buf[:len(MSG)]
5178 self.assertEqual(msg, MSG)
5179
5180 _testRecvIntoBytearray = _testRecvIntoArray
5181
5182 def testRecvIntoMemoryview(self):
5183 buf = bytearray(1024)
5184 nbytes = self.cli_conn.recv_into(memoryview(buf))
5185 self.assertEqual(nbytes, len(MSG))
5186 msg = buf[:len(MSG)]
5187 self.assertEqual(msg, MSG)
5188
5189 _testRecvIntoMemoryview = _testRecvIntoArray
5190
5191 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005192 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005193 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005194 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005195 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005196 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005197 self.assertEqual(msg, MSG)
5198
Antoine Pitrou25480782010-03-17 22:50:28 +00005199 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005200 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005201 self.serv_conn.send(buf)
5202
Antoine Pitrou25480782010-03-17 22:50:28 +00005203 def testRecvFromIntoBytearray(self):
5204 buf = bytearray(1024)
5205 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5206 self.assertEqual(nbytes, len(MSG))
5207 msg = buf[:len(MSG)]
5208 self.assertEqual(msg, MSG)
5209
5210 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5211
5212 def testRecvFromIntoMemoryview(self):
5213 buf = bytearray(1024)
5214 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5215 self.assertEqual(nbytes, len(MSG))
5216 msg = buf[:len(MSG)]
5217 self.assertEqual(msg, MSG)
5218
5219 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5220
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005221 def testRecvFromIntoSmallBuffer(self):
5222 # See issue #20246.
5223 buf = bytearray(8)
5224 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5225
5226 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005227 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005228
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005229 def testRecvFromIntoEmptyBuffer(self):
5230 buf = bytearray()
5231 self.cli_conn.recvfrom_into(buf)
5232 self.cli_conn.recvfrom_into(buf, 0)
5233
5234 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5235
Christian Heimes043d6f62008-01-07 17:19:16 +00005236
5237TIPC_STYPE = 2000
5238TIPC_LOWER = 200
5239TIPC_UPPER = 210
5240
5241def isTipcAvailable():
5242 """Check if the TIPC module is loaded
5243
5244 The TIPC module is not loaded automatically on Ubuntu and probably
5245 other Linux distros.
5246 """
5247 if not hasattr(socket, "AF_TIPC"):
5248 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005249 try:
5250 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005251 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005252 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005253 # have not the permission to read it.
5254 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005255 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005256 for line in f:
5257 if line.startswith("tipc "):
5258 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005259 return False
5260
Serhiy Storchaka43767632013-11-03 21:31:38 +02005261@unittest.skipUnless(isTipcAvailable(),
5262 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005263class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005264 def testRDM(self):
5265 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5266 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005267 self.addCleanup(srv.close)
5268 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005269
5270 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5271 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5272 TIPC_LOWER, TIPC_UPPER)
5273 srv.bind(srvaddr)
5274
5275 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5276 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5277 cli.sendto(MSG, sendaddr)
5278
5279 msg, recvaddr = srv.recvfrom(1024)
5280
5281 self.assertEqual(cli.getsockname(), recvaddr)
5282 self.assertEqual(msg, MSG)
5283
5284
Serhiy Storchaka43767632013-11-03 21:31:38 +02005285@unittest.skipUnless(isTipcAvailable(),
5286 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005287class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005288 def __init__(self, methodName = 'runTest'):
5289 unittest.TestCase.__init__(self, methodName = methodName)
5290 ThreadableTest.__init__(self)
5291
5292 def setUp(self):
5293 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005294 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005295 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5296 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5297 TIPC_LOWER, TIPC_UPPER)
5298 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005299 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005300 self.serverExplicitReady()
5301 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005302 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005303
5304 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005305 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005306 # accept() call; sleep a little while to avoid it, otherwise
5307 # we could get an exception
5308 time.sleep(0.1)
5309 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005310 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005311 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5312 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5313 self.cli.connect(addr)
5314 self.cliaddr = self.cli.getsockname()
5315
5316 def testStream(self):
5317 msg = self.conn.recv(1024)
5318 self.assertEqual(msg, MSG)
5319 self.assertEqual(self.cliaddr, self.connaddr)
5320
5321 def _testStream(self):
5322 self.cli.send(MSG)
5323 self.cli.close()
5324
5325
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005326class ContextManagersTest(ThreadedTCPSocketTest):
5327
5328 def _testSocketClass(self):
5329 # base test
5330 with socket.socket() as sock:
5331 self.assertFalse(sock._closed)
5332 self.assertTrue(sock._closed)
5333 # close inside with block
5334 with socket.socket() as sock:
5335 sock.close()
5336 self.assertTrue(sock._closed)
5337 # exception inside with block
5338 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005339 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005340 self.assertTrue(sock._closed)
5341
5342 def testCreateConnectionBase(self):
5343 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005344 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005345 data = conn.recv(1024)
5346 conn.sendall(data)
5347
5348 def _testCreateConnectionBase(self):
5349 address = self.serv.getsockname()
5350 with socket.create_connection(address) as sock:
5351 self.assertFalse(sock._closed)
5352 sock.sendall(b'foo')
5353 self.assertEqual(sock.recv(1024), b'foo')
5354 self.assertTrue(sock._closed)
5355
5356 def testCreateConnectionClose(self):
5357 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005358 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005359 data = conn.recv(1024)
5360 conn.sendall(data)
5361
5362 def _testCreateConnectionClose(self):
5363 address = self.serv.getsockname()
5364 with socket.create_connection(address) as sock:
5365 sock.close()
5366 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005367 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005368
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005369
Victor Stinnerdaf45552013-08-28 00:53:59 +02005370class InheritanceTest(unittest.TestCase):
5371 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5372 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005373 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005374 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005375 with socket.socket(socket.AF_INET,
5376 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005377 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005378 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005379
5380 def test_default_inheritable(self):
5381 sock = socket.socket()
5382 with sock:
5383 self.assertEqual(sock.get_inheritable(), False)
5384
5385 def test_dup(self):
5386 sock = socket.socket()
5387 with sock:
5388 newsock = sock.dup()
5389 sock.close()
5390 with newsock:
5391 self.assertEqual(newsock.get_inheritable(), False)
5392
5393 def test_set_inheritable(self):
5394 sock = socket.socket()
5395 with sock:
5396 sock.set_inheritable(True)
5397 self.assertEqual(sock.get_inheritable(), True)
5398
5399 sock.set_inheritable(False)
5400 self.assertEqual(sock.get_inheritable(), False)
5401
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005402 @unittest.skipIf(fcntl is None, "need fcntl")
5403 def test_get_inheritable_cloexec(self):
5404 sock = socket.socket()
5405 with sock:
5406 fd = sock.fileno()
5407 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005408
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005409 # clear FD_CLOEXEC flag
5410 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5411 flags &= ~fcntl.FD_CLOEXEC
5412 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005413
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005414 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005415
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005416 @unittest.skipIf(fcntl is None, "need fcntl")
5417 def test_set_inheritable_cloexec(self):
5418 sock = socket.socket()
5419 with sock:
5420 fd = sock.fileno()
5421 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5422 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005423
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005424 sock.set_inheritable(True)
5425 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5426 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005427
5428
Victor Stinnerdaf45552013-08-28 00:53:59 +02005429 def test_socketpair(self):
5430 s1, s2 = socket.socketpair()
5431 self.addCleanup(s1.close)
5432 self.addCleanup(s2.close)
5433 self.assertEqual(s1.get_inheritable(), False)
5434 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005435
5436
5437@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5438 "SOCK_NONBLOCK not defined")
5439class NonblockConstantTest(unittest.TestCase):
5440 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5441 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005442 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005443 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005444 self.assertTrue(
5445 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005446 if timeout == 0:
5447 # timeout == 0: means that getblocking() must be False.
5448 self.assertFalse(s.getblocking())
5449 else:
5450 # If timeout > 0, the socket will be in a "blocking" mode
5451 # from the standpoint of the Python API. For Python socket
5452 # object, "blocking" means that operations like 'sock.recv()'
5453 # will block. Internally, file descriptors for
5454 # "blocking" Python sockets *with timeouts* are in a
5455 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5456 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5457 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005458 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005459 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005460 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005461 self.assertFalse(
5462 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005463 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005464
Charles-François Natali239bb962011-06-03 12:55:15 +02005465 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005466 def test_SOCK_NONBLOCK(self):
5467 # a lot of it seems silly and redundant, but I wanted to test that
5468 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005469 with socket.socket(socket.AF_INET,
5470 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5471 self.checkNonblock(s)
5472 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005473 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005474 s.setblocking(0)
5475 self.checkNonblock(s)
5476 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005477 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005478 s.settimeout(2.0)
5479 self.checkNonblock(s, timeout=2.0)
5480 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005481 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005482 # defaulttimeout
5483 t = socket.getdefaulttimeout()
5484 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005485 with socket.socket() as s:
5486 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005487 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005488 with socket.socket() as s:
5489 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005490 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005491 with socket.socket() as s:
5492 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005493 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005494 with socket.socket() as s:
5495 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005496 socket.setdefaulttimeout(t)
5497
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005498
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005499@unittest.skipUnless(os.name == "nt", "Windows specific")
5500@unittest.skipUnless(multiprocessing, "need multiprocessing")
5501class TestSocketSharing(SocketTCPTest):
5502 # This must be classmethod and not staticmethod or multiprocessing
5503 # won't be able to bootstrap it.
5504 @classmethod
5505 def remoteProcessServer(cls, q):
5506 # Recreate socket from shared data
5507 sdata = q.get()
5508 message = q.get()
5509
5510 s = socket.fromshare(sdata)
5511 s2, c = s.accept()
5512
5513 # Send the message
5514 s2.sendall(message)
5515 s2.close()
5516 s.close()
5517
5518 def testShare(self):
5519 # Transfer the listening server socket to another process
5520 # and service it from there.
5521
5522 # Create process:
5523 q = multiprocessing.Queue()
5524 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5525 p.start()
5526
5527 # Get the shared socket data
5528 data = self.serv.share(p.pid)
5529
5530 # Pass the shared socket to the other process
5531 addr = self.serv.getsockname()
5532 self.serv.close()
5533 q.put(data)
5534
5535 # The data that the server will send us
5536 message = b"slapmahfro"
5537 q.put(message)
5538
5539 # Connect
5540 s = socket.create_connection(addr)
5541 # listen for the data
5542 m = []
5543 while True:
5544 data = s.recv(100)
5545 if not data:
5546 break
5547 m.append(data)
5548 s.close()
5549 received = b"".join(m)
5550 self.assertEqual(received, message)
5551 p.join()
5552
5553 def testShareLength(self):
5554 data = self.serv.share(os.getpid())
5555 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5556 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5557
5558 def compareSockets(self, org, other):
5559 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005560 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005561 self.assertEqual(org.gettimeout(), None)
5562 self.assertEqual(org.gettimeout(), other.gettimeout())
5563
5564 self.assertEqual(org.family, other.family)
5565 self.assertEqual(org.type, other.type)
5566 # If the user specified "0" for proto, then
5567 # internally windows will have picked the correct value.
5568 # Python introspection on the socket however will still return
5569 # 0. For the shared socket, the python value is recreated
5570 # from the actual value, so it may not compare correctly.
5571 if org.proto != 0:
5572 self.assertEqual(org.proto, other.proto)
5573
5574 def testShareLocal(self):
5575 data = self.serv.share(os.getpid())
5576 s = socket.fromshare(data)
5577 try:
5578 self.compareSockets(self.serv, s)
5579 finally:
5580 s.close()
5581
5582 def testTypes(self):
5583 families = [socket.AF_INET, socket.AF_INET6]
5584 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5585 for f in families:
5586 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005587 try:
5588 source = socket.socket(f, t)
5589 except OSError:
5590 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005591 try:
5592 data = source.share(os.getpid())
5593 shared = socket.fromshare(data)
5594 try:
5595 self.compareSockets(source, shared)
5596 finally:
5597 shared.close()
5598 finally:
5599 source.close()
5600
5601
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005602class SendfileUsingSendTest(ThreadedTCPSocketTest):
5603 """
5604 Test the send() implementation of socket.sendfile().
5605 """
5606
Victor Stinner8c663fd2017-11-08 14:44:44 -08005607 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005608 BUFSIZE = 8192
5609 FILEDATA = b""
5610 TIMEOUT = 2
5611
5612 @classmethod
5613 def setUpClass(cls):
5614 def chunks(total, step):
5615 assert total >= step
5616 while total > step:
5617 yield step
5618 total -= step
5619 if total:
5620 yield total
5621
5622 chunk = b"".join([random.choice(string.ascii_letters).encode()
5623 for i in range(cls.BUFSIZE)])
5624 with open(support.TESTFN, 'wb') as f:
5625 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5626 f.write(chunk)
5627 with open(support.TESTFN, 'rb') as f:
5628 cls.FILEDATA = f.read()
5629 assert len(cls.FILEDATA) == cls.FILESIZE
5630
5631 @classmethod
5632 def tearDownClass(cls):
5633 support.unlink(support.TESTFN)
5634
5635 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005636 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005637 conn, addr = self.serv.accept()
5638 conn.settimeout(self.TIMEOUT)
5639 self.addCleanup(conn.close)
5640 return conn
5641
5642 def recv_data(self, conn):
5643 received = []
5644 while True:
5645 chunk = conn.recv(self.BUFSIZE)
5646 if not chunk:
5647 break
5648 received.append(chunk)
5649 return b''.join(received)
5650
5651 def meth_from_sock(self, sock):
5652 # Depending on the mixin class being run return either send()
5653 # or sendfile() method implementation.
5654 return getattr(sock, "_sendfile_use_send")
5655
5656 # regular file
5657
5658 def _testRegularFile(self):
5659 address = self.serv.getsockname()
5660 file = open(support.TESTFN, 'rb')
5661 with socket.create_connection(address) as sock, file as file:
5662 meth = self.meth_from_sock(sock)
5663 sent = meth(file)
5664 self.assertEqual(sent, self.FILESIZE)
5665 self.assertEqual(file.tell(), self.FILESIZE)
5666
5667 def testRegularFile(self):
5668 conn = self.accept_conn()
5669 data = self.recv_data(conn)
5670 self.assertEqual(len(data), self.FILESIZE)
5671 self.assertEqual(data, self.FILEDATA)
5672
5673 # non regular file
5674
5675 def _testNonRegularFile(self):
5676 address = self.serv.getsockname()
5677 file = io.BytesIO(self.FILEDATA)
5678 with socket.create_connection(address) as sock, file as file:
5679 sent = sock.sendfile(file)
5680 self.assertEqual(sent, self.FILESIZE)
5681 self.assertEqual(file.tell(), self.FILESIZE)
5682 self.assertRaises(socket._GiveupOnSendfile,
5683 sock._sendfile_use_sendfile, file)
5684
5685 def testNonRegularFile(self):
5686 conn = self.accept_conn()
5687 data = self.recv_data(conn)
5688 self.assertEqual(len(data), self.FILESIZE)
5689 self.assertEqual(data, self.FILEDATA)
5690
5691 # empty file
5692
5693 def _testEmptyFileSend(self):
5694 address = self.serv.getsockname()
5695 filename = support.TESTFN + "2"
5696 with open(filename, 'wb'):
5697 self.addCleanup(support.unlink, filename)
5698 file = open(filename, 'rb')
5699 with socket.create_connection(address) as sock, file as file:
5700 meth = self.meth_from_sock(sock)
5701 sent = meth(file)
5702 self.assertEqual(sent, 0)
5703 self.assertEqual(file.tell(), 0)
5704
5705 def testEmptyFileSend(self):
5706 conn = self.accept_conn()
5707 data = self.recv_data(conn)
5708 self.assertEqual(data, b"")
5709
5710 # offset
5711
5712 def _testOffset(self):
5713 address = self.serv.getsockname()
5714 file = open(support.TESTFN, 'rb')
5715 with socket.create_connection(address) as sock, file as file:
5716 meth = self.meth_from_sock(sock)
5717 sent = meth(file, offset=5000)
5718 self.assertEqual(sent, self.FILESIZE - 5000)
5719 self.assertEqual(file.tell(), self.FILESIZE)
5720
5721 def testOffset(self):
5722 conn = self.accept_conn()
5723 data = self.recv_data(conn)
5724 self.assertEqual(len(data), self.FILESIZE - 5000)
5725 self.assertEqual(data, self.FILEDATA[5000:])
5726
5727 # count
5728
5729 def _testCount(self):
5730 address = self.serv.getsockname()
5731 file = open(support.TESTFN, 'rb')
5732 with socket.create_connection(address, timeout=2) as sock, file as file:
5733 count = 5000007
5734 meth = self.meth_from_sock(sock)
5735 sent = meth(file, count=count)
5736 self.assertEqual(sent, count)
5737 self.assertEqual(file.tell(), count)
5738
5739 def testCount(self):
5740 count = 5000007
5741 conn = self.accept_conn()
5742 data = self.recv_data(conn)
5743 self.assertEqual(len(data), count)
5744 self.assertEqual(data, self.FILEDATA[:count])
5745
5746 # count small
5747
5748 def _testCountSmall(self):
5749 address = self.serv.getsockname()
5750 file = open(support.TESTFN, 'rb')
5751 with socket.create_connection(address, timeout=2) as sock, file as file:
5752 count = 1
5753 meth = self.meth_from_sock(sock)
5754 sent = meth(file, count=count)
5755 self.assertEqual(sent, count)
5756 self.assertEqual(file.tell(), count)
5757
5758 def testCountSmall(self):
5759 count = 1
5760 conn = self.accept_conn()
5761 data = self.recv_data(conn)
5762 self.assertEqual(len(data), count)
5763 self.assertEqual(data, self.FILEDATA[:count])
5764
5765 # count + offset
5766
5767 def _testCountWithOffset(self):
5768 address = self.serv.getsockname()
5769 file = open(support.TESTFN, 'rb')
5770 with socket.create_connection(address, timeout=2) as sock, file as file:
5771 count = 100007
5772 meth = self.meth_from_sock(sock)
5773 sent = meth(file, offset=2007, count=count)
5774 self.assertEqual(sent, count)
5775 self.assertEqual(file.tell(), count + 2007)
5776
5777 def testCountWithOffset(self):
5778 count = 100007
5779 conn = self.accept_conn()
5780 data = self.recv_data(conn)
5781 self.assertEqual(len(data), count)
5782 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5783
5784 # non blocking sockets are not supposed to work
5785
5786 def _testNonBlocking(self):
5787 address = self.serv.getsockname()
5788 file = open(support.TESTFN, 'rb')
5789 with socket.create_connection(address) as sock, file as file:
5790 sock.setblocking(False)
5791 meth = self.meth_from_sock(sock)
5792 self.assertRaises(ValueError, meth, file)
5793 self.assertRaises(ValueError, sock.sendfile, file)
5794
5795 def testNonBlocking(self):
5796 conn = self.accept_conn()
5797 if conn.recv(8192):
5798 self.fail('was not supposed to receive any data')
5799
5800 # timeout (non-triggered)
5801
5802 def _testWithTimeout(self):
5803 address = self.serv.getsockname()
5804 file = open(support.TESTFN, 'rb')
5805 with socket.create_connection(address, timeout=2) as sock, file as file:
5806 meth = self.meth_from_sock(sock)
5807 sent = meth(file)
5808 self.assertEqual(sent, self.FILESIZE)
5809
5810 def testWithTimeout(self):
5811 conn = self.accept_conn()
5812 data = self.recv_data(conn)
5813 self.assertEqual(len(data), self.FILESIZE)
5814 self.assertEqual(data, self.FILEDATA)
5815
5816 # timeout (triggered)
5817
5818 def _testWithTimeoutTriggeredSend(self):
5819 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00005820 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005821 with socket.create_connection(address) as sock:
5822 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00005823 meth = self.meth_from_sock(sock)
5824 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005825
5826 def testWithTimeoutTriggeredSend(self):
5827 conn = self.accept_conn()
5828 conn.recv(88192)
5829
5830 # errors
5831
5832 def _test_errors(self):
5833 pass
5834
5835 def test_errors(self):
5836 with open(support.TESTFN, 'rb') as file:
5837 with socket.socket(type=socket.SOCK_DGRAM) as s:
5838 meth = self.meth_from_sock(s)
5839 self.assertRaisesRegex(
5840 ValueError, "SOCK_STREAM", meth, file)
5841 with open(support.TESTFN, 'rt') as file:
5842 with socket.socket() as s:
5843 meth = self.meth_from_sock(s)
5844 self.assertRaisesRegex(
5845 ValueError, "binary mode", meth, file)
5846 with open(support.TESTFN, 'rb') as file:
5847 with socket.socket() as s:
5848 meth = self.meth_from_sock(s)
5849 self.assertRaisesRegex(TypeError, "positive integer",
5850 meth, file, count='2')
5851 self.assertRaisesRegex(TypeError, "positive integer",
5852 meth, file, count=0.1)
5853 self.assertRaisesRegex(ValueError, "positive integer",
5854 meth, file, count=0)
5855 self.assertRaisesRegex(ValueError, "positive integer",
5856 meth, file, count=-1)
5857
5858
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005859@unittest.skipUnless(hasattr(os, "sendfile"),
5860 'os.sendfile() required for this test.')
5861class SendfileUsingSendfileTest(SendfileUsingSendTest):
5862 """
5863 Test the sendfile() implementation of socket.sendfile().
5864 """
5865 def meth_from_sock(self, sock):
5866 return getattr(sock, "_sendfile_use_sendfile")
5867
Christian Heimes48371412016-09-06 00:37:46 +02005868
5869@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005870class LinuxKernelCryptoAPI(unittest.TestCase):
5871 # tests for AF_ALG
5872 def create_alg(self, typ, name):
5873 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005874 try:
5875 sock.bind((typ, name))
5876 except FileNotFoundError as e:
5877 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005878 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005879 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005880 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005881 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005882
Victor Stinner86afc1f2017-11-30 13:58:43 +01005883 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5884 # at least on ppc64le architecture
5885 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005886 def test_sha256(self):
5887 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5888 "177a9cb410ff61f20015ad")
5889 with self.create_alg('hash', 'sha256') as algo:
5890 op, _ = algo.accept()
5891 with op:
5892 op.sendall(b"abc")
5893 self.assertEqual(op.recv(512), expected)
5894
5895 op, _ = algo.accept()
5896 with op:
5897 op.send(b'a', socket.MSG_MORE)
5898 op.send(b'b', socket.MSG_MORE)
5899 op.send(b'c', socket.MSG_MORE)
5900 op.send(b'')
5901 self.assertEqual(op.recv(512), expected)
5902
5903 def test_hmac_sha1(self):
5904 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5905 with self.create_alg('hash', 'hmac(sha1)') as algo:
5906 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5907 op, _ = algo.accept()
5908 with op:
5909 op.sendall(b"what do ya want for nothing?")
5910 self.assertEqual(op.recv(512), expected)
5911
Christian Heimese084f842016-09-11 20:11:30 +02005912 # Although it should work with 3.19 and newer the test blocks on
5913 # Ubuntu 15.10 with Kernel 4.2.0-19.
5914 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005915 def test_aes_cbc(self):
5916 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5917 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5918 msg = b"Single block msg"
5919 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5920 msglen = len(msg)
5921 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5922 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5923 op, _ = algo.accept()
5924 with op:
5925 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5926 flags=socket.MSG_MORE)
5927 op.sendall(msg)
5928 self.assertEqual(op.recv(msglen), ciphertext)
5929
5930 op, _ = algo.accept()
5931 with op:
5932 op.sendmsg_afalg([ciphertext],
5933 op=socket.ALG_OP_DECRYPT, iv=iv)
5934 self.assertEqual(op.recv(msglen), msg)
5935
5936 # long message
5937 multiplier = 1024
5938 longmsg = [msg] * multiplier
5939 op, _ = algo.accept()
5940 with op:
5941 op.sendmsg_afalg(longmsg,
5942 op=socket.ALG_OP_ENCRYPT, iv=iv)
5943 enc = op.recv(msglen * multiplier)
5944 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05005945 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005946
5947 op, _ = algo.accept()
5948 with op:
5949 op.sendmsg_afalg([enc],
5950 op=socket.ALG_OP_DECRYPT, iv=iv)
5951 dec = op.recv(msglen * multiplier)
5952 self.assertEqual(len(dec), msglen * multiplier)
5953 self.assertEqual(dec, msg * multiplier)
5954
matejcik9764c152017-02-16 14:41:31 +01005955 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005956 def test_aead_aes_gcm(self):
5957 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5958 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5959 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5960 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5961 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5962 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5963
5964 taglen = len(expected_tag)
5965 assoclen = len(assoc)
5966
5967 with self.create_alg('aead', 'gcm(aes)') as algo:
5968 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5969 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5970 None, taglen)
5971
5972 # send assoc, plain and tag buffer in separate steps
5973 op, _ = algo.accept()
5974 with op:
5975 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5976 assoclen=assoclen, flags=socket.MSG_MORE)
5977 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005978 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005979 res = op.recv(assoclen + len(plain) + taglen)
5980 self.assertEqual(expected_ct, res[assoclen:-taglen])
5981 self.assertEqual(expected_tag, res[-taglen:])
5982
5983 # now with msg
5984 op, _ = algo.accept()
5985 with op:
matejcik9764c152017-02-16 14:41:31 +01005986 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005987 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5988 assoclen=assoclen)
5989 res = op.recv(assoclen + len(plain) + taglen)
5990 self.assertEqual(expected_ct, res[assoclen:-taglen])
5991 self.assertEqual(expected_tag, res[-taglen:])
5992
5993 # create anc data manually
5994 pack_uint32 = struct.Struct('I').pack
5995 op, _ = algo.accept()
5996 with op:
matejcik9764c152017-02-16 14:41:31 +01005997 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005998 op.sendmsg(
5999 [msg],
6000 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6001 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6002 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6003 )
6004 )
matejcik9764c152017-02-16 14:41:31 +01006005 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006006 self.assertEqual(expected_ct, res[assoclen:-taglen])
6007 self.assertEqual(expected_tag, res[-taglen:])
6008
6009 # decrypt and verify
6010 op, _ = algo.accept()
6011 with op:
6012 msg = assoc + expected_ct + expected_tag
6013 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6014 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006015 res = op.recv(len(msg) - taglen)
6016 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006017
Christian Heimese084f842016-09-11 20:11:30 +02006018 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006019 def test_drbg_pr_sha256(self):
6020 # deterministic random bit generator, prediction resistance, sha256
6021 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6022 extra_seed = os.urandom(32)
6023 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6024 op, _ = algo.accept()
6025 with op:
6026 rn = op.recv(32)
6027 self.assertEqual(len(rn), 32)
6028
6029 def test_sendmsg_afalg_args(self):
6030 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006031 with sock:
6032 with self.assertRaises(TypeError):
6033 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006034
Christian Heimes02b30352016-09-11 19:49:56 +02006035 with self.assertRaises(TypeError):
6036 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006037
Christian Heimes02b30352016-09-11 19:49:56 +02006038 with self.assertRaises(TypeError):
6039 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006040
Christian Heimes02b30352016-09-11 19:49:56 +02006041 with self.assertRaises(TypeError):
6042 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006043
Christian Heimes02b30352016-09-11 19:49:56 +02006044 with self.assertRaises(TypeError):
6045 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6046
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006047 def test_length_restriction(self):
6048 # bpo-35050, off-by-one error in length check
6049 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6050 self.addCleanup(sock.close)
6051
6052 # salg_type[14]
6053 with self.assertRaises(FileNotFoundError):
6054 sock.bind(("t" * 13, "name"))
6055 with self.assertRaisesRegex(ValueError, "type too long"):
6056 sock.bind(("t" * 14, "name"))
6057
6058 # salg_name[64]
6059 with self.assertRaises(FileNotFoundError):
6060 sock.bind(("type", "n" * 63))
6061 with self.assertRaisesRegex(ValueError, "name too long"):
6062 sock.bind(("type", "n" * 64))
6063
6064
animalize19e7d482018-02-27 02:10:36 +08006065@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6066class TestMSWindowsTCPFlags(unittest.TestCase):
6067 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006068 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006069 'TCP_MAXSEG',
6070 'TCP_NODELAY',
6071 # available starting with Windows 10 1607
6072 'TCP_FASTOPEN',
6073 # available starting with Windows 10 1703
6074 'TCP_KEEPCNT',
6075 # available starting with Windows 10 1709
6076 'TCP_KEEPIDLE',
6077 'TCP_KEEPINTVL'
6078 }
6079
6080 def test_new_tcp_flags(self):
6081 provided = [s for s in dir(socket) if s.startswith('TCP')]
6082 unknown = [s for s in provided if s not in self.knownTCPFlags]
6083
6084 self.assertEqual([], unknown,
6085 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006086
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006087
6088class CreateServerTest(unittest.TestCase):
6089
6090 def test_address(self):
6091 port = support.find_unused_port()
6092 with socket.create_server(("127.0.0.1", port)) as sock:
6093 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6094 self.assertEqual(sock.getsockname()[1], port)
6095 if support.IPV6_ENABLED:
6096 with socket.create_server(("::1", port),
6097 family=socket.AF_INET6) as sock:
6098 self.assertEqual(sock.getsockname()[0], "::1")
6099 self.assertEqual(sock.getsockname()[1], port)
6100
6101 def test_family_and_type(self):
6102 with socket.create_server(("127.0.0.1", 0)) as sock:
6103 self.assertEqual(sock.family, socket.AF_INET)
6104 self.assertEqual(sock.type, socket.SOCK_STREAM)
6105 if support.IPV6_ENABLED:
6106 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6107 self.assertEqual(s.family, socket.AF_INET6)
6108 self.assertEqual(sock.type, socket.SOCK_STREAM)
6109
6110 def test_reuse_port(self):
6111 if not hasattr(socket, "SO_REUSEPORT"):
6112 with self.assertRaises(ValueError):
6113 socket.create_server(("localhost", 0), reuse_port=True)
6114 else:
6115 with socket.create_server(("localhost", 0)) as sock:
6116 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6117 self.assertEqual(opt, 0)
6118 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6119 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6120 self.assertNotEqual(opt, 0)
6121
6122 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6123 not hasattr(_socket, 'IPV6_V6ONLY'),
6124 "IPV6_V6ONLY option not supported")
6125 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6126 def test_ipv6_only_default(self):
6127 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6128 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6129
6130 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6131 "dualstack_ipv6 not supported")
6132 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6133 def test_dualstack_ipv6_family(self):
6134 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6135 dualstack_ipv6=True) as sock:
6136 self.assertEqual(sock.family, socket.AF_INET6)
6137
6138
6139class CreateServerFunctionalTest(unittest.TestCase):
6140 timeout = 3
6141
6142 def setUp(self):
6143 self.thread = None
6144
6145 def tearDown(self):
6146 if self.thread is not None:
6147 self.thread.join(self.timeout)
6148
6149 def echo_server(self, sock):
6150 def run(sock):
6151 with sock:
6152 conn, _ = sock.accept()
6153 with conn:
6154 event.wait(self.timeout)
6155 msg = conn.recv(1024)
6156 if not msg:
6157 return
6158 conn.sendall(msg)
6159
6160 event = threading.Event()
6161 sock.settimeout(self.timeout)
6162 self.thread = threading.Thread(target=run, args=(sock, ))
6163 self.thread.start()
6164 event.set()
6165
6166 def echo_client(self, addr, family):
6167 with socket.socket(family=family) as sock:
6168 sock.settimeout(self.timeout)
6169 sock.connect(addr)
6170 sock.sendall(b'foo')
6171 self.assertEqual(sock.recv(1024), b'foo')
6172
6173 def test_tcp4(self):
6174 port = support.find_unused_port()
6175 with socket.create_server(("", port)) as sock:
6176 self.echo_server(sock)
6177 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6178
6179 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6180 def test_tcp6(self):
6181 port = support.find_unused_port()
6182 with socket.create_server(("", port),
6183 family=socket.AF_INET6) as sock:
6184 self.echo_server(sock)
6185 self.echo_client(("::1", port), socket.AF_INET6)
6186
6187 # --- dual stack tests
6188
6189 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6190 "dualstack_ipv6 not supported")
6191 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6192 def test_dual_stack_client_v4(self):
6193 port = support.find_unused_port()
6194 with socket.create_server(("", port), family=socket.AF_INET6,
6195 dualstack_ipv6=True) as sock:
6196 self.echo_server(sock)
6197 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6198
6199 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6200 "dualstack_ipv6 not supported")
6201 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6202 def test_dual_stack_client_v6(self):
6203 port = support.find_unused_port()
6204 with socket.create_server(("", port), family=socket.AF_INET6,
6205 dualstack_ipv6=True) as sock:
6206 self.echo_server(sock)
6207 self.echo_client(("::1", port), socket.AF_INET6)
6208
6209
Guido van Rossumb995eb72002-07-31 16:08:40 +00006210def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006211 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006212 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
6213 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006214
6215 tests.extend([
6216 NonBlockingTCPTests,
6217 FileObjectClassTestCase,
6218 UnbufferedFileObjectClassTestCase,
6219 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006220 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006221 UnicodeReadFileObjectClassTestCase,
6222 UnicodeWriteFileObjectClassTestCase,
6223 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006224 NetworkConnectionNoServer,
6225 NetworkConnectionAttributesTest,
6226 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006227 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006228 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006229 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006230 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006231 tests.append(BasicSocketPairTest)
6232 tests.append(TestUnixDomain)
6233 tests.append(TestLinuxAbstractNamespace)
6234 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006235 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006236 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006237 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006238 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006239 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006240 BasicVSOCKTest,
6241 ThreadedVSOCKSocketStreamTest,
6242 ])
6243 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006244 CmsgMacroTests,
6245 SendmsgUDPTest,
6246 RecvmsgUDPTest,
6247 RecvmsgIntoUDPTest,
6248 SendmsgUDP6Test,
6249 RecvmsgUDP6Test,
6250 RecvmsgRFC3542AncillaryUDP6Test,
6251 RecvmsgIntoRFC3542AncillaryUDP6Test,
6252 RecvmsgIntoUDP6Test,
6253 SendmsgTCPTest,
6254 RecvmsgTCPTest,
6255 RecvmsgIntoTCPTest,
6256 SendmsgSCTPStreamTest,
6257 RecvmsgSCTPStreamTest,
6258 RecvmsgIntoSCTPStreamTest,
6259 SendmsgUnixStreamTest,
6260 RecvmsgUnixStreamTest,
6261 RecvmsgIntoUnixStreamTest,
6262 RecvmsgSCMRightsStreamTest,
6263 RecvmsgIntoSCMRightsStreamTest,
6264 # These are slow when setitimer() is not available
6265 InterruptedRecvTimeoutTest,
6266 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006267 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006268 SendfileUsingSendTest,
6269 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006270 ])
animalize19e7d482018-02-27 02:10:36 +08006271 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006272
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006273 thread_info = support.threading_setup()
6274 support.run_unittest(*tests)
6275 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006276
6277if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006278 test_main()