blob: 1bf562a03d556cad202a53bcbee6108cf58201ff [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:
Miss Islington (bot)f60fd952019-09-12 03:34:28 -07001900 address = ('', )
1901 s.bind(address)
1902 self.assertEqual(s.getsockname(), address)
Charles-François Natali47413c12011-10-06 19:47:44 +02001903
1904 def testTooLongInterfaceName(self):
1905 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1906 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001907 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001908 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001909
1910 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1911 'socket.CAN_RAW_LOOPBACK required for this test.')
1912 def testLoopback(self):
1913 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1914 for loopback in (0, 1):
1915 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1916 loopback)
1917 self.assertEqual(loopback,
1918 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1919
1920 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1921 'socket.CAN_RAW_FILTER required for this test.')
1922 def testFilter(self):
1923 can_id, can_mask = 0x200, 0x700
1924 can_filter = struct.pack("=II", can_id, can_mask)
1925 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1926 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1927 self.assertEqual(can_filter,
1928 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001929 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001930
1931
1932@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001933class CANTest(ThreadedCANSocketTest):
1934
Charles-François Natali47413c12011-10-06 19:47:44 +02001935 def __init__(self, methodName='runTest'):
1936 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1937
1938 @classmethod
1939 def build_can_frame(cls, can_id, data):
1940 """Build a CAN frame."""
1941 can_dlc = len(data)
1942 data = data.ljust(8, b'\x00')
1943 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1944
1945 @classmethod
1946 def dissect_can_frame(cls, frame):
1947 """Dissect a CAN frame."""
1948 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1949 return (can_id, can_dlc, data[:can_dlc])
1950
1951 def testSendFrame(self):
1952 cf, addr = self.s.recvfrom(self.bufsize)
1953 self.assertEqual(self.cf, cf)
1954 self.assertEqual(addr[0], self.interface)
1955 self.assertEqual(addr[1], socket.AF_CAN)
1956
1957 def _testSendFrame(self):
1958 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1959 self.cli.send(self.cf)
1960
1961 def testSendMaxFrame(self):
1962 cf, addr = self.s.recvfrom(self.bufsize)
1963 self.assertEqual(self.cf, cf)
1964
1965 def _testSendMaxFrame(self):
1966 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1967 self.cli.send(self.cf)
1968
1969 def testSendMultiFrames(self):
1970 cf, addr = self.s.recvfrom(self.bufsize)
1971 self.assertEqual(self.cf1, cf)
1972
1973 cf, addr = self.s.recvfrom(self.bufsize)
1974 self.assertEqual(self.cf2, cf)
1975
1976 def _testSendMultiFrames(self):
1977 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1978 self.cli.send(self.cf1)
1979
1980 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1981 self.cli.send(self.cf2)
1982
Charles-François Natali773e42d2013-02-05 19:42:01 +01001983 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1984 'socket.CAN_BCM required for this test.')
1985 def _testBCM(self):
1986 cf, addr = self.cli.recvfrom(self.bufsize)
1987 self.assertEqual(self.cf, cf)
1988 can_id, can_dlc, data = self.dissect_can_frame(cf)
1989 self.assertEqual(self.can_id, can_id)
1990 self.assertEqual(self.data, data)
1991
1992 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1993 'socket.CAN_BCM required for this test.')
1994 def testBCM(self):
1995 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1996 self.addCleanup(bcm.close)
1997 bcm.connect((self.interface,))
1998 self.can_id = 0x123
1999 self.data = bytes([0xc0, 0xff, 0xee])
2000 self.cf = self.build_can_frame(self.can_id, self.data)
2001 opcode = socket.CAN_BCM_TX_SEND
2002 flags = 0
2003 count = 0
2004 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
2005 bcm_can_id = 0x0222
2006 nframes = 1
2007 assert len(self.cf) == 16
2008 header = struct.pack(self.bcm_cmd_msg_fmt,
2009 opcode,
2010 flags,
2011 count,
2012 ival1_seconds,
2013 ival1_usec,
2014 ival2_seconds,
2015 ival2_usec,
2016 bcm_can_id,
2017 nframes,
2018 )
2019 header_plus_frame = header + self.cf
2020 bytes_sent = bcm.send(header_plus_frame)
2021 self.assertEqual(bytes_sent, len(header_plus_frame))
2022
Charles-François Natali47413c12011-10-06 19:47:44 +02002023
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002024@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2025class ISOTPTest(unittest.TestCase):
2026
2027 def __init__(self, *args, **kwargs):
2028 super().__init__(*args, **kwargs)
2029 self.interface = "vcan0"
2030
2031 def testCrucialConstants(self):
2032 socket.AF_CAN
2033 socket.PF_CAN
2034 socket.CAN_ISOTP
2035 socket.SOCK_DGRAM
2036
2037 def testCreateSocket(self):
2038 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2039 pass
2040
2041 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2042 'socket.CAN_ISOTP required for this test.')
2043 def testCreateISOTPSocket(self):
2044 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2045 pass
2046
2047 def testTooLongInterfaceName(self):
2048 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2049 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2050 with self.assertRaisesRegex(OSError, 'interface name too long'):
2051 s.bind(('x' * 1024, 1, 2))
2052
2053 def testBind(self):
2054 try:
2055 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2056 addr = self.interface, 0x123, 0x456
2057 s.bind(addr)
2058 self.assertEqual(s.getsockname(), addr)
2059 except OSError as e:
2060 if e.errno == errno.ENODEV:
2061 self.skipTest('network interface `%s` does not exist' %
2062 self.interface)
2063 else:
2064 raise
2065
2066
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002067@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2068class BasicRDSTest(unittest.TestCase):
2069
2070 def testCrucialConstants(self):
2071 socket.AF_RDS
2072 socket.PF_RDS
2073
2074 def testCreateSocket(self):
2075 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2076 pass
2077
2078 def testSocketBufferSize(self):
2079 bufsize = 16384
2080 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2081 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2082 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2083
2084
2085@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002086class RDSTest(ThreadedRDSSocketTest):
2087
2088 def __init__(self, methodName='runTest'):
2089 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2090
Charles-François Natali240c55f2011-11-10 20:33:36 +01002091 def setUp(self):
2092 super().setUp()
2093 self.evt = threading.Event()
2094
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002095 def testSendAndRecv(self):
2096 data, addr = self.serv.recvfrom(self.bufsize)
2097 self.assertEqual(self.data, data)
2098 self.assertEqual(self.cli_addr, addr)
2099
2100 def _testSendAndRecv(self):
2101 self.data = b'spam'
2102 self.cli.sendto(self.data, 0, (HOST, self.port))
2103
2104 def testPeek(self):
2105 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2106 self.assertEqual(self.data, data)
2107 data, addr = self.serv.recvfrom(self.bufsize)
2108 self.assertEqual(self.data, data)
2109
2110 def _testPeek(self):
2111 self.data = b'spam'
2112 self.cli.sendto(self.data, 0, (HOST, self.port))
2113
2114 @requireAttrs(socket.socket, 'recvmsg')
2115 def testSendAndRecvMsg(self):
2116 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2117 self.assertEqual(self.data, data)
2118
2119 @requireAttrs(socket.socket, 'sendmsg')
2120 def _testSendAndRecvMsg(self):
2121 self.data = b'hello ' * 10
2122 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2123
2124 def testSendAndRecvMulti(self):
2125 data, addr = self.serv.recvfrom(self.bufsize)
2126 self.assertEqual(self.data1, data)
2127
2128 data, addr = self.serv.recvfrom(self.bufsize)
2129 self.assertEqual(self.data2, data)
2130
2131 def _testSendAndRecvMulti(self):
2132 self.data1 = b'bacon'
2133 self.cli.sendto(self.data1, 0, (HOST, self.port))
2134
2135 self.data2 = b'egg'
2136 self.cli.sendto(self.data2, 0, (HOST, self.port))
2137
2138 def testSelect(self):
2139 r, w, x = select.select([self.serv], [], [], 3.0)
2140 self.assertIn(self.serv, r)
2141 data, addr = self.serv.recvfrom(self.bufsize)
2142 self.assertEqual(self.data, data)
2143
2144 def _testSelect(self):
2145 self.data = b'select'
2146 self.cli.sendto(self.data, 0, (HOST, self.port))
2147
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002148@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2149 'QIPCRTR sockets required for this test.')
2150class BasicQIPCRTRTest(unittest.TestCase):
2151
2152 def testCrucialConstants(self):
2153 socket.AF_QIPCRTR
2154
2155 def testCreateSocket(self):
2156 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2157 pass
2158
2159 def testUnbound(self):
2160 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2161 self.assertEqual(s.getsockname()[1], 0)
2162
2163 def testBindSock(self):
2164 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2165 support.bind_port(s, host=s.getsockname()[0])
2166 self.assertNotEqual(s.getsockname()[1], 0)
2167
2168 def testInvalidBindSock(self):
2169 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2170 self.assertRaises(OSError, support.bind_port, s, host=-2)
2171
2172 def testAutoBindSock(self):
2173 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2174 s.connect((123, 123))
2175 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002176
caaveryeffc12f2017-09-06 18:18:10 -04002177@unittest.skipIf(fcntl is None, "need fcntl")
2178@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2179 'VSOCK sockets required for this test.')
2180class BasicVSOCKTest(unittest.TestCase):
2181
2182 def testCrucialConstants(self):
2183 socket.AF_VSOCK
2184
2185 def testVSOCKConstants(self):
2186 socket.SO_VM_SOCKETS_BUFFER_SIZE
2187 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2188 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2189 socket.VMADDR_CID_ANY
2190 socket.VMADDR_PORT_ANY
2191 socket.VMADDR_CID_HOST
2192 socket.VM_SOCKETS_INVALID_VERSION
2193 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2194
2195 def testCreateSocket(self):
2196 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2197 pass
2198
2199 def testSocketBufferSize(self):
2200 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2201 orig_max = s.getsockopt(socket.AF_VSOCK,
2202 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2203 orig = s.getsockopt(socket.AF_VSOCK,
2204 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2205 orig_min = s.getsockopt(socket.AF_VSOCK,
2206 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2207
2208 s.setsockopt(socket.AF_VSOCK,
2209 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2210 s.setsockopt(socket.AF_VSOCK,
2211 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2212 s.setsockopt(socket.AF_VSOCK,
2213 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2214
2215 self.assertEqual(orig_max * 2,
2216 s.getsockopt(socket.AF_VSOCK,
2217 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2218 self.assertEqual(orig * 2,
2219 s.getsockopt(socket.AF_VSOCK,
2220 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2221 self.assertEqual(orig_min * 2,
2222 s.getsockopt(socket.AF_VSOCK,
2223 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2224
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002225
Guido van Rossum24e4af82002-06-12 19:18:08 +00002226class BasicTCPTest(SocketConnectedTest):
2227
2228 def __init__(self, methodName='runTest'):
2229 SocketConnectedTest.__init__(self, methodName=methodName)
2230
2231 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002232 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002233 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002234 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002235
2236 def _testRecv(self):
2237 self.serv_conn.send(MSG)
2238
2239 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002240 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002241 seg1 = self.cli_conn.recv(len(MSG) - 3)
2242 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002243 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002244 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002245
2246 def _testOverFlowRecv(self):
2247 self.serv_conn.send(MSG)
2248
2249 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002250 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002251 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002252 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002253
2254 def _testRecvFrom(self):
2255 self.serv_conn.send(MSG)
2256
2257 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002258 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002259 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2260 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002261 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002262 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002263
2264 def _testOverFlowRecvFrom(self):
2265 self.serv_conn.send(MSG)
2266
2267 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002268 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002269 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002270 while 1:
2271 read = self.cli_conn.recv(1024)
2272 if not read:
2273 break
Guido van Rossume531e292002-08-08 20:28:34 +00002274 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002275 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002276
2277 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002278 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002279 self.serv_conn.sendall(big_chunk)
2280
2281 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002282 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002283 fd = self.cli_conn.fileno()
2284 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002285 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002286 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002287 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002288 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002289
2290 def _testFromFd(self):
2291 self.serv_conn.send(MSG)
2292
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002293 def testDup(self):
2294 # Testing dup()
2295 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002296 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002297 msg = sock.recv(1024)
2298 self.assertEqual(msg, MSG)
2299
2300 def _testDup(self):
2301 self.serv_conn.send(MSG)
2302
Guido van Rossum24e4af82002-06-12 19:18:08 +00002303 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002304 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002305 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002306 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002307 # wait for _testShutdown to finish: on OS X, when the server
2308 # closes the connection the client also becomes disconnected,
2309 # and the client's shutdown call will fail. (Issue #4397.)
2310 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002311
2312 def _testShutdown(self):
2313 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002314 self.serv_conn.shutdown(2)
2315
2316 testShutdown_overflow = support.cpython_only(testShutdown)
2317
2318 @support.cpython_only
2319 def _testShutdown_overflow(self):
2320 import _testcapi
2321 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002322 # Issue 15989
2323 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2324 _testcapi.INT_MAX + 1)
2325 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2326 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002327 self.serv_conn.shutdown(2)
2328
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002329 def testDetach(self):
2330 # Testing detach()
2331 fileno = self.cli_conn.fileno()
2332 f = self.cli_conn.detach()
2333 self.assertEqual(f, fileno)
2334 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002335 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002336 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002337 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002338 # ...but we can create another socket using the (still open)
2339 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002340 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002341 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002342 msg = sock.recv(1024)
2343 self.assertEqual(msg, MSG)
2344
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002345 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002346 self.serv_conn.send(MSG)
2347
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002348
Guido van Rossum24e4af82002-06-12 19:18:08 +00002349class BasicUDPTest(ThreadedUDPSocketTest):
2350
2351 def __init__(self, methodName='runTest'):
2352 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2353
2354 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002355 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002356 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002357 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002358
2359 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002360 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002361
Guido van Rossum1c938012002-06-12 21:17:20 +00002362 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002363 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002364 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002365 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002366
Guido van Rossum1c938012002-06-12 21:17:20 +00002367 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002368 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002369
Guido van Rossumd8faa362007-04-27 19:54:29 +00002370 def testRecvFromNegative(self):
2371 # Negative lengths passed to recvfrom should give ValueError.
2372 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2373
2374 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002375 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002376
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002377# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2378# same test code is used with different families and types of socket
2379# (e.g. stream, datagram), and tests using recvmsg() are repeated
2380# using recvmsg_into().
2381#
2382# The generic test classes such as SendmsgTests and
2383# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2384# supplied with sockets cli_sock and serv_sock representing the
2385# client's and the server's end of the connection respectively, and
2386# attributes cli_addr and serv_addr holding their (numeric where
2387# appropriate) addresses.
2388#
2389# The final concrete test classes combine these with subclasses of
2390# SocketTestBase which set up client and server sockets of a specific
2391# type, and with subclasses of SendrecvmsgBase such as
2392# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2393# sockets to cli_sock and serv_sock and override the methods and
2394# attributes of SendrecvmsgBase to fill in destination addresses if
2395# needed when sending, check for specific flags in msg_flags, etc.
2396#
2397# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2398# recvmsg_into().
2399
2400# XXX: like the other datagram (UDP) tests in this module, the code
2401# here assumes that datagram delivery on the local machine will be
2402# reliable.
2403
2404class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2405 # Base class for sendmsg()/recvmsg() tests.
2406
2407 # Time in seconds to wait before considering a test failed, or
2408 # None for no timeout. Not all tests actually set a timeout.
2409 fail_timeout = 3.0
2410
2411 def setUp(self):
2412 self.misc_event = threading.Event()
2413 super().setUp()
2414
2415 def sendToServer(self, msg):
2416 # Send msg to the server.
2417 return self.cli_sock.send(msg)
2418
2419 # Tuple of alternative default arguments for sendmsg() when called
2420 # via sendmsgToServer() (e.g. to include a destination address).
2421 sendmsg_to_server_defaults = ()
2422
2423 def sendmsgToServer(self, *args):
2424 # Call sendmsg() on self.cli_sock with the given arguments,
2425 # filling in any arguments which are not supplied with the
2426 # corresponding items of self.sendmsg_to_server_defaults, if
2427 # any.
2428 return self.cli_sock.sendmsg(
2429 *(args + self.sendmsg_to_server_defaults[len(args):]))
2430
2431 def doRecvmsg(self, sock, bufsize, *args):
2432 # Call recvmsg() on sock with given arguments and return its
2433 # result. Should be used for tests which can use either
2434 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2435 # this method with one which emulates it using recvmsg_into(),
2436 # thus allowing the same test to be used for both methods.
2437 result = sock.recvmsg(bufsize, *args)
2438 self.registerRecvmsgResult(result)
2439 return result
2440
2441 def registerRecvmsgResult(self, result):
2442 # Called by doRecvmsg() with the return value of recvmsg() or
2443 # recvmsg_into(). Can be overridden to arrange cleanup based
2444 # on the returned ancillary data, for instance.
2445 pass
2446
2447 def checkRecvmsgAddress(self, addr1, addr2):
2448 # Called to compare the received address with the address of
2449 # the peer.
2450 self.assertEqual(addr1, addr2)
2451
2452 # Flags that are normally unset in msg_flags
2453 msg_flags_common_unset = 0
2454 for name in ("MSG_CTRUNC", "MSG_OOB"):
2455 msg_flags_common_unset |= getattr(socket, name, 0)
2456
2457 # Flags that are normally set
2458 msg_flags_common_set = 0
2459
2460 # Flags set when a complete record has been received (e.g. MSG_EOR
2461 # for SCTP)
2462 msg_flags_eor_indicator = 0
2463
2464 # Flags set when a complete record has not been received
2465 # (e.g. MSG_TRUNC for datagram sockets)
2466 msg_flags_non_eor_indicator = 0
2467
2468 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2469 # Method to check the value of msg_flags returned by recvmsg[_into]().
2470 #
2471 # Checks that all bits in msg_flags_common_set attribute are
2472 # set in "flags" and all bits in msg_flags_common_unset are
2473 # unset.
2474 #
2475 # The "eor" argument specifies whether the flags should
2476 # indicate that a full record (or datagram) has been received.
2477 # If "eor" is None, no checks are done; otherwise, checks
2478 # that:
2479 #
2480 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2481 # set and all bits in msg_flags_non_eor_indicator are unset
2482 #
2483 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2484 # are set and all bits in msg_flags_eor_indicator are unset
2485 #
2486 # If "checkset" and/or "checkunset" are supplied, they require
2487 # the given bits to be set or unset respectively, overriding
2488 # what the attributes require for those bits.
2489 #
2490 # If any bits are set in "ignore", they will not be checked,
2491 # regardless of the other inputs.
2492 #
2493 # Will raise Exception if the inputs require a bit to be both
2494 # set and unset, and it is not ignored.
2495
2496 defaultset = self.msg_flags_common_set
2497 defaultunset = self.msg_flags_common_unset
2498
2499 if eor:
2500 defaultset |= self.msg_flags_eor_indicator
2501 defaultunset |= self.msg_flags_non_eor_indicator
2502 elif eor is not None:
2503 defaultset |= self.msg_flags_non_eor_indicator
2504 defaultunset |= self.msg_flags_eor_indicator
2505
2506 # Function arguments override defaults
2507 defaultset &= ~checkunset
2508 defaultunset &= ~checkset
2509
2510 # Merge arguments with remaining defaults, and check for conflicts
2511 checkset |= defaultset
2512 checkunset |= defaultunset
2513 inboth = checkset & checkunset & ~ignore
2514 if inboth:
2515 raise Exception("contradictory set, unset requirements for flags "
2516 "{0:#x}".format(inboth))
2517
2518 # Compare with given msg_flags value
2519 mask = (checkset | checkunset) & ~ignore
2520 self.assertEqual(flags & mask, checkset & mask)
2521
2522
2523class RecvmsgIntoMixin(SendrecvmsgBase):
2524 # Mixin to implement doRecvmsg() using recvmsg_into().
2525
2526 def doRecvmsg(self, sock, bufsize, *args):
2527 buf = bytearray(bufsize)
2528 result = sock.recvmsg_into([buf], *args)
2529 self.registerRecvmsgResult(result)
2530 self.assertGreaterEqual(result[0], 0)
2531 self.assertLessEqual(result[0], bufsize)
2532 return (bytes(buf[:result[0]]),) + result[1:]
2533
2534
2535class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2536 # Defines flags to be checked in msg_flags for datagram sockets.
2537
2538 @property
2539 def msg_flags_non_eor_indicator(self):
2540 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2541
2542
2543class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2544 # Defines flags to be checked in msg_flags for SCTP sockets.
2545
2546 @property
2547 def msg_flags_eor_indicator(self):
2548 return super().msg_flags_eor_indicator | socket.MSG_EOR
2549
2550
2551class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2552 # Base class for tests on connectionless-mode sockets. Users must
2553 # supply sockets on attributes cli and serv to be mapped to
2554 # cli_sock and serv_sock respectively.
2555
2556 @property
2557 def serv_sock(self):
2558 return self.serv
2559
2560 @property
2561 def cli_sock(self):
2562 return self.cli
2563
2564 @property
2565 def sendmsg_to_server_defaults(self):
2566 return ([], [], 0, self.serv_addr)
2567
2568 def sendToServer(self, msg):
2569 return self.cli_sock.sendto(msg, self.serv_addr)
2570
2571
2572class SendrecvmsgConnectedBase(SendrecvmsgBase):
2573 # Base class for tests on connected sockets. Users must supply
2574 # sockets on attributes serv_conn and cli_conn (representing the
2575 # connections *to* the server and the client), to be mapped to
2576 # cli_sock and serv_sock respectively.
2577
2578 @property
2579 def serv_sock(self):
2580 return self.cli_conn
2581
2582 @property
2583 def cli_sock(self):
2584 return self.serv_conn
2585
2586 def checkRecvmsgAddress(self, addr1, addr2):
2587 # Address is currently "unspecified" for a connected socket,
2588 # so we don't examine it
2589 pass
2590
2591
2592class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2593 # Base class to set a timeout on server's socket.
2594
2595 def setUp(self):
2596 super().setUp()
2597 self.serv_sock.settimeout(self.fail_timeout)
2598
2599
2600class SendmsgTests(SendrecvmsgServerTimeoutBase):
2601 # Tests for sendmsg() which can use any socket type and do not
2602 # involve recvmsg() or recvmsg_into().
2603
2604 def testSendmsg(self):
2605 # Send a simple message with sendmsg().
2606 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2607
2608 def _testSendmsg(self):
2609 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2610
2611 def testSendmsgDataGenerator(self):
2612 # Send from buffer obtained from a generator (not a sequence).
2613 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2614
2615 def _testSendmsgDataGenerator(self):
2616 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2617 len(MSG))
2618
2619 def testSendmsgAncillaryGenerator(self):
2620 # Gather (empty) ancillary data from a generator.
2621 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2622
2623 def _testSendmsgAncillaryGenerator(self):
2624 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2625 len(MSG))
2626
2627 def testSendmsgArray(self):
2628 # Send data from an array instead of the usual bytes object.
2629 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2630
2631 def _testSendmsgArray(self):
2632 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2633 len(MSG))
2634
2635 def testSendmsgGather(self):
2636 # Send message data from more than one buffer (gather write).
2637 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2638
2639 def _testSendmsgGather(self):
2640 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2641
2642 def testSendmsgBadArgs(self):
2643 # Check that sendmsg() rejects invalid arguments.
2644 self.assertEqual(self.serv_sock.recv(1000), b"done")
2645
2646 def _testSendmsgBadArgs(self):
2647 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2648 self.assertRaises(TypeError, self.sendmsgToServer,
2649 b"not in an iterable")
2650 self.assertRaises(TypeError, self.sendmsgToServer,
2651 object())
2652 self.assertRaises(TypeError, self.sendmsgToServer,
2653 [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], [], object())
2660 self.assertRaises(TypeError, self.sendmsgToServer,
2661 [MSG], [], 0, object())
2662 self.sendToServer(b"done")
2663
2664 def testSendmsgBadCmsg(self):
2665 # Check that invalid ancillary data items are rejected.
2666 self.assertEqual(self.serv_sock.recv(1000), b"done")
2667
2668 def _testSendmsgBadCmsg(self):
2669 self.assertRaises(TypeError, self.sendmsgToServer,
2670 [MSG], [object()])
2671 self.assertRaises(TypeError, self.sendmsgToServer,
2672 [MSG], [(object(), 0, b"data")])
2673 self.assertRaises(TypeError, self.sendmsgToServer,
2674 [MSG], [(0, object(), b"data")])
2675 self.assertRaises(TypeError, self.sendmsgToServer,
2676 [MSG], [(0, 0, object())])
2677 self.assertRaises(TypeError, self.sendmsgToServer,
2678 [MSG], [(0, 0)])
2679 self.assertRaises(TypeError, self.sendmsgToServer,
2680 [MSG], [(0, 0, b"data", 42)])
2681 self.sendToServer(b"done")
2682
2683 @requireAttrs(socket, "CMSG_SPACE")
2684 def testSendmsgBadMultiCmsg(self):
2685 # Check that invalid ancillary data items are rejected when
2686 # more than one item is present.
2687 self.assertEqual(self.serv_sock.recv(1000), b"done")
2688
2689 @testSendmsgBadMultiCmsg.client_skip
2690 def _testSendmsgBadMultiCmsg(self):
2691 self.assertRaises(TypeError, self.sendmsgToServer,
2692 [MSG], [0, 0, b""])
2693 self.assertRaises(TypeError, self.sendmsgToServer,
2694 [MSG], [(0, 0, b""), object()])
2695 self.sendToServer(b"done")
2696
2697 def testSendmsgExcessCmsgReject(self):
2698 # Check that sendmsg() rejects excess ancillary data items
2699 # when the number that can be sent is limited.
2700 self.assertEqual(self.serv_sock.recv(1000), b"done")
2701
2702 def _testSendmsgExcessCmsgReject(self):
2703 if not hasattr(socket, "CMSG_SPACE"):
2704 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002705 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002706 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2707 self.assertIsNone(cm.exception.errno)
2708 self.sendToServer(b"done")
2709
2710 def testSendmsgAfterClose(self):
2711 # Check that sendmsg() fails on a closed socket.
2712 pass
2713
2714 def _testSendmsgAfterClose(self):
2715 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002716 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002717
2718
2719class SendmsgStreamTests(SendmsgTests):
2720 # Tests for sendmsg() which require a stream socket and do not
2721 # involve recvmsg() or recvmsg_into().
2722
2723 def testSendmsgExplicitNoneAddr(self):
2724 # Check that peer address can be specified as None.
2725 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2726
2727 def _testSendmsgExplicitNoneAddr(self):
2728 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2729
2730 def testSendmsgTimeout(self):
2731 # Check that timeout works with sendmsg().
2732 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2733 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2734
2735 def _testSendmsgTimeout(self):
2736 try:
2737 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002738 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002739 while True:
2740 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002741 except socket.timeout:
2742 pass
2743 except OSError as exc:
2744 if exc.errno != errno.ENOMEM:
2745 raise
2746 # bpo-33937 the test randomly fails on Travis CI with
2747 # "OSError: [Errno 12] Cannot allocate memory"
2748 else:
2749 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002750 finally:
2751 self.misc_event.set()
2752
2753 # XXX: would be nice to have more tests for sendmsg flags argument.
2754
2755 # Linux supports MSG_DONTWAIT when sending, but in general, it
2756 # only works when receiving. Could add other platforms if they
2757 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002758 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002759 "MSG_DONTWAIT not known to work on this platform when "
2760 "sending")
2761 def testSendmsgDontWait(self):
2762 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2763 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2764 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2765
2766 @testSendmsgDontWait.client_skip
2767 def _testSendmsgDontWait(self):
2768 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002769 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002770 while True:
2771 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002772 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2773 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002774 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002775 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002776 finally:
2777 self.misc_event.set()
2778
2779
2780class SendmsgConnectionlessTests(SendmsgTests):
2781 # Tests for sendmsg() which require a connectionless-mode
2782 # (e.g. datagram) socket, and do not involve recvmsg() or
2783 # recvmsg_into().
2784
2785 def testSendmsgNoDestAddr(self):
2786 # Check that sendmsg() fails when no destination address is
2787 # given for unconnected socket.
2788 pass
2789
2790 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002791 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002792 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002793 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002794 [MSG], [], 0, None)
2795
2796
2797class RecvmsgGenericTests(SendrecvmsgBase):
2798 # Tests for recvmsg() which can also be emulated using
2799 # recvmsg_into(), and can use any socket type.
2800
2801 def testRecvmsg(self):
2802 # Receive a simple message with recvmsg[_into]().
2803 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2804 self.assertEqual(msg, MSG)
2805 self.checkRecvmsgAddress(addr, self.cli_addr)
2806 self.assertEqual(ancdata, [])
2807 self.checkFlags(flags, eor=True)
2808
2809 def _testRecvmsg(self):
2810 self.sendToServer(MSG)
2811
2812 def testRecvmsgExplicitDefaults(self):
2813 # Test recvmsg[_into]() with default arguments provided explicitly.
2814 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2815 len(MSG), 0, 0)
2816 self.assertEqual(msg, MSG)
2817 self.checkRecvmsgAddress(addr, self.cli_addr)
2818 self.assertEqual(ancdata, [])
2819 self.checkFlags(flags, eor=True)
2820
2821 def _testRecvmsgExplicitDefaults(self):
2822 self.sendToServer(MSG)
2823
2824 def testRecvmsgShorter(self):
2825 # Receive a message smaller than buffer.
2826 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2827 len(MSG) + 42)
2828 self.assertEqual(msg, MSG)
2829 self.checkRecvmsgAddress(addr, self.cli_addr)
2830 self.assertEqual(ancdata, [])
2831 self.checkFlags(flags, eor=True)
2832
2833 def _testRecvmsgShorter(self):
2834 self.sendToServer(MSG)
2835
2836 def testRecvmsgTrunc(self):
2837 # Receive part of message, check for truncation indicators.
2838 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2839 len(MSG) - 3)
2840 self.assertEqual(msg, MSG[:-3])
2841 self.checkRecvmsgAddress(addr, self.cli_addr)
2842 self.assertEqual(ancdata, [])
2843 self.checkFlags(flags, eor=False)
2844
2845 def _testRecvmsgTrunc(self):
2846 self.sendToServer(MSG)
2847
2848 def testRecvmsgShortAncillaryBuf(self):
2849 # Test ancillary data buffer too small to hold any ancillary data.
2850 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2851 len(MSG), 1)
2852 self.assertEqual(msg, MSG)
2853 self.checkRecvmsgAddress(addr, self.cli_addr)
2854 self.assertEqual(ancdata, [])
2855 self.checkFlags(flags, eor=True)
2856
2857 def _testRecvmsgShortAncillaryBuf(self):
2858 self.sendToServer(MSG)
2859
2860 def testRecvmsgLongAncillaryBuf(self):
2861 # Test large ancillary data buffer.
2862 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2863 len(MSG), 10240)
2864 self.assertEqual(msg, MSG)
2865 self.checkRecvmsgAddress(addr, self.cli_addr)
2866 self.assertEqual(ancdata, [])
2867 self.checkFlags(flags, eor=True)
2868
2869 def _testRecvmsgLongAncillaryBuf(self):
2870 self.sendToServer(MSG)
2871
2872 def testRecvmsgAfterClose(self):
2873 # Check that recvmsg[_into]() fails on a closed socket.
2874 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002875 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002876
2877 def _testRecvmsgAfterClose(self):
2878 pass
2879
2880 def testRecvmsgTimeout(self):
2881 # Check that timeout works.
2882 try:
2883 self.serv_sock.settimeout(0.03)
2884 self.assertRaises(socket.timeout,
2885 self.doRecvmsg, self.serv_sock, len(MSG))
2886 finally:
2887 self.misc_event.set()
2888
2889 def _testRecvmsgTimeout(self):
2890 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2891
2892 @requireAttrs(socket, "MSG_PEEK")
2893 def testRecvmsgPeek(self):
2894 # Check that MSG_PEEK in flags enables examination of pending
2895 # data without consuming it.
2896
2897 # Receive part of data with MSG_PEEK.
2898 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2899 len(MSG) - 3, 0,
2900 socket.MSG_PEEK)
2901 self.assertEqual(msg, MSG[:-3])
2902 self.checkRecvmsgAddress(addr, self.cli_addr)
2903 self.assertEqual(ancdata, [])
2904 # Ignoring MSG_TRUNC here (so this test is the same for stream
2905 # and datagram sockets). Some wording in POSIX seems to
2906 # suggest that it needn't be set when peeking, but that may
2907 # just be a slip.
2908 self.checkFlags(flags, eor=False,
2909 ignore=getattr(socket, "MSG_TRUNC", 0))
2910
2911 # Receive all data with MSG_PEEK.
2912 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2913 len(MSG), 0,
2914 socket.MSG_PEEK)
2915 self.assertEqual(msg, MSG)
2916 self.checkRecvmsgAddress(addr, self.cli_addr)
2917 self.assertEqual(ancdata, [])
2918 self.checkFlags(flags, eor=True)
2919
2920 # Check that the same data can still be received normally.
2921 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2922 self.assertEqual(msg, MSG)
2923 self.checkRecvmsgAddress(addr, self.cli_addr)
2924 self.assertEqual(ancdata, [])
2925 self.checkFlags(flags, eor=True)
2926
2927 @testRecvmsgPeek.client_skip
2928 def _testRecvmsgPeek(self):
2929 self.sendToServer(MSG)
2930
2931 @requireAttrs(socket.socket, "sendmsg")
2932 def testRecvmsgFromSendmsg(self):
2933 # Test receiving with recvmsg[_into]() when message is sent
2934 # using sendmsg().
2935 self.serv_sock.settimeout(self.fail_timeout)
2936 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2937 self.assertEqual(msg, MSG)
2938 self.checkRecvmsgAddress(addr, self.cli_addr)
2939 self.assertEqual(ancdata, [])
2940 self.checkFlags(flags, eor=True)
2941
2942 @testRecvmsgFromSendmsg.client_skip
2943 def _testRecvmsgFromSendmsg(self):
2944 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2945
2946
2947class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2948 # Tests which require a stream socket and can use either recvmsg()
2949 # or recvmsg_into().
2950
2951 def testRecvmsgEOF(self):
2952 # Receive end-of-stream indicator (b"", peer socket closed).
2953 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2954 self.assertEqual(msg, b"")
2955 self.checkRecvmsgAddress(addr, self.cli_addr)
2956 self.assertEqual(ancdata, [])
2957 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2958
2959 def _testRecvmsgEOF(self):
2960 self.cli_sock.close()
2961
2962 def testRecvmsgOverflow(self):
2963 # Receive a message in more than one chunk.
2964 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2965 len(MSG) - 3)
2966 self.checkRecvmsgAddress(addr, self.cli_addr)
2967 self.assertEqual(ancdata, [])
2968 self.checkFlags(flags, eor=False)
2969
2970 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2971 self.checkRecvmsgAddress(addr, self.cli_addr)
2972 self.assertEqual(ancdata, [])
2973 self.checkFlags(flags, eor=True)
2974
2975 msg = seg1 + seg2
2976 self.assertEqual(msg, MSG)
2977
2978 def _testRecvmsgOverflow(self):
2979 self.sendToServer(MSG)
2980
2981
2982class RecvmsgTests(RecvmsgGenericTests):
2983 # Tests for recvmsg() which can use any socket type.
2984
2985 def testRecvmsgBadArgs(self):
2986 # Check that recvmsg() rejects invalid arguments.
2987 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2988 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2989 -1, 0, 0)
2990 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2991 len(MSG), -1, 0)
2992 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2993 [bytearray(10)], 0, 0)
2994 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2995 object(), 0, 0)
2996 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2997 len(MSG), object(), 0)
2998 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2999 len(MSG), 0, object())
3000
3001 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
3002 self.assertEqual(msg, MSG)
3003 self.checkRecvmsgAddress(addr, self.cli_addr)
3004 self.assertEqual(ancdata, [])
3005 self.checkFlags(flags, eor=True)
3006
3007 def _testRecvmsgBadArgs(self):
3008 self.sendToServer(MSG)
3009
3010
3011class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
3012 # Tests for recvmsg_into() which can use any socket type.
3013
3014 def testRecvmsgIntoBadArgs(self):
3015 # Check that recvmsg_into() rejects invalid arguments.
3016 buf = bytearray(len(MSG))
3017 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3018 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3019 len(MSG), 0, 0)
3020 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3021 buf, 0, 0)
3022 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3023 [object()], 0, 0)
3024 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3025 [b"I'm not writable"], 0, 0)
3026 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3027 [buf, object()], 0, 0)
3028 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3029 [buf], -1, 0)
3030 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3031 [buf], object(), 0)
3032 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3033 [buf], 0, object())
3034
3035 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3036 self.assertEqual(nbytes, len(MSG))
3037 self.assertEqual(buf, bytearray(MSG))
3038 self.checkRecvmsgAddress(addr, self.cli_addr)
3039 self.assertEqual(ancdata, [])
3040 self.checkFlags(flags, eor=True)
3041
3042 def _testRecvmsgIntoBadArgs(self):
3043 self.sendToServer(MSG)
3044
3045 def testRecvmsgIntoGenerator(self):
3046 # Receive into buffer obtained from a generator (not a sequence).
3047 buf = bytearray(len(MSG))
3048 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3049 (o for o in [buf]))
3050 self.assertEqual(nbytes, len(MSG))
3051 self.assertEqual(buf, bytearray(MSG))
3052 self.checkRecvmsgAddress(addr, self.cli_addr)
3053 self.assertEqual(ancdata, [])
3054 self.checkFlags(flags, eor=True)
3055
3056 def _testRecvmsgIntoGenerator(self):
3057 self.sendToServer(MSG)
3058
3059 def testRecvmsgIntoArray(self):
3060 # Receive into an array rather than the usual bytearray.
3061 buf = array.array("B", [0] * len(MSG))
3062 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3063 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003064 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003065 self.checkRecvmsgAddress(addr, self.cli_addr)
3066 self.assertEqual(ancdata, [])
3067 self.checkFlags(flags, eor=True)
3068
3069 def _testRecvmsgIntoArray(self):
3070 self.sendToServer(MSG)
3071
3072 def testRecvmsgIntoScatter(self):
3073 # Receive into multiple buffers (scatter write).
3074 b1 = bytearray(b"----")
3075 b2 = bytearray(b"0123456789")
3076 b3 = bytearray(b"--------------")
3077 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3078 [b1, memoryview(b2)[2:9], b3])
3079 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3080 self.assertEqual(b1, bytearray(b"Mary"))
3081 self.assertEqual(b2, bytearray(b"01 had a 9"))
3082 self.assertEqual(b3, bytearray(b"little lamb---"))
3083 self.checkRecvmsgAddress(addr, self.cli_addr)
3084 self.assertEqual(ancdata, [])
3085 self.checkFlags(flags, eor=True)
3086
3087 def _testRecvmsgIntoScatter(self):
3088 self.sendToServer(b"Mary had a little lamb")
3089
3090
3091class CmsgMacroTests(unittest.TestCase):
3092 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3093 # assumptions used by sendmsg() and recvmsg[_into](), which share
3094 # code with these functions.
3095
3096 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003097 try:
3098 import _testcapi
3099 except ImportError:
3100 socklen_t_limit = 0x7fffffff
3101 else:
3102 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003103
3104 @requireAttrs(socket, "CMSG_LEN")
3105 def testCMSG_LEN(self):
3106 # Test CMSG_LEN() with various valid and invalid values,
3107 # checking the assumptions used by recvmsg() and sendmsg().
3108 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3109 values = list(range(257)) + list(range(toobig - 257, toobig))
3110
3111 # struct cmsghdr has at least three members, two of which are ints
3112 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3113 for n in values:
3114 ret = socket.CMSG_LEN(n)
3115 # This is how recvmsg() calculates the data size
3116 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3117 self.assertLessEqual(ret, self.socklen_t_limit)
3118
3119 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3120 # sendmsg() shares code with these functions, and requires
3121 # that it reject values over the limit.
3122 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3123 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3124
3125 @requireAttrs(socket, "CMSG_SPACE")
3126 def testCMSG_SPACE(self):
3127 # Test CMSG_SPACE() with various valid and invalid values,
3128 # checking the assumptions used by sendmsg().
3129 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3130 values = list(range(257)) + list(range(toobig - 257, toobig))
3131
3132 last = socket.CMSG_SPACE(0)
3133 # struct cmsghdr has at least three members, two of which are ints
3134 self.assertGreater(last, array.array("i").itemsize * 2)
3135 for n in values:
3136 ret = socket.CMSG_SPACE(n)
3137 self.assertGreaterEqual(ret, last)
3138 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3139 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3140 self.assertLessEqual(ret, self.socklen_t_limit)
3141 last = ret
3142
3143 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3144 # sendmsg() shares code with these functions, and requires
3145 # that it reject values over the limit.
3146 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3147 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3148
3149
3150class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3151 # Tests for file descriptor passing on Unix-domain sockets.
3152
3153 # Invalid file descriptor value that's unlikely to evaluate to a
3154 # real FD even if one of its bytes is replaced with a different
3155 # value (which shouldn't actually happen).
3156 badfd = -0x5555
3157
3158 def newFDs(self, n):
3159 # Return a list of n file descriptors for newly-created files
3160 # containing their list indices as ASCII numbers.
3161 fds = []
3162 for i in range(n):
3163 fd, path = tempfile.mkstemp()
3164 self.addCleanup(os.unlink, path)
3165 self.addCleanup(os.close, fd)
3166 os.write(fd, str(i).encode())
3167 fds.append(fd)
3168 return fds
3169
3170 def checkFDs(self, fds):
3171 # Check that the file descriptors in the given list contain
3172 # their correct list indices as ASCII numbers.
3173 for n, fd in enumerate(fds):
3174 os.lseek(fd, 0, os.SEEK_SET)
3175 self.assertEqual(os.read(fd, 1024), str(n).encode())
3176
3177 def registerRecvmsgResult(self, result):
3178 self.addCleanup(self.closeRecvmsgFDs, result)
3179
3180 def closeRecvmsgFDs(self, recvmsg_result):
3181 # Close all file descriptors specified in the ancillary data
3182 # of the given return value from recvmsg() or recvmsg_into().
3183 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3184 if (cmsg_level == socket.SOL_SOCKET and
3185 cmsg_type == socket.SCM_RIGHTS):
3186 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003187 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003188 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3189 for fd in fds:
3190 os.close(fd)
3191
3192 def createAndSendFDs(self, n):
3193 # Send n new file descriptors created by newFDs() to the
3194 # server, with the constant MSG as the non-ancillary data.
3195 self.assertEqual(
3196 self.sendmsgToServer([MSG],
3197 [(socket.SOL_SOCKET,
3198 socket.SCM_RIGHTS,
3199 array.array("i", self.newFDs(n)))]),
3200 len(MSG))
3201
3202 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3203 # Check that constant MSG was received with numfds file
3204 # descriptors in a maximum of maxcmsgs control messages (which
3205 # must contain only complete integers). By default, check
3206 # that MSG_CTRUNC is unset, but ignore any flags in
3207 # ignoreflags.
3208 msg, ancdata, flags, addr = result
3209 self.assertEqual(msg, MSG)
3210 self.checkRecvmsgAddress(addr, self.cli_addr)
3211 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3212 ignore=ignoreflags)
3213
3214 self.assertIsInstance(ancdata, list)
3215 self.assertLessEqual(len(ancdata), maxcmsgs)
3216 fds = array.array("i")
3217 for item in ancdata:
3218 self.assertIsInstance(item, tuple)
3219 cmsg_level, cmsg_type, cmsg_data = item
3220 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3221 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3222 self.assertIsInstance(cmsg_data, bytes)
3223 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003224 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003225
3226 self.assertEqual(len(fds), numfds)
3227 self.checkFDs(fds)
3228
3229 def testFDPassSimple(self):
3230 # Pass a single FD (array read from bytes object).
3231 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3232 len(MSG), 10240))
3233
3234 def _testFDPassSimple(self):
3235 self.assertEqual(
3236 self.sendmsgToServer(
3237 [MSG],
3238 [(socket.SOL_SOCKET,
3239 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003240 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003241 len(MSG))
3242
3243 def testMultipleFDPass(self):
3244 # Pass multiple FDs in a single array.
3245 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3246 len(MSG), 10240))
3247
3248 def _testMultipleFDPass(self):
3249 self.createAndSendFDs(4)
3250
3251 @requireAttrs(socket, "CMSG_SPACE")
3252 def testFDPassCMSG_SPACE(self):
3253 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3254 self.checkRecvmsgFDs(
3255 4, self.doRecvmsg(self.serv_sock, len(MSG),
3256 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3257
3258 @testFDPassCMSG_SPACE.client_skip
3259 def _testFDPassCMSG_SPACE(self):
3260 self.createAndSendFDs(4)
3261
3262 def testFDPassCMSG_LEN(self):
3263 # Test using CMSG_LEN() to calculate ancillary buffer size.
3264 self.checkRecvmsgFDs(1,
3265 self.doRecvmsg(self.serv_sock, len(MSG),
3266 socket.CMSG_LEN(4 * SIZEOF_INT)),
3267 # RFC 3542 says implementations may set
3268 # MSG_CTRUNC if there isn't enough space
3269 # for trailing padding.
3270 ignoreflags=socket.MSG_CTRUNC)
3271
3272 def _testFDPassCMSG_LEN(self):
3273 self.createAndSendFDs(1)
3274
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003275 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003276 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277 @requireAttrs(socket, "CMSG_SPACE")
3278 def testFDPassSeparate(self):
3279 # Pass two FDs in two separate arrays. Arrays may be combined
3280 # into a single control message by the OS.
3281 self.checkRecvmsgFDs(2,
3282 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3283 maxcmsgs=2)
3284
3285 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003286 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003287 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003288 def _testFDPassSeparate(self):
3289 fd0, fd1 = self.newFDs(2)
3290 self.assertEqual(
3291 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3292 socket.SCM_RIGHTS,
3293 array.array("i", [fd0])),
3294 (socket.SOL_SOCKET,
3295 socket.SCM_RIGHTS,
3296 array.array("i", [fd1]))]),
3297 len(MSG))
3298
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003299 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003300 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003301 @requireAttrs(socket, "CMSG_SPACE")
3302 def testFDPassSeparateMinSpace(self):
3303 # Pass two FDs in two separate arrays, receiving them into the
3304 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003305 num_fds = 2
3306 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003307 self.doRecvmsg(self.serv_sock, len(MSG),
3308 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003309 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003310 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3311
3312 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003313 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003314 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003315 def _testFDPassSeparateMinSpace(self):
3316 fd0, fd1 = self.newFDs(2)
3317 self.assertEqual(
3318 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3319 socket.SCM_RIGHTS,
3320 array.array("i", [fd0])),
3321 (socket.SOL_SOCKET,
3322 socket.SCM_RIGHTS,
3323 array.array("i", [fd1]))]),
3324 len(MSG))
3325
3326 def sendAncillaryIfPossible(self, msg, ancdata):
3327 # Try to send msg and ancdata to server, but if the system
3328 # call fails, just send msg with no ancillary data.
3329 try:
3330 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003331 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003332 # Check that it was the system call that failed
3333 self.assertIsInstance(e.errno, int)
3334 nbytes = self.sendmsgToServer([msg])
3335 self.assertEqual(nbytes, len(msg))
3336
Brett Cannon3bbad122015-12-28 17:21:44 -08003337 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003338 def testFDPassEmpty(self):
3339 # Try to pass an empty FD array. Can receive either no array
3340 # or an empty array.
3341 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3342 len(MSG), 10240),
3343 ignoreflags=socket.MSG_CTRUNC)
3344
3345 def _testFDPassEmpty(self):
3346 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3347 socket.SCM_RIGHTS,
3348 b"")])
3349
3350 def testFDPassPartialInt(self):
3351 # Try to pass a truncated FD array.
3352 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3353 len(MSG), 10240)
3354 self.assertEqual(msg, MSG)
3355 self.checkRecvmsgAddress(addr, self.cli_addr)
3356 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3357 self.assertLessEqual(len(ancdata), 1)
3358 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3359 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3360 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3361 self.assertLess(len(cmsg_data), SIZEOF_INT)
3362
3363 def _testFDPassPartialInt(self):
3364 self.sendAncillaryIfPossible(
3365 MSG,
3366 [(socket.SOL_SOCKET,
3367 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003368 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003369
3370 @requireAttrs(socket, "CMSG_SPACE")
3371 def testFDPassPartialIntInMiddle(self):
3372 # Try to pass two FD arrays, the first of which is truncated.
3373 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3374 len(MSG), 10240)
3375 self.assertEqual(msg, MSG)
3376 self.checkRecvmsgAddress(addr, self.cli_addr)
3377 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3378 self.assertLessEqual(len(ancdata), 2)
3379 fds = array.array("i")
3380 # Arrays may have been combined in a single control message
3381 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3382 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3383 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003384 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003385 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3386 self.assertLessEqual(len(fds), 2)
3387 self.checkFDs(fds)
3388
3389 @testFDPassPartialIntInMiddle.client_skip
3390 def _testFDPassPartialIntInMiddle(self):
3391 fd0, fd1 = self.newFDs(2)
3392 self.sendAncillaryIfPossible(
3393 MSG,
3394 [(socket.SOL_SOCKET,
3395 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003396 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003397 (socket.SOL_SOCKET,
3398 socket.SCM_RIGHTS,
3399 array.array("i", [fd1]))])
3400
3401 def checkTruncatedHeader(self, result, ignoreflags=0):
3402 # Check that no ancillary data items are returned when data is
3403 # truncated inside the cmsghdr structure.
3404 msg, ancdata, flags, addr = result
3405 self.assertEqual(msg, MSG)
3406 self.checkRecvmsgAddress(addr, self.cli_addr)
3407 self.assertEqual(ancdata, [])
3408 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3409 ignore=ignoreflags)
3410
3411 def testCmsgTruncNoBufSize(self):
3412 # Check that no ancillary data is received when no buffer size
3413 # is specified.
3414 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3415 # BSD seems to set MSG_CTRUNC only
3416 # if an item has been partially
3417 # received.
3418 ignoreflags=socket.MSG_CTRUNC)
3419
3420 def _testCmsgTruncNoBufSize(self):
3421 self.createAndSendFDs(1)
3422
3423 def testCmsgTrunc0(self):
3424 # Check that no ancillary data is received when buffer size is 0.
3425 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3426 ignoreflags=socket.MSG_CTRUNC)
3427
3428 def _testCmsgTrunc0(self):
3429 self.createAndSendFDs(1)
3430
3431 # Check that no ancillary data is returned for various non-zero
3432 # (but still too small) buffer sizes.
3433
3434 def testCmsgTrunc1(self):
3435 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3436
3437 def _testCmsgTrunc1(self):
3438 self.createAndSendFDs(1)
3439
3440 def testCmsgTrunc2Int(self):
3441 # The cmsghdr structure has at least three members, two of
3442 # which are ints, so we still shouldn't see any ancillary
3443 # data.
3444 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3445 SIZEOF_INT * 2))
3446
3447 def _testCmsgTrunc2Int(self):
3448 self.createAndSendFDs(1)
3449
3450 def testCmsgTruncLen0Minus1(self):
3451 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3452 socket.CMSG_LEN(0) - 1))
3453
3454 def _testCmsgTruncLen0Minus1(self):
3455 self.createAndSendFDs(1)
3456
3457 # The following tests try to truncate the control message in the
3458 # middle of the FD array.
3459
3460 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3461 # Check that file descriptor data is truncated to between
3462 # mindata and maxdata bytes when received with buffer size
3463 # ancbuf, and that any complete file descriptor numbers are
3464 # valid.
3465 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3466 len(MSG), ancbuf)
3467 self.assertEqual(msg, MSG)
3468 self.checkRecvmsgAddress(addr, self.cli_addr)
3469 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3470
3471 if mindata == 0 and ancdata == []:
3472 return
3473 self.assertEqual(len(ancdata), 1)
3474 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3475 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3476 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3477 self.assertGreaterEqual(len(cmsg_data), mindata)
3478 self.assertLessEqual(len(cmsg_data), maxdata)
3479 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003480 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003481 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3482 self.checkFDs(fds)
3483
3484 def testCmsgTruncLen0(self):
3485 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3486
3487 def _testCmsgTruncLen0(self):
3488 self.createAndSendFDs(1)
3489
3490 def testCmsgTruncLen0Plus1(self):
3491 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3492
3493 def _testCmsgTruncLen0Plus1(self):
3494 self.createAndSendFDs(2)
3495
3496 def testCmsgTruncLen1(self):
3497 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3498 maxdata=SIZEOF_INT)
3499
3500 def _testCmsgTruncLen1(self):
3501 self.createAndSendFDs(2)
3502
3503 def testCmsgTruncLen2Minus1(self):
3504 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3505 maxdata=(2 * SIZEOF_INT) - 1)
3506
3507 def _testCmsgTruncLen2Minus1(self):
3508 self.createAndSendFDs(2)
3509
3510
3511class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3512 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3513 # features of the RFC 3542 Advanced Sockets API for IPv6.
3514 # Currently we can only handle certain data items (e.g. traffic
3515 # class, hop limit, MTU discovery and fragmentation settings)
3516 # without resorting to unportable means such as the struct module,
3517 # but the tests here are aimed at testing the ancillary data
3518 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3519 # itself.
3520
3521 # Test value to use when setting hop limit of packet
3522 hop_limit = 2
3523
3524 # Test value to use when setting traffic class of packet.
3525 # -1 means "use kernel default".
3526 traffic_class = -1
3527
3528 def ancillaryMapping(self, ancdata):
3529 # Given ancillary data list ancdata, return a mapping from
3530 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3531 # Check that no (level, type) pair appears more than once.
3532 d = {}
3533 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3534 self.assertNotIn((cmsg_level, cmsg_type), d)
3535 d[(cmsg_level, cmsg_type)] = cmsg_data
3536 return d
3537
3538 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3539 # Receive hop limit into ancbufsize bytes of ancillary data
3540 # space. Check that data is MSG, ancillary data is not
3541 # truncated (but ignore any flags in ignoreflags), and hop
3542 # limit is between 0 and maxhop inclusive.
3543 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3544 socket.IPV6_RECVHOPLIMIT, 1)
3545 self.misc_event.set()
3546 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3547 len(MSG), ancbufsize)
3548
3549 self.assertEqual(msg, MSG)
3550 self.checkRecvmsgAddress(addr, self.cli_addr)
3551 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3552 ignore=ignoreflags)
3553
3554 self.assertEqual(len(ancdata), 1)
3555 self.assertIsInstance(ancdata[0], tuple)
3556 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3557 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3558 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3559 self.assertIsInstance(cmsg_data, bytes)
3560 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3561 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003562 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003563 self.assertGreaterEqual(a[0], 0)
3564 self.assertLessEqual(a[0], maxhop)
3565
3566 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3567 def testRecvHopLimit(self):
3568 # Test receiving the packet hop limit as ancillary data.
3569 self.checkHopLimit(ancbufsize=10240)
3570
3571 @testRecvHopLimit.client_skip
3572 def _testRecvHopLimit(self):
3573 # Need to wait until server has asked to receive ancillary
3574 # data, as implementations are not required to buffer it
3575 # otherwise.
3576 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3577 self.sendToServer(MSG)
3578
3579 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3580 def testRecvHopLimitCMSG_SPACE(self):
3581 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3582 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3583
3584 @testRecvHopLimitCMSG_SPACE.client_skip
3585 def _testRecvHopLimitCMSG_SPACE(self):
3586 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3587 self.sendToServer(MSG)
3588
3589 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3590 # 3542 says portable applications must provide space for trailing
3591 # padding. Implementations may set MSG_CTRUNC if there isn't
3592 # enough space for the padding.
3593
3594 @requireAttrs(socket.socket, "sendmsg")
3595 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3596 def testSetHopLimit(self):
3597 # Test setting hop limit on outgoing packet and receiving it
3598 # at the other end.
3599 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3600
3601 @testSetHopLimit.client_skip
3602 def _testSetHopLimit(self):
3603 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3604 self.assertEqual(
3605 self.sendmsgToServer([MSG],
3606 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3607 array.array("i", [self.hop_limit]))]),
3608 len(MSG))
3609
3610 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3611 ignoreflags=0):
3612 # Receive traffic class and hop limit into ancbufsize bytes of
3613 # ancillary data space. Check that data is MSG, ancillary
3614 # data is not truncated (but ignore any flags in ignoreflags),
3615 # and traffic class and hop limit are in range (hop limit no
3616 # more than maxhop).
3617 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3618 socket.IPV6_RECVHOPLIMIT, 1)
3619 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3620 socket.IPV6_RECVTCLASS, 1)
3621 self.misc_event.set()
3622 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3623 len(MSG), ancbufsize)
3624
3625 self.assertEqual(msg, MSG)
3626 self.checkRecvmsgAddress(addr, self.cli_addr)
3627 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3628 ignore=ignoreflags)
3629 self.assertEqual(len(ancdata), 2)
3630 ancmap = self.ancillaryMapping(ancdata)
3631
3632 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3633 self.assertEqual(len(tcdata), SIZEOF_INT)
3634 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003635 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003636 self.assertGreaterEqual(a[0], 0)
3637 self.assertLessEqual(a[0], 255)
3638
3639 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3640 self.assertEqual(len(hldata), SIZEOF_INT)
3641 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003642 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003643 self.assertGreaterEqual(a[0], 0)
3644 self.assertLessEqual(a[0], maxhop)
3645
3646 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3647 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3648 def testRecvTrafficClassAndHopLimit(self):
3649 # Test receiving traffic class and hop limit as ancillary data.
3650 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3651
3652 @testRecvTrafficClassAndHopLimit.client_skip
3653 def _testRecvTrafficClassAndHopLimit(self):
3654 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3655 self.sendToServer(MSG)
3656
3657 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3658 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3659 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3660 # Test receiving traffic class and hop limit, using
3661 # CMSG_SPACE() to calculate buffer size.
3662 self.checkTrafficClassAndHopLimit(
3663 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3664
3665 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3666 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3667 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3668 self.sendToServer(MSG)
3669
3670 @requireAttrs(socket.socket, "sendmsg")
3671 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3672 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3673 def testSetTrafficClassAndHopLimit(self):
3674 # Test setting traffic class and hop limit on outgoing packet,
3675 # and receiving them at the other end.
3676 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3677 maxhop=self.hop_limit)
3678
3679 @testSetTrafficClassAndHopLimit.client_skip
3680 def _testSetTrafficClassAndHopLimit(self):
3681 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3682 self.assertEqual(
3683 self.sendmsgToServer([MSG],
3684 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3685 array.array("i", [self.traffic_class])),
3686 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3687 array.array("i", [self.hop_limit]))]),
3688 len(MSG))
3689
3690 @requireAttrs(socket.socket, "sendmsg")
3691 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3692 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3693 def testOddCmsgSize(self):
3694 # Try to send ancillary data with first item one byte too
3695 # long. Fall back to sending with correct size if this fails,
3696 # and check that second item was handled correctly.
3697 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3698 maxhop=self.hop_limit)
3699
3700 @testOddCmsgSize.client_skip
3701 def _testOddCmsgSize(self):
3702 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3703 try:
3704 nbytes = self.sendmsgToServer(
3705 [MSG],
3706 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003707 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3709 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003710 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003711 self.assertIsInstance(e.errno, int)
3712 nbytes = self.sendmsgToServer(
3713 [MSG],
3714 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3715 array.array("i", [self.traffic_class])),
3716 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3717 array.array("i", [self.hop_limit]))])
3718 self.assertEqual(nbytes, len(MSG))
3719
3720 # Tests for proper handling of truncated ancillary data
3721
3722 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3723 # Receive hop limit into ancbufsize bytes of ancillary data
3724 # space, which should be too small to contain the ancillary
3725 # data header (if ancbufsize is None, pass no second argument
3726 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3727 # (unless included in ignoreflags), and no ancillary data is
3728 # returned.
3729 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3730 socket.IPV6_RECVHOPLIMIT, 1)
3731 self.misc_event.set()
3732 args = () if ancbufsize is None else (ancbufsize,)
3733 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3734 len(MSG), *args)
3735
3736 self.assertEqual(msg, MSG)
3737 self.checkRecvmsgAddress(addr, self.cli_addr)
3738 self.assertEqual(ancdata, [])
3739 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3740 ignore=ignoreflags)
3741
3742 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3743 def testCmsgTruncNoBufSize(self):
3744 # Check that no ancillary data is received when no ancillary
3745 # buffer size is provided.
3746 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3747 # BSD seems to set
3748 # MSG_CTRUNC only if an item
3749 # has been partially
3750 # received.
3751 ignoreflags=socket.MSG_CTRUNC)
3752
3753 @testCmsgTruncNoBufSize.client_skip
3754 def _testCmsgTruncNoBufSize(self):
3755 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3756 self.sendToServer(MSG)
3757
3758 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3759 def testSingleCmsgTrunc0(self):
3760 # Check that no ancillary data is received when ancillary
3761 # buffer size is zero.
3762 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3763 ignoreflags=socket.MSG_CTRUNC)
3764
3765 @testSingleCmsgTrunc0.client_skip
3766 def _testSingleCmsgTrunc0(self):
3767 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3768 self.sendToServer(MSG)
3769
3770 # Check that no ancillary data is returned for various non-zero
3771 # (but still too small) buffer sizes.
3772
3773 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3774 def testSingleCmsgTrunc1(self):
3775 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3776
3777 @testSingleCmsgTrunc1.client_skip
3778 def _testSingleCmsgTrunc1(self):
3779 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3780 self.sendToServer(MSG)
3781
3782 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3783 def testSingleCmsgTrunc2Int(self):
3784 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3785
3786 @testSingleCmsgTrunc2Int.client_skip
3787 def _testSingleCmsgTrunc2Int(self):
3788 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3789 self.sendToServer(MSG)
3790
3791 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3792 def testSingleCmsgTruncLen0Minus1(self):
3793 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3794
3795 @testSingleCmsgTruncLen0Minus1.client_skip
3796 def _testSingleCmsgTruncLen0Minus1(self):
3797 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3798 self.sendToServer(MSG)
3799
3800 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3801 def testSingleCmsgTruncInData(self):
3802 # Test truncation of a control message inside its associated
3803 # data. The message may be returned with its data truncated,
3804 # or not returned at all.
3805 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3806 socket.IPV6_RECVHOPLIMIT, 1)
3807 self.misc_event.set()
3808 msg, ancdata, flags, addr = self.doRecvmsg(
3809 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3810
3811 self.assertEqual(msg, MSG)
3812 self.checkRecvmsgAddress(addr, self.cli_addr)
3813 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3814
3815 self.assertLessEqual(len(ancdata), 1)
3816 if ancdata:
3817 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3818 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3819 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3820 self.assertLess(len(cmsg_data), SIZEOF_INT)
3821
3822 @testSingleCmsgTruncInData.client_skip
3823 def _testSingleCmsgTruncInData(self):
3824 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3825 self.sendToServer(MSG)
3826
3827 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3828 # Receive traffic class and hop limit into ancbufsize bytes of
3829 # ancillary data space, which should be large enough to
3830 # contain the first item, but too small to contain the header
3831 # of the second. Check that data is MSG, MSG_CTRUNC is set
3832 # (unless included in ignoreflags), and only one ancillary
3833 # data item is returned.
3834 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3835 socket.IPV6_RECVHOPLIMIT, 1)
3836 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3837 socket.IPV6_RECVTCLASS, 1)
3838 self.misc_event.set()
3839 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3840 len(MSG), ancbufsize)
3841
3842 self.assertEqual(msg, MSG)
3843 self.checkRecvmsgAddress(addr, self.cli_addr)
3844 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3845 ignore=ignoreflags)
3846
3847 self.assertEqual(len(ancdata), 1)
3848 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3849 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3850 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3851 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3852 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003853 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003854 self.assertGreaterEqual(a[0], 0)
3855 self.assertLessEqual(a[0], 255)
3856
3857 # Try the above test with various buffer sizes.
3858
3859 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3860 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3861 def testSecondCmsgTrunc0(self):
3862 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3863 ignoreflags=socket.MSG_CTRUNC)
3864
3865 @testSecondCmsgTrunc0.client_skip
3866 def _testSecondCmsgTrunc0(self):
3867 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3868 self.sendToServer(MSG)
3869
3870 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3871 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3872 def testSecondCmsgTrunc1(self):
3873 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3874
3875 @testSecondCmsgTrunc1.client_skip
3876 def _testSecondCmsgTrunc1(self):
3877 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3878 self.sendToServer(MSG)
3879
3880 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3881 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3882 def testSecondCmsgTrunc2Int(self):
3883 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3884 2 * SIZEOF_INT)
3885
3886 @testSecondCmsgTrunc2Int.client_skip
3887 def _testSecondCmsgTrunc2Int(self):
3888 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3889 self.sendToServer(MSG)
3890
3891 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3892 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3893 def testSecondCmsgTruncLen0Minus1(self):
3894 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3895 socket.CMSG_LEN(0) - 1)
3896
3897 @testSecondCmsgTruncLen0Minus1.client_skip
3898 def _testSecondCmsgTruncLen0Minus1(self):
3899 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3900 self.sendToServer(MSG)
3901
3902 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3903 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3904 def testSecomdCmsgTruncInData(self):
3905 # Test truncation of the second of two control messages inside
3906 # its associated data.
3907 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3908 socket.IPV6_RECVHOPLIMIT, 1)
3909 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3910 socket.IPV6_RECVTCLASS, 1)
3911 self.misc_event.set()
3912 msg, ancdata, flags, addr = self.doRecvmsg(
3913 self.serv_sock, len(MSG),
3914 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3915
3916 self.assertEqual(msg, MSG)
3917 self.checkRecvmsgAddress(addr, self.cli_addr)
3918 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3919
3920 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3921
3922 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3923 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3924 cmsg_types.remove(cmsg_type)
3925 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3926 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003927 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003928 self.assertGreaterEqual(a[0], 0)
3929 self.assertLessEqual(a[0], 255)
3930
3931 if ancdata:
3932 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3933 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3934 cmsg_types.remove(cmsg_type)
3935 self.assertLess(len(cmsg_data), SIZEOF_INT)
3936
3937 self.assertEqual(ancdata, [])
3938
3939 @testSecomdCmsgTruncInData.client_skip
3940 def _testSecomdCmsgTruncInData(self):
3941 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3942 self.sendToServer(MSG)
3943
3944
3945# Derive concrete test classes for different socket types.
3946
3947class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3948 SendrecvmsgConnectionlessBase,
3949 ThreadedSocketTestMixin, UDPTestBase):
3950 pass
3951
3952@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003953class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3954 pass
3955
3956@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003957class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3958 pass
3959
3960@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003961class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3962 pass
3963
3964
3965class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3966 SendrecvmsgConnectionlessBase,
3967 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003968
3969 def checkRecvmsgAddress(self, addr1, addr2):
3970 # Called to compare the received address with the address of
3971 # the peer, ignoring scope ID
3972 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003973
3974@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003975@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3978 pass
3979
3980@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003981@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003982@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003983class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3984 pass
3985
3986@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003987@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003988@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003989class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3990 pass
3991
3992@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003993@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003994@requireAttrs(socket, "IPPROTO_IPV6")
3995@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003996class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3997 SendrecvmsgUDP6TestBase):
3998 pass
3999
4000@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02004001@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004002@requireAttrs(socket, "IPPROTO_IPV6")
4003@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004004class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
4005 RFC3542AncillaryTest,
4006 SendrecvmsgUDP6TestBase):
4007 pass
4008
4009
4010class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
4011 ConnectedStreamTestMixin, TCPTestBase):
4012 pass
4013
4014@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004015class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4016 pass
4017
4018@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004019class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4020 SendrecvmsgTCPTestBase):
4021 pass
4022
4023@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004024class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4025 SendrecvmsgTCPTestBase):
4026 pass
4027
4028
4029class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4030 SendrecvmsgConnectedBase,
4031 ConnectedStreamTestMixin, SCTPStreamBase):
4032 pass
4033
4034@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004035@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004036@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004037class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4038 pass
4039
4040@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004041@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004042@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004043class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4044 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004045
4046 def testRecvmsgEOF(self):
4047 try:
4048 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4049 except OSError as e:
4050 if e.errno != errno.ENOTCONN:
4051 raise
4052 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004053
4054@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004055@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004056@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004057class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4058 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004059
4060 def testRecvmsgEOF(self):
4061 try:
4062 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4063 except OSError as e:
4064 if e.errno != errno.ENOTCONN:
4065 raise
4066 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004067
4068
4069class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4070 ConnectedStreamTestMixin, UnixStreamBase):
4071 pass
4072
4073@requireAttrs(socket.socket, "sendmsg")
4074@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004075class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4076 pass
4077
4078@requireAttrs(socket.socket, "recvmsg")
4079@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004080class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4081 SendrecvmsgUnixStreamTestBase):
4082 pass
4083
4084@requireAttrs(socket.socket, "recvmsg_into")
4085@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004086class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4087 SendrecvmsgUnixStreamTestBase):
4088 pass
4089
4090@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4091@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004092class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4093 pass
4094
4095@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4096@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4098 SendrecvmsgUnixStreamTestBase):
4099 pass
4100
4101
4102# Test interrupting the interruptible send/receive methods with a
4103# signal when a timeout is set. These tests avoid having multiple
4104# threads alive during the test so that the OS cannot deliver the
4105# signal to the wrong one.
4106
4107class InterruptedTimeoutBase(unittest.TestCase):
4108 # Base class for interrupted send/receive tests. Installs an
4109 # empty handler for SIGALRM and removes it on teardown, along with
4110 # any scheduled alarms.
4111
4112 def setUp(self):
4113 super().setUp()
4114 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004115 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004117
4118 # Timeout for socket operations
4119 timeout = 4.0
4120
4121 # Provide setAlarm() method to schedule delivery of SIGALRM after
4122 # given number of seconds, or cancel it if zero, and an
4123 # appropriate time value to use. Use setitimer() if available.
4124 if hasattr(signal, "setitimer"):
4125 alarm_time = 0.05
4126
4127 def setAlarm(self, seconds):
4128 signal.setitimer(signal.ITIMER_REAL, seconds)
4129 else:
4130 # Old systems may deliver the alarm up to one second early
4131 alarm_time = 2
4132
4133 def setAlarm(self, seconds):
4134 signal.alarm(seconds)
4135
4136
4137# Require siginterrupt() in order to ensure that system calls are
4138# interrupted by default.
4139@requireAttrs(signal, "siginterrupt")
4140@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4141 "Don't have signal.alarm or signal.setitimer")
4142class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4143 # Test interrupting the recv*() methods with signals when a
4144 # timeout is set.
4145
4146 def setUp(self):
4147 super().setUp()
4148 self.serv.settimeout(self.timeout)
4149
4150 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004151 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004152 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004153 try:
4154 self.setAlarm(self.alarm_time)
4155 with self.assertRaises(ZeroDivisionError) as cm:
4156 func(*args, **kwargs)
4157 finally:
4158 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004159
4160 def testInterruptedRecvTimeout(self):
4161 self.checkInterruptedRecv(self.serv.recv, 1024)
4162
4163 def testInterruptedRecvIntoTimeout(self):
4164 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4165
4166 def testInterruptedRecvfromTimeout(self):
4167 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4168
4169 def testInterruptedRecvfromIntoTimeout(self):
4170 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4171
4172 @requireAttrs(socket.socket, "recvmsg")
4173 def testInterruptedRecvmsgTimeout(self):
4174 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4175
4176 @requireAttrs(socket.socket, "recvmsg_into")
4177 def testInterruptedRecvmsgIntoTimeout(self):
4178 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4179
4180
4181# Require siginterrupt() in order to ensure that system calls are
4182# interrupted by default.
4183@requireAttrs(signal, "siginterrupt")
4184@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4185 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004186class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4187 ThreadSafeCleanupTestCase,
4188 SocketListeningTestMixin, TCPTestBase):
4189 # Test interrupting the interruptible send*() methods with signals
4190 # when a timeout is set.
4191
4192 def setUp(self):
4193 super().setUp()
4194 self.serv_conn = self.newSocket()
4195 self.addCleanup(self.serv_conn.close)
4196 # Use a thread to complete the connection, but wait for it to
4197 # terminate before running the test, so that there is only one
4198 # thread to accept the signal.
4199 cli_thread = threading.Thread(target=self.doConnect)
4200 cli_thread.start()
4201 self.cli_conn, addr = self.serv.accept()
4202 self.addCleanup(self.cli_conn.close)
4203 cli_thread.join()
4204 self.serv_conn.settimeout(self.timeout)
4205
4206 def doConnect(self):
4207 self.serv_conn.connect(self.serv_addr)
4208
4209 def checkInterruptedSend(self, func, *args, **kwargs):
4210 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004211 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004212 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004213 try:
4214 with self.assertRaises(ZeroDivisionError) as cm:
4215 while True:
4216 self.setAlarm(self.alarm_time)
4217 func(*args, **kwargs)
4218 finally:
4219 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004220
Ned Deilyc5640382014-02-03 13:58:31 -08004221 # Issue #12958: The following tests have problems on OS X prior to 10.7
4222 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004223 def testInterruptedSendTimeout(self):
4224 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4225
Ned Deilyc5640382014-02-03 13:58:31 -08004226 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004227 def testInterruptedSendtoTimeout(self):
4228 # Passing an actual address here as Python's wrapper for
4229 # sendto() doesn't allow passing a zero-length one; POSIX
4230 # requires that the address is ignored since the socket is
4231 # connection-mode, however.
4232 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4233 self.serv_addr)
4234
Ned Deilyc5640382014-02-03 13:58:31 -08004235 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004236 @requireAttrs(socket.socket, "sendmsg")
4237 def testInterruptedSendmsgTimeout(self):
4238 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4239
4240
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004241class TCPCloserTest(ThreadedTCPSocketTest):
4242
4243 def testClose(self):
4244 conn, addr = self.serv.accept()
4245 conn.close()
4246
4247 sd = self.cli
4248 read, write, err = select.select([sd], [], [], 1.0)
4249 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004250 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004251
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004252 # Calling close() many times should be safe.
4253 conn.close()
4254 conn.close()
4255
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004256 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004257 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004258 time.sleep(1.0)
4259
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004260
Dave Cole331708b2004-08-09 04:51:41 +00004261class BasicSocketPairTest(SocketPairTest):
4262
4263 def __init__(self, methodName='runTest'):
4264 SocketPairTest.__init__(self, methodName=methodName)
4265
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004266 def _check_defaults(self, sock):
4267 self.assertIsInstance(sock, socket.socket)
4268 if hasattr(socket, 'AF_UNIX'):
4269 self.assertEqual(sock.family, socket.AF_UNIX)
4270 else:
4271 self.assertEqual(sock.family, socket.AF_INET)
4272 self.assertEqual(sock.type, socket.SOCK_STREAM)
4273 self.assertEqual(sock.proto, 0)
4274
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004275 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004276 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004277
4278 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004279 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004280
Dave Cole331708b2004-08-09 04:51:41 +00004281 def testRecv(self):
4282 msg = self.serv.recv(1024)
4283 self.assertEqual(msg, MSG)
4284
4285 def _testRecv(self):
4286 self.cli.send(MSG)
4287
4288 def testSend(self):
4289 self.serv.send(MSG)
4290
4291 def _testSend(self):
4292 msg = self.cli.recv(1024)
4293 self.assertEqual(msg, MSG)
4294
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004295
Guido van Rossum24e4af82002-06-12 19:18:08 +00004296class NonBlockingTCPTests(ThreadedTCPSocketTest):
4297
4298 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004299 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004300 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4301
Victor Stinner304315d2018-11-30 13:22:44 +01004302 def assert_sock_timeout(self, sock, timeout):
4303 self.assertEqual(self.serv.gettimeout(), timeout)
4304
4305 blocking = (timeout != 0.0)
4306 self.assertEqual(sock.getblocking(), blocking)
4307
4308 if fcntl is not None:
4309 # When a Python socket has a non-zero timeout, it's switched
4310 # internally to a non-blocking mode. Later, sock.sendall(),
4311 # sock.recv(), and other socket operations use a select() call and
4312 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4313 # timeouts are enforced.
4314 fd_blocking = (timeout is None)
4315
4316 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4317 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4318
Guido van Rossum24e4af82002-06-12 19:18:08 +00004319 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004320 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004321 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004322 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004323
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004324 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004325 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004326
4327 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004328 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004329
4330 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004331 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004332
4333 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004334 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004335
4336 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004337 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004338
4339 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004340 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004341
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004342 @support.cpython_only
4343 def testSetBlocking_overflow(self):
4344 # Issue 15989
4345 import _testcapi
4346 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4347 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004348
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004349 self.serv.setblocking(False)
4350 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004351
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004352 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4353 self.assertIsNone(self.serv.gettimeout())
4354
4355 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4356
Serhiy Storchaka43767632013-11-03 21:31:38 +02004357 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4358 'test needs socket.SOCK_NONBLOCK')
4359 @support.requires_linux_version(2, 6, 28)
4360 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004361 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004362 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004363 self.serv = socket.socket(socket.AF_INET,
4364 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4365 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004366
4367 def _testInitNonBlocking(self):
4368 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004369
Victor Stinner304315d2018-11-30 13:22:44 +01004370 def testInheritFlagsBlocking(self):
4371 # bpo-7995: accept() on a listening socket with a timeout and the
4372 # default timeout is None, the resulting socket must be blocking.
4373 with socket_setdefaulttimeout(None):
4374 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004375 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004376 self.addCleanup(conn.close)
4377 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004378
Victor Stinner304315d2018-11-30 13:22:44 +01004379 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004380 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004381
4382 def testInheritFlagsTimeout(self):
4383 # bpo-7995: accept() on a listening socket with a timeout and the
4384 # default timeout is None, the resulting socket must inherit
4385 # the default timeout.
4386 default_timeout = 20.0
4387 with socket_setdefaulttimeout(default_timeout):
4388 self.serv.settimeout(10)
4389 conn, addr = self.serv.accept()
4390 self.addCleanup(conn.close)
4391 self.assertEqual(conn.gettimeout(), default_timeout)
4392
4393 def _testInheritFlagsTimeout(self):
4394 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004395
Guido van Rossum24e4af82002-06-12 19:18:08 +00004396 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004397 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004398 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004399
4400 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004401 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004402 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004403 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004404 dt = time.monotonic() - start_time
4405 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004406
4407 self.event.set()
4408
4409 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4410 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004411 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004412
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004413 # connect() completed: non-blocking accept() doesn't block
4414 conn, addr = self.serv.accept()
4415 self.addCleanup(conn.close)
4416 self.assertIsNone(conn.gettimeout())
4417
Guido van Rossum24e4af82002-06-12 19:18:08 +00004418 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004419 # don't connect before event is set to check
4420 # that non-blocking accept() raises BlockingIOError
4421 self.event.wait()
4422
Christian Heimes5e696852008-04-09 08:37:03 +00004423 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004424
Guido van Rossum24e4af82002-06-12 19:18:08 +00004425 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004426 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004427 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004428 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004429 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004430
4431 # the server didn't send data yet: non-blocking recv() fails
4432 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004433 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004434
4435 self.event.set()
4436
4437 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4438 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004439 self.fail("Error during select call to non-blocking socket.")
4440
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004441 # the server sent data yet: non-blocking recv() doesn't block
4442 msg = conn.recv(len(MSG))
4443 self.assertEqual(msg, MSG)
4444
Guido van Rossum24e4af82002-06-12 19:18:08 +00004445 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004446 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004447
4448 # don't send anything before event is set to check
4449 # that non-blocking recv() raises BlockingIOError
4450 self.event.wait()
4451
4452 # send data: recv() will no longer block
4453 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004454
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004455
Guido van Rossum24e4af82002-06-12 19:18:08 +00004456class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004457 """Unit tests for the object returned by socket.makefile()
4458
Antoine Pitrou834bd812010-10-13 16:17:14 +00004459 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004460 the client connection. You can read from this file to
4461 get output from the server.
4462
Antoine Pitrou834bd812010-10-13 16:17:14 +00004463 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004464 server connection. You can write to this file to send output
4465 to the client.
4466 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004467
Guido van Rossume9f66142002-08-07 15:46:19 +00004468 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004469 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004470 errors = 'strict'
4471 newline = None
4472
4473 read_mode = 'rb'
4474 read_msg = MSG
4475 write_mode = 'wb'
4476 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004477
Guido van Rossum24e4af82002-06-12 19:18:08 +00004478 def __init__(self, methodName='runTest'):
4479 SocketConnectedTest.__init__(self, methodName=methodName)
4480
4481 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004482 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4483 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004484 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004485 self.read_file = self.cli_conn.makefile(
4486 self.read_mode, self.bufsize,
4487 encoding = self.encoding,
4488 errors = self.errors,
4489 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004490
4491 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004492 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004493 self.read_file.close()
4494 self.assertTrue(self.read_file.closed)
4495 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004496 SocketConnectedTest.tearDown(self)
4497
4498 def clientSetUp(self):
4499 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004500 self.write_file = self.serv_conn.makefile(
4501 self.write_mode, self.bufsize,
4502 encoding = self.encoding,
4503 errors = self.errors,
4504 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004505
4506 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004507 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004508 self.write_file.close()
4509 self.assertTrue(self.write_file.closed)
4510 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004511 SocketConnectedTest.clientTearDown(self)
4512
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004513 def testReadAfterTimeout(self):
4514 # Issue #7322: A file object must disallow further reads
4515 # after a timeout has occurred.
4516 self.cli_conn.settimeout(1)
4517 self.read_file.read(3)
4518 # First read raises a timeout
4519 self.assertRaises(socket.timeout, self.read_file.read, 1)
4520 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004521 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004522 self.read_file.read(1)
4523 self.assertIn("cannot read from timed out object", str(ctx.exception))
4524
4525 def _testReadAfterTimeout(self):
4526 self.write_file.write(self.write_msg[0:3])
4527 self.write_file.flush()
4528 self.serv_finished.wait()
4529
Guido van Rossum24e4af82002-06-12 19:18:08 +00004530 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004531 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004532 first_seg = self.read_file.read(len(self.read_msg)-3)
4533 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004534 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004535 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004536
4537 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004538 self.write_file.write(self.write_msg)
4539 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004540
Guido van Rossum8c943832002-08-08 01:00:28 +00004541 def testFullRead(self):
4542 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004543 msg = self.read_file.read()
4544 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004545
4546 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004547 self.write_file.write(self.write_msg)
4548 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004549
Guido van Rossum24e4af82002-06-12 19:18:08 +00004550 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004551 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004552 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004553 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004554 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004555 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004556 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004557 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004558 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004559
4560 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004561 self.write_file.write(self.write_msg)
4562 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004563
4564 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004565 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004566 line = self.read_file.readline()
4567 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004568
4569 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004570 self.write_file.write(self.write_msg)
4571 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004572
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004573 def testCloseAfterMakefile(self):
4574 # The file returned by makefile should keep the socket open.
4575 self.cli_conn.close()
4576 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004577 msg = self.read_file.read()
4578 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004579
4580 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004581 self.write_file.write(self.write_msg)
4582 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004583
4584 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004585 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004586 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004587 if isinstance(self.read_msg, str):
4588 msg = msg.decode()
4589 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004590
4591 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004592 self.write_file.write(self.write_msg)
4593 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004594
Tim Peters116d83c2004-03-28 02:20:45 +00004595 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004596 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004597
4598 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004599 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004600
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004601 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004602 self.assertEqual(self.read_file.mode, self.read_mode)
4603 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004604
4605 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004606 self.assertEqual(self.write_file.mode, self.write_mode)
4607 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004608
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004609 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004610 self.read_file.close()
4611 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004612 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004613 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004614
4615 def _testRealClose(self):
4616 pass
4617
4618
Guido van Rossume9f66142002-08-07 15:46:19 +00004619class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4620
4621 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004622
Guido van Rossume9f66142002-08-07 15:46:19 +00004623 In this case (and in this case only), it should be possible to
4624 create a file object, read a line from it, create another file
4625 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004626 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004627 when reading multiple requests from the same socket."""
4628
4629 bufsize = 0 # Use unbuffered mode
4630
4631 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004632 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004633 line = self.read_file.readline() # first line
4634 self.assertEqual(line, b"A. " + self.write_msg) # first line
4635 self.read_file = self.cli_conn.makefile('rb', 0)
4636 line = self.read_file.readline() # second line
4637 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004638
4639 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004640 self.write_file.write(b"A. " + self.write_msg)
4641 self.write_file.write(b"B. " + self.write_msg)
4642 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004643
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004644 def testMakefileClose(self):
4645 # The file returned by makefile should keep the socket open...
4646 self.cli_conn.close()
4647 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004648 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004649 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004650 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004651 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004652
4653 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004654 self.write_file.write(self.write_msg)
4655 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004656
4657 def testMakefileCloseSocketDestroy(self):
4658 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004659 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004660 refcount_after = sys.getrefcount(self.cli_conn)
4661 self.assertEqual(refcount_before - 1, refcount_after)
4662
4663 def _testMakefileCloseSocketDestroy(self):
4664 pass
4665
Antoine Pitrou98b46702010-09-18 22:59:00 +00004666 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004667 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004668 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4669
4670 def testSmallReadNonBlocking(self):
4671 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004672 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4673 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004674 self.evt1.set()
4675 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004676 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004677 if first_seg is None:
4678 # Data not arrived (can happen under Windows), wait a bit
4679 time.sleep(0.5)
4680 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004681 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004682 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004683 self.assertEqual(n, 3)
4684 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004685 self.assertEqual(msg, self.read_msg)
4686 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4687 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004688
4689 def _testSmallReadNonBlocking(self):
4690 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004691 self.write_file.write(self.write_msg)
4692 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004693 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004694 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004695 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4696 self.serv_finished.wait(5.0)
4697
4698 def testWriteNonBlocking(self):
4699 self.cli_finished.wait(5.0)
4700 # The client thread can't skip directly - the SkipTest exception
4701 # would appear as a failure.
4702 if self.serv_skipped:
4703 self.skipTest(self.serv_skipped)
4704
4705 def _testWriteNonBlocking(self):
4706 self.serv_skipped = None
4707 self.serv_conn.setblocking(False)
4708 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004709 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004710 LIMIT = 10
4711 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004712 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004713 self.assertGreater(n, 0)
4714 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004715 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004716 if n is None:
4717 # Succeeded
4718 break
4719 self.assertGreater(n, 0)
4720 else:
4721 # Let us know that this test didn't manage to establish
4722 # the expected conditions. This is not a failure in itself but,
4723 # if it happens repeatedly, the test should be fixed.
4724 self.serv_skipped = "failed to saturate the socket buffer"
4725
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004726
Guido van Rossum8c943832002-08-08 01:00:28 +00004727class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4728
4729 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4730
4731
4732class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4733
4734 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004735
Thomas Woutersb2137042007-02-01 18:02:27 +00004736
Antoine Pitrou834bd812010-10-13 16:17:14 +00004737class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4738 """Tests for socket.makefile() in text mode (rather than binary)"""
4739
4740 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004741 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004742 write_mode = 'wb'
4743 write_msg = MSG
4744 newline = ''
4745
4746
4747class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4748 """Tests for socket.makefile() in text mode (rather than binary)"""
4749
4750 read_mode = 'rb'
4751 read_msg = MSG
4752 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004753 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004754 newline = ''
4755
4756
4757class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4758 """Tests for socket.makefile() in text mode (rather than binary)"""
4759
4760 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004761 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004762 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004763 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004764 newline = ''
4765
4766
Guido van Rossumd8faa362007-04-27 19:54:29 +00004767class NetworkConnectionTest(object):
4768 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004769
Guido van Rossumd8faa362007-04-27 19:54:29 +00004770 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004771 # We're inherited below by BasicTCPTest2, which also inherits
4772 # BasicTCPTest, which defines self.port referenced below.
4773 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004774 self.serv_conn = self.cli
4775
4776class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4777 """Tests that NetworkConnection does not break existing TCP functionality.
4778 """
4779
4780class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004781
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004782 class MockSocket(socket.socket):
4783 def connect(self, *args):
4784 raise socket.timeout('timed out')
4785
4786 @contextlib.contextmanager
4787 def mocked_socket_module(self):
4788 """Return a socket which times out on connect"""
4789 old_socket = socket.socket
4790 socket.socket = self.MockSocket
4791 try:
4792 yield
4793 finally:
4794 socket.socket = old_socket
4795
4796 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004797 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004798 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004799 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004800 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004801 cli.connect((HOST, port))
4802 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4803
4804 def test_create_connection(self):
4805 # Issue #9792: errors raised by create_connection() should have
4806 # a proper errno attribute.
4807 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004808 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004809 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004810
4811 # Issue #16257: create_connection() calls getaddrinfo() against
4812 # 'localhost'. This may result in an IPV6 addr being returned
4813 # as well as an IPV4 one:
4814 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4815 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4816 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4817 #
4818 # create_connection() enumerates through all the addresses returned
4819 # and if it doesn't successfully bind to any of them, it propagates
4820 # the last exception it encountered.
4821 #
4822 # On Solaris, ENETUNREACH is returned in this circumstance instead
4823 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4824 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02004825 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04004826 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004827
4828 def test_create_connection_timeout(self):
4829 # Issue #9792: create_connection() should not recast timeout errors
4830 # as generic socket errors.
4831 with self.mocked_socket_module():
Miss Islington (bot)c2684c62019-06-30 08:42:22 -07004832 try:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004833 socket.create_connection((HOST, 1234))
Miss Islington (bot)c2684c62019-06-30 08:42:22 -07004834 except socket.timeout:
4835 pass
4836 except OSError as exc:
4837 if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
4838 raise
4839 else:
4840 self.fail('socket.timeout not raised')
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004841
Guido van Rossumd8faa362007-04-27 19:54:29 +00004842
4843class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4844
4845 def __init__(self, methodName='runTest'):
4846 SocketTCPTest.__init__(self, methodName=methodName)
4847 ThreadableTest.__init__(self)
4848
4849 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004850 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004851
4852 def clientTearDown(self):
4853 self.cli.close()
4854 self.cli = None
4855 ThreadableTest.clientTearDown(self)
4856
4857 def _justAccept(self):
4858 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004859 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004860
4861 testFamily = _justAccept
4862 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004863 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004864 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004865 self.assertEqual(self.cli.family, 2)
4866
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004867 testSourceAddress = _justAccept
4868 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004869 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4870 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004871 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004872 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004873 # The port number being used is sufficient to show that the bind()
4874 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004875
Guido van Rossumd8faa362007-04-27 19:54:29 +00004876 testTimeoutDefault = _justAccept
4877 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004878 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004879 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004880 socket.setdefaulttimeout(42)
4881 try:
4882 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004883 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004884 finally:
4885 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004886 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004887
4888 testTimeoutNone = _justAccept
4889 def _testTimeoutNone(self):
4890 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004891 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004892 socket.setdefaulttimeout(30)
4893 try:
4894 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004895 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004896 finally:
4897 socket.setdefaulttimeout(None)
4898 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004899
4900 testTimeoutValueNamed = _justAccept
4901 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004902 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004903 self.assertEqual(self.cli.gettimeout(), 30)
4904
4905 testTimeoutValueNonamed = _justAccept
4906 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004907 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004908 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004909 self.assertEqual(self.cli.gettimeout(), 30)
4910
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004911
Guido van Rossumd8faa362007-04-27 19:54:29 +00004912class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4913
4914 def __init__(self, methodName='runTest'):
4915 SocketTCPTest.__init__(self, methodName=methodName)
4916 ThreadableTest.__init__(self)
4917
4918 def clientSetUp(self):
4919 pass
4920
4921 def clientTearDown(self):
4922 self.cli.close()
4923 self.cli = None
4924 ThreadableTest.clientTearDown(self)
4925
4926 def testInsideTimeout(self):
4927 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004928 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004929 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004930 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004931 testOutsideTimeout = testInsideTimeout
4932
4933 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004934 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004935 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004936 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004937
4938 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004939 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004940 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004941
4942
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004943class TCPTimeoutTest(SocketTCPTest):
4944
4945 def testTCPTimeout(self):
4946 def raise_timeout(*args, **kwargs):
4947 self.serv.settimeout(1.0)
4948 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004949 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004950 "Error generating a timeout exception (TCP)")
4951
4952 def testTimeoutZero(self):
4953 ok = False
4954 try:
4955 self.serv.settimeout(0.0)
4956 foo = self.serv.accept()
4957 except socket.timeout:
4958 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004959 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004960 ok = True
4961 except:
4962 self.fail("caught unexpected exception (TCP)")
4963 if not ok:
4964 self.fail("accept() returned success when we did not expect it")
4965
Serhiy Storchaka43767632013-11-03 21:31:38 +02004966 @unittest.skipUnless(hasattr(signal, 'alarm'),
4967 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004968 def testInterruptedTimeout(self):
4969 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004970 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004971 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004972 self.serv.settimeout(5.0) # must be longer than alarm
4973 class Alarm(Exception):
4974 pass
4975 def alarm_handler(signal, frame):
4976 raise Alarm
4977 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4978 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004979 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004980 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004981 foo = self.serv.accept()
4982 except socket.timeout:
4983 self.fail("caught timeout instead of Alarm")
4984 except Alarm:
4985 pass
4986 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004987 self.fail("caught other exception instead of Alarm:"
4988 " %s(%s):\n%s" %
4989 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004990 else:
4991 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004992 finally:
4993 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004994 except Alarm:
4995 self.fail("got Alarm in wrong place")
4996 finally:
4997 # no alarm can be pending. Safe to restore old handler.
4998 signal.signal(signal.SIGALRM, old_alarm)
4999
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02005000class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005001
5002 def testUDPTimeout(self):
5003 def raise_timeout(*args, **kwargs):
5004 self.serv.settimeout(1.0)
5005 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00005006 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005007 "Error generating a timeout exception (UDP)")
5008
5009 def testTimeoutZero(self):
5010 ok = False
5011 try:
5012 self.serv.settimeout(0.0)
5013 foo = self.serv.recv(1024)
5014 except socket.timeout:
5015 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02005016 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005017 ok = True
5018 except:
5019 self.fail("caught unexpected exception (UDP)")
5020 if not ok:
5021 self.fail("recv() returned success when we did not expect it")
5022
5023class TestExceptions(unittest.TestCase):
5024
5025 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005026 self.assertTrue(issubclass(OSError, Exception))
5027 self.assertTrue(issubclass(socket.herror, OSError))
5028 self.assertTrue(issubclass(socket.gaierror, OSError))
5029 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005030
Yury Selivanovfa22b292016-10-18 16:03:52 -04005031 def test_setblocking_invalidfd(self):
5032 # Regression test for issue #28471
5033
5034 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5035 sock = socket.socket(
5036 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5037 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005038 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005039
5040 with self.assertRaises(OSError):
5041 sock.setblocking(False)
5042
5043
Serhiy Storchaka43767632013-11-03 21:31:38 +02005044@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005045class TestLinuxAbstractNamespace(unittest.TestCase):
5046
5047 UNIX_PATH_MAX = 108
5048
5049 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005050 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005051 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5052 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005053 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005054 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5055 s2.connect(s1.getsockname())
5056 with s1.accept()[0] as s3:
5057 self.assertEqual(s1.getsockname(), address)
5058 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005059
5060 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005061 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005062 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5063 s.bind(address)
5064 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005065
5066 def testNameOverflow(self):
5067 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005068 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005069 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005070
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005071 def testStrName(self):
5072 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005073 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5074 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005075 s.bind("\x00python\x00test\x00")
5076 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005077 finally:
5078 s.close()
5079
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005080 def testBytearrayName(self):
5081 # Check that an abstract name can be passed as a bytearray.
5082 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5083 s.bind(bytearray(b"\x00python\x00test\x00"))
5084 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5085
Serhiy Storchaka43767632013-11-03 21:31:38 +02005086@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005087class TestUnixDomain(unittest.TestCase):
5088
5089 def setUp(self):
5090 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5091
5092 def tearDown(self):
5093 self.sock.close()
5094
5095 def encoded(self, path):
5096 # Return the given path encoded in the file system encoding,
5097 # or skip the test if this is not possible.
5098 try:
5099 return os.fsencode(path)
5100 except UnicodeEncodeError:
5101 self.skipTest(
5102 "Pathname {0!a} cannot be represented in file "
5103 "system encoding {1!r}".format(
5104 path, sys.getfilesystemencoding()))
5105
Antoine Pitrou16374872011-12-16 15:04:12 +01005106 def bind(self, sock, path):
5107 # Bind the socket
5108 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005109 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005110 except OSError as e:
5111 if str(e) == "AF_UNIX path too long":
5112 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005113 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005114 .format(path))
5115 else:
5116 raise
5117
Antoine Pitrou495b5022017-05-02 17:20:00 +02005118 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005119 # Issue #30205 (note getsockname() can return None on OS X)
5120 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005121
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005122 def testStrAddr(self):
5123 # Test binding to and retrieving a normal string pathname.
5124 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005125 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005126 self.addCleanup(support.unlink, path)
5127 self.assertEqual(self.sock.getsockname(), path)
5128
5129 def testBytesAddr(self):
5130 # Test binding to a bytes pathname.
5131 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005132 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005133 self.addCleanup(support.unlink, path)
5134 self.assertEqual(self.sock.getsockname(), path)
5135
5136 def testSurrogateescapeBind(self):
5137 # Test binding to a valid non-ASCII pathname, with the
5138 # non-ASCII bytes supplied using surrogateescape encoding.
5139 path = os.path.abspath(support.TESTFN_UNICODE)
5140 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005141 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005142 self.addCleanup(support.unlink, path)
5143 self.assertEqual(self.sock.getsockname(), path)
5144
5145 def testUnencodableAddr(self):
5146 # Test binding to a pathname that cannot be encoded in the
5147 # file system encoding.
5148 if support.TESTFN_UNENCODABLE is None:
5149 self.skipTest("No unencodable filename available")
5150 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005151 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005152 self.addCleanup(support.unlink, path)
5153 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005154
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005155
Thomas Wouters477c8d52006-05-27 19:21:47 +00005156class BufferIOTest(SocketConnectedTest):
5157 """
5158 Test the buffer versions of socket.recv() and socket.send().
5159 """
5160 def __init__(self, methodName='runTest'):
5161 SocketConnectedTest.__init__(self, methodName=methodName)
5162
Antoine Pitrou25480782010-03-17 22:50:28 +00005163 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005164 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005165 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005166 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005167 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005168 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005169 self.assertEqual(msg, MSG)
5170
Antoine Pitrou25480782010-03-17 22:50:28 +00005171 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005172 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005173 self.serv_conn.send(buf)
5174
Antoine Pitrou25480782010-03-17 22:50:28 +00005175 def testRecvIntoBytearray(self):
5176 buf = bytearray(1024)
5177 nbytes = self.cli_conn.recv_into(buf)
5178 self.assertEqual(nbytes, len(MSG))
5179 msg = buf[:len(MSG)]
5180 self.assertEqual(msg, MSG)
5181
5182 _testRecvIntoBytearray = _testRecvIntoArray
5183
5184 def testRecvIntoMemoryview(self):
5185 buf = bytearray(1024)
5186 nbytes = self.cli_conn.recv_into(memoryview(buf))
5187 self.assertEqual(nbytes, len(MSG))
5188 msg = buf[:len(MSG)]
5189 self.assertEqual(msg, MSG)
5190
5191 _testRecvIntoMemoryview = _testRecvIntoArray
5192
5193 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005194 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005195 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005196 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005197 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005198 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005199 self.assertEqual(msg, MSG)
5200
Antoine Pitrou25480782010-03-17 22:50:28 +00005201 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005202 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005203 self.serv_conn.send(buf)
5204
Antoine Pitrou25480782010-03-17 22:50:28 +00005205 def testRecvFromIntoBytearray(self):
5206 buf = bytearray(1024)
5207 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5208 self.assertEqual(nbytes, len(MSG))
5209 msg = buf[:len(MSG)]
5210 self.assertEqual(msg, MSG)
5211
5212 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5213
5214 def testRecvFromIntoMemoryview(self):
5215 buf = bytearray(1024)
5216 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5217 self.assertEqual(nbytes, len(MSG))
5218 msg = buf[:len(MSG)]
5219 self.assertEqual(msg, MSG)
5220
5221 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5222
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005223 def testRecvFromIntoSmallBuffer(self):
5224 # See issue #20246.
5225 buf = bytearray(8)
5226 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5227
5228 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005229 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005230
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005231 def testRecvFromIntoEmptyBuffer(self):
5232 buf = bytearray()
5233 self.cli_conn.recvfrom_into(buf)
5234 self.cli_conn.recvfrom_into(buf, 0)
5235
5236 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5237
Christian Heimes043d6f62008-01-07 17:19:16 +00005238
5239TIPC_STYPE = 2000
5240TIPC_LOWER = 200
5241TIPC_UPPER = 210
5242
5243def isTipcAvailable():
5244 """Check if the TIPC module is loaded
5245
5246 The TIPC module is not loaded automatically on Ubuntu and probably
5247 other Linux distros.
5248 """
5249 if not hasattr(socket, "AF_TIPC"):
5250 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005251 try:
5252 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005253 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005254 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005255 # have not the permission to read it.
5256 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005257 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005258 for line in f:
5259 if line.startswith("tipc "):
5260 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005261 return False
5262
Serhiy Storchaka43767632013-11-03 21:31:38 +02005263@unittest.skipUnless(isTipcAvailable(),
5264 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005265class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005266 def testRDM(self):
5267 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5268 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005269 self.addCleanup(srv.close)
5270 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005271
5272 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5273 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5274 TIPC_LOWER, TIPC_UPPER)
5275 srv.bind(srvaddr)
5276
5277 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5278 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5279 cli.sendto(MSG, sendaddr)
5280
5281 msg, recvaddr = srv.recvfrom(1024)
5282
5283 self.assertEqual(cli.getsockname(), recvaddr)
5284 self.assertEqual(msg, MSG)
5285
5286
Serhiy Storchaka43767632013-11-03 21:31:38 +02005287@unittest.skipUnless(isTipcAvailable(),
5288 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005289class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005290 def __init__(self, methodName = 'runTest'):
5291 unittest.TestCase.__init__(self, methodName = methodName)
5292 ThreadableTest.__init__(self)
5293
5294 def setUp(self):
5295 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005296 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005297 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5298 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5299 TIPC_LOWER, TIPC_UPPER)
5300 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005301 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005302 self.serverExplicitReady()
5303 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005304 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005305
5306 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005307 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005308 # accept() call; sleep a little while to avoid it, otherwise
5309 # we could get an exception
5310 time.sleep(0.1)
5311 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005312 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005313 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5314 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5315 self.cli.connect(addr)
5316 self.cliaddr = self.cli.getsockname()
5317
5318 def testStream(self):
5319 msg = self.conn.recv(1024)
5320 self.assertEqual(msg, MSG)
5321 self.assertEqual(self.cliaddr, self.connaddr)
5322
5323 def _testStream(self):
5324 self.cli.send(MSG)
5325 self.cli.close()
5326
5327
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005328class ContextManagersTest(ThreadedTCPSocketTest):
5329
5330 def _testSocketClass(self):
5331 # base test
5332 with socket.socket() as sock:
5333 self.assertFalse(sock._closed)
5334 self.assertTrue(sock._closed)
5335 # close inside with block
5336 with socket.socket() as sock:
5337 sock.close()
5338 self.assertTrue(sock._closed)
5339 # exception inside with block
5340 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005341 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005342 self.assertTrue(sock._closed)
5343
5344 def testCreateConnectionBase(self):
5345 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005346 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005347 data = conn.recv(1024)
5348 conn.sendall(data)
5349
5350 def _testCreateConnectionBase(self):
5351 address = self.serv.getsockname()
5352 with socket.create_connection(address) as sock:
5353 self.assertFalse(sock._closed)
5354 sock.sendall(b'foo')
5355 self.assertEqual(sock.recv(1024), b'foo')
5356 self.assertTrue(sock._closed)
5357
5358 def testCreateConnectionClose(self):
5359 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005360 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005361 data = conn.recv(1024)
5362 conn.sendall(data)
5363
5364 def _testCreateConnectionClose(self):
5365 address = self.serv.getsockname()
5366 with socket.create_connection(address) as sock:
5367 sock.close()
5368 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005369 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005370
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005371
Victor Stinnerdaf45552013-08-28 00:53:59 +02005372class InheritanceTest(unittest.TestCase):
5373 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5374 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005375 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005376 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005377 with socket.socket(socket.AF_INET,
5378 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005379 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005380 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005381
5382 def test_default_inheritable(self):
5383 sock = socket.socket()
5384 with sock:
5385 self.assertEqual(sock.get_inheritable(), False)
5386
5387 def test_dup(self):
5388 sock = socket.socket()
5389 with sock:
5390 newsock = sock.dup()
5391 sock.close()
5392 with newsock:
5393 self.assertEqual(newsock.get_inheritable(), False)
5394
5395 def test_set_inheritable(self):
5396 sock = socket.socket()
5397 with sock:
5398 sock.set_inheritable(True)
5399 self.assertEqual(sock.get_inheritable(), True)
5400
5401 sock.set_inheritable(False)
5402 self.assertEqual(sock.get_inheritable(), False)
5403
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005404 @unittest.skipIf(fcntl is None, "need fcntl")
5405 def test_get_inheritable_cloexec(self):
5406 sock = socket.socket()
5407 with sock:
5408 fd = sock.fileno()
5409 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005410
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005411 # clear FD_CLOEXEC flag
5412 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5413 flags &= ~fcntl.FD_CLOEXEC
5414 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005415
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005416 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005417
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005418 @unittest.skipIf(fcntl is None, "need fcntl")
5419 def test_set_inheritable_cloexec(self):
5420 sock = socket.socket()
5421 with sock:
5422 fd = sock.fileno()
5423 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5424 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005425
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005426 sock.set_inheritable(True)
5427 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5428 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005429
5430
Victor Stinnerdaf45552013-08-28 00:53:59 +02005431 def test_socketpair(self):
5432 s1, s2 = socket.socketpair()
5433 self.addCleanup(s1.close)
5434 self.addCleanup(s2.close)
5435 self.assertEqual(s1.get_inheritable(), False)
5436 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005437
5438
5439@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5440 "SOCK_NONBLOCK not defined")
5441class NonblockConstantTest(unittest.TestCase):
5442 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5443 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005444 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005445 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005446 self.assertTrue(
5447 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005448 if timeout == 0:
5449 # timeout == 0: means that getblocking() must be False.
5450 self.assertFalse(s.getblocking())
5451 else:
5452 # If timeout > 0, the socket will be in a "blocking" mode
5453 # from the standpoint of the Python API. For Python socket
5454 # object, "blocking" means that operations like 'sock.recv()'
5455 # will block. Internally, file descriptors for
5456 # "blocking" Python sockets *with timeouts* are in a
5457 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5458 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5459 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005460 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005461 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005462 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005463 self.assertFalse(
5464 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005465 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005466
Charles-François Natali239bb962011-06-03 12:55:15 +02005467 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005468 def test_SOCK_NONBLOCK(self):
5469 # a lot of it seems silly and redundant, but I wanted to test that
5470 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005471 with socket.socket(socket.AF_INET,
5472 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5473 self.checkNonblock(s)
5474 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005475 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005476 s.setblocking(0)
5477 self.checkNonblock(s)
5478 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005479 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005480 s.settimeout(2.0)
5481 self.checkNonblock(s, timeout=2.0)
5482 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005483 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005484 # defaulttimeout
5485 t = socket.getdefaulttimeout()
5486 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005487 with socket.socket() as s:
5488 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005489 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005490 with socket.socket() as s:
5491 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005492 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005493 with socket.socket() as s:
5494 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005495 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005496 with socket.socket() as s:
5497 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005498 socket.setdefaulttimeout(t)
5499
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005500
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005501@unittest.skipUnless(os.name == "nt", "Windows specific")
5502@unittest.skipUnless(multiprocessing, "need multiprocessing")
5503class TestSocketSharing(SocketTCPTest):
5504 # This must be classmethod and not staticmethod or multiprocessing
5505 # won't be able to bootstrap it.
5506 @classmethod
5507 def remoteProcessServer(cls, q):
5508 # Recreate socket from shared data
5509 sdata = q.get()
5510 message = q.get()
5511
5512 s = socket.fromshare(sdata)
5513 s2, c = s.accept()
5514
5515 # Send the message
5516 s2.sendall(message)
5517 s2.close()
5518 s.close()
5519
5520 def testShare(self):
5521 # Transfer the listening server socket to another process
5522 # and service it from there.
5523
5524 # Create process:
5525 q = multiprocessing.Queue()
5526 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5527 p.start()
5528
5529 # Get the shared socket data
5530 data = self.serv.share(p.pid)
5531
5532 # Pass the shared socket to the other process
5533 addr = self.serv.getsockname()
5534 self.serv.close()
5535 q.put(data)
5536
5537 # The data that the server will send us
5538 message = b"slapmahfro"
5539 q.put(message)
5540
5541 # Connect
5542 s = socket.create_connection(addr)
5543 # listen for the data
5544 m = []
5545 while True:
5546 data = s.recv(100)
5547 if not data:
5548 break
5549 m.append(data)
5550 s.close()
5551 received = b"".join(m)
5552 self.assertEqual(received, message)
5553 p.join()
5554
5555 def testShareLength(self):
5556 data = self.serv.share(os.getpid())
5557 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5558 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5559
5560 def compareSockets(self, org, other):
5561 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005562 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005563 self.assertEqual(org.gettimeout(), None)
5564 self.assertEqual(org.gettimeout(), other.gettimeout())
5565
5566 self.assertEqual(org.family, other.family)
5567 self.assertEqual(org.type, other.type)
5568 # If the user specified "0" for proto, then
5569 # internally windows will have picked the correct value.
5570 # Python introspection on the socket however will still return
5571 # 0. For the shared socket, the python value is recreated
5572 # from the actual value, so it may not compare correctly.
5573 if org.proto != 0:
5574 self.assertEqual(org.proto, other.proto)
5575
5576 def testShareLocal(self):
5577 data = self.serv.share(os.getpid())
5578 s = socket.fromshare(data)
5579 try:
5580 self.compareSockets(self.serv, s)
5581 finally:
5582 s.close()
5583
5584 def testTypes(self):
5585 families = [socket.AF_INET, socket.AF_INET6]
5586 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5587 for f in families:
5588 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005589 try:
5590 source = socket.socket(f, t)
5591 except OSError:
5592 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005593 try:
5594 data = source.share(os.getpid())
5595 shared = socket.fromshare(data)
5596 try:
5597 self.compareSockets(source, shared)
5598 finally:
5599 shared.close()
5600 finally:
5601 source.close()
5602
5603
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005604class SendfileUsingSendTest(ThreadedTCPSocketTest):
5605 """
5606 Test the send() implementation of socket.sendfile().
5607 """
5608
Victor Stinner8c663fd2017-11-08 14:44:44 -08005609 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005610 BUFSIZE = 8192
5611 FILEDATA = b""
5612 TIMEOUT = 2
5613
5614 @classmethod
5615 def setUpClass(cls):
5616 def chunks(total, step):
5617 assert total >= step
5618 while total > step:
5619 yield step
5620 total -= step
5621 if total:
5622 yield total
5623
5624 chunk = b"".join([random.choice(string.ascii_letters).encode()
5625 for i in range(cls.BUFSIZE)])
5626 with open(support.TESTFN, 'wb') as f:
5627 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5628 f.write(chunk)
5629 with open(support.TESTFN, 'rb') as f:
5630 cls.FILEDATA = f.read()
5631 assert len(cls.FILEDATA) == cls.FILESIZE
5632
5633 @classmethod
5634 def tearDownClass(cls):
5635 support.unlink(support.TESTFN)
5636
5637 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005638 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005639 conn, addr = self.serv.accept()
5640 conn.settimeout(self.TIMEOUT)
5641 self.addCleanup(conn.close)
5642 return conn
5643
5644 def recv_data(self, conn):
5645 received = []
5646 while True:
5647 chunk = conn.recv(self.BUFSIZE)
5648 if not chunk:
5649 break
5650 received.append(chunk)
5651 return b''.join(received)
5652
5653 def meth_from_sock(self, sock):
5654 # Depending on the mixin class being run return either send()
5655 # or sendfile() method implementation.
5656 return getattr(sock, "_sendfile_use_send")
5657
5658 # regular file
5659
5660 def _testRegularFile(self):
5661 address = self.serv.getsockname()
5662 file = open(support.TESTFN, 'rb')
5663 with socket.create_connection(address) as sock, file as file:
5664 meth = self.meth_from_sock(sock)
5665 sent = meth(file)
5666 self.assertEqual(sent, self.FILESIZE)
5667 self.assertEqual(file.tell(), self.FILESIZE)
5668
5669 def testRegularFile(self):
5670 conn = self.accept_conn()
5671 data = self.recv_data(conn)
5672 self.assertEqual(len(data), self.FILESIZE)
5673 self.assertEqual(data, self.FILEDATA)
5674
5675 # non regular file
5676
5677 def _testNonRegularFile(self):
5678 address = self.serv.getsockname()
5679 file = io.BytesIO(self.FILEDATA)
5680 with socket.create_connection(address) as sock, file as file:
5681 sent = sock.sendfile(file)
5682 self.assertEqual(sent, self.FILESIZE)
5683 self.assertEqual(file.tell(), self.FILESIZE)
5684 self.assertRaises(socket._GiveupOnSendfile,
5685 sock._sendfile_use_sendfile, file)
5686
5687 def testNonRegularFile(self):
5688 conn = self.accept_conn()
5689 data = self.recv_data(conn)
5690 self.assertEqual(len(data), self.FILESIZE)
5691 self.assertEqual(data, self.FILEDATA)
5692
5693 # empty file
5694
5695 def _testEmptyFileSend(self):
5696 address = self.serv.getsockname()
5697 filename = support.TESTFN + "2"
5698 with open(filename, 'wb'):
5699 self.addCleanup(support.unlink, filename)
5700 file = open(filename, 'rb')
5701 with socket.create_connection(address) as sock, file as file:
5702 meth = self.meth_from_sock(sock)
5703 sent = meth(file)
5704 self.assertEqual(sent, 0)
5705 self.assertEqual(file.tell(), 0)
5706
5707 def testEmptyFileSend(self):
5708 conn = self.accept_conn()
5709 data = self.recv_data(conn)
5710 self.assertEqual(data, b"")
5711
5712 # offset
5713
5714 def _testOffset(self):
5715 address = self.serv.getsockname()
5716 file = open(support.TESTFN, 'rb')
5717 with socket.create_connection(address) as sock, file as file:
5718 meth = self.meth_from_sock(sock)
5719 sent = meth(file, offset=5000)
5720 self.assertEqual(sent, self.FILESIZE - 5000)
5721 self.assertEqual(file.tell(), self.FILESIZE)
5722
5723 def testOffset(self):
5724 conn = self.accept_conn()
5725 data = self.recv_data(conn)
5726 self.assertEqual(len(data), self.FILESIZE - 5000)
5727 self.assertEqual(data, self.FILEDATA[5000:])
5728
5729 # count
5730
5731 def _testCount(self):
5732 address = self.serv.getsockname()
5733 file = open(support.TESTFN, 'rb')
5734 with socket.create_connection(address, timeout=2) as sock, file as file:
5735 count = 5000007
5736 meth = self.meth_from_sock(sock)
5737 sent = meth(file, count=count)
5738 self.assertEqual(sent, count)
5739 self.assertEqual(file.tell(), count)
5740
5741 def testCount(self):
5742 count = 5000007
5743 conn = self.accept_conn()
5744 data = self.recv_data(conn)
5745 self.assertEqual(len(data), count)
5746 self.assertEqual(data, self.FILEDATA[:count])
5747
5748 # count small
5749
5750 def _testCountSmall(self):
5751 address = self.serv.getsockname()
5752 file = open(support.TESTFN, 'rb')
5753 with socket.create_connection(address, timeout=2) as sock, file as file:
5754 count = 1
5755 meth = self.meth_from_sock(sock)
5756 sent = meth(file, count=count)
5757 self.assertEqual(sent, count)
5758 self.assertEqual(file.tell(), count)
5759
5760 def testCountSmall(self):
5761 count = 1
5762 conn = self.accept_conn()
5763 data = self.recv_data(conn)
5764 self.assertEqual(len(data), count)
5765 self.assertEqual(data, self.FILEDATA[:count])
5766
5767 # count + offset
5768
5769 def _testCountWithOffset(self):
5770 address = self.serv.getsockname()
5771 file = open(support.TESTFN, 'rb')
5772 with socket.create_connection(address, timeout=2) as sock, file as file:
5773 count = 100007
5774 meth = self.meth_from_sock(sock)
5775 sent = meth(file, offset=2007, count=count)
5776 self.assertEqual(sent, count)
5777 self.assertEqual(file.tell(), count + 2007)
5778
5779 def testCountWithOffset(self):
5780 count = 100007
5781 conn = self.accept_conn()
5782 data = self.recv_data(conn)
5783 self.assertEqual(len(data), count)
5784 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5785
5786 # non blocking sockets are not supposed to work
5787
5788 def _testNonBlocking(self):
5789 address = self.serv.getsockname()
5790 file = open(support.TESTFN, 'rb')
5791 with socket.create_connection(address) as sock, file as file:
5792 sock.setblocking(False)
5793 meth = self.meth_from_sock(sock)
5794 self.assertRaises(ValueError, meth, file)
5795 self.assertRaises(ValueError, sock.sendfile, file)
5796
5797 def testNonBlocking(self):
5798 conn = self.accept_conn()
5799 if conn.recv(8192):
5800 self.fail('was not supposed to receive any data')
5801
5802 # timeout (non-triggered)
5803
5804 def _testWithTimeout(self):
5805 address = self.serv.getsockname()
5806 file = open(support.TESTFN, 'rb')
5807 with socket.create_connection(address, timeout=2) as sock, file as file:
5808 meth = self.meth_from_sock(sock)
5809 sent = meth(file)
5810 self.assertEqual(sent, self.FILESIZE)
5811
5812 def testWithTimeout(self):
5813 conn = self.accept_conn()
5814 data = self.recv_data(conn)
5815 self.assertEqual(len(data), self.FILESIZE)
5816 self.assertEqual(data, self.FILEDATA)
5817
5818 # timeout (triggered)
5819
5820 def _testWithTimeoutTriggeredSend(self):
5821 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00005822 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005823 with socket.create_connection(address) as sock:
5824 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00005825 meth = self.meth_from_sock(sock)
5826 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005827
5828 def testWithTimeoutTriggeredSend(self):
5829 conn = self.accept_conn()
5830 conn.recv(88192)
5831
5832 # errors
5833
5834 def _test_errors(self):
5835 pass
5836
5837 def test_errors(self):
5838 with open(support.TESTFN, 'rb') as file:
5839 with socket.socket(type=socket.SOCK_DGRAM) as s:
5840 meth = self.meth_from_sock(s)
5841 self.assertRaisesRegex(
5842 ValueError, "SOCK_STREAM", meth, file)
5843 with open(support.TESTFN, 'rt') as file:
5844 with socket.socket() as s:
5845 meth = self.meth_from_sock(s)
5846 self.assertRaisesRegex(
5847 ValueError, "binary mode", meth, file)
5848 with open(support.TESTFN, 'rb') as file:
5849 with socket.socket() as s:
5850 meth = self.meth_from_sock(s)
5851 self.assertRaisesRegex(TypeError, "positive integer",
5852 meth, file, count='2')
5853 self.assertRaisesRegex(TypeError, "positive integer",
5854 meth, file, count=0.1)
5855 self.assertRaisesRegex(ValueError, "positive integer",
5856 meth, file, count=0)
5857 self.assertRaisesRegex(ValueError, "positive integer",
5858 meth, file, count=-1)
5859
5860
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005861@unittest.skipUnless(hasattr(os, "sendfile"),
5862 'os.sendfile() required for this test.')
5863class SendfileUsingSendfileTest(SendfileUsingSendTest):
5864 """
5865 Test the sendfile() implementation of socket.sendfile().
5866 """
5867 def meth_from_sock(self, sock):
5868 return getattr(sock, "_sendfile_use_sendfile")
5869
Christian Heimes48371412016-09-06 00:37:46 +02005870
5871@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005872class LinuxKernelCryptoAPI(unittest.TestCase):
5873 # tests for AF_ALG
5874 def create_alg(self, typ, name):
5875 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005876 try:
5877 sock.bind((typ, name))
5878 except FileNotFoundError as e:
5879 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005880 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005881 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005882 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005883 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005884
Victor Stinner86afc1f2017-11-30 13:58:43 +01005885 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5886 # at least on ppc64le architecture
5887 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005888 def test_sha256(self):
5889 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5890 "177a9cb410ff61f20015ad")
5891 with self.create_alg('hash', 'sha256') as algo:
5892 op, _ = algo.accept()
5893 with op:
5894 op.sendall(b"abc")
5895 self.assertEqual(op.recv(512), expected)
5896
5897 op, _ = algo.accept()
5898 with op:
5899 op.send(b'a', socket.MSG_MORE)
5900 op.send(b'b', socket.MSG_MORE)
5901 op.send(b'c', socket.MSG_MORE)
5902 op.send(b'')
5903 self.assertEqual(op.recv(512), expected)
5904
5905 def test_hmac_sha1(self):
5906 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5907 with self.create_alg('hash', 'hmac(sha1)') as algo:
5908 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5909 op, _ = algo.accept()
5910 with op:
5911 op.sendall(b"what do ya want for nothing?")
5912 self.assertEqual(op.recv(512), expected)
5913
Christian Heimese084f842016-09-11 20:11:30 +02005914 # Although it should work with 3.19 and newer the test blocks on
5915 # Ubuntu 15.10 with Kernel 4.2.0-19.
5916 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005917 def test_aes_cbc(self):
5918 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5919 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5920 msg = b"Single block msg"
5921 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5922 msglen = len(msg)
5923 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5924 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5925 op, _ = algo.accept()
5926 with op:
5927 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5928 flags=socket.MSG_MORE)
5929 op.sendall(msg)
5930 self.assertEqual(op.recv(msglen), ciphertext)
5931
5932 op, _ = algo.accept()
5933 with op:
5934 op.sendmsg_afalg([ciphertext],
5935 op=socket.ALG_OP_DECRYPT, iv=iv)
5936 self.assertEqual(op.recv(msglen), msg)
5937
5938 # long message
5939 multiplier = 1024
5940 longmsg = [msg] * multiplier
5941 op, _ = algo.accept()
5942 with op:
5943 op.sendmsg_afalg(longmsg,
5944 op=socket.ALG_OP_ENCRYPT, iv=iv)
5945 enc = op.recv(msglen * multiplier)
5946 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05005947 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005948
5949 op, _ = algo.accept()
5950 with op:
5951 op.sendmsg_afalg([enc],
5952 op=socket.ALG_OP_DECRYPT, iv=iv)
5953 dec = op.recv(msglen * multiplier)
5954 self.assertEqual(len(dec), msglen * multiplier)
5955 self.assertEqual(dec, msg * multiplier)
5956
matejcik9764c152017-02-16 14:41:31 +01005957 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005958 def test_aead_aes_gcm(self):
5959 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5960 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5961 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5962 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5963 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5964 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5965
5966 taglen = len(expected_tag)
5967 assoclen = len(assoc)
5968
5969 with self.create_alg('aead', 'gcm(aes)') as algo:
5970 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5971 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5972 None, taglen)
5973
5974 # send assoc, plain and tag buffer in separate steps
5975 op, _ = algo.accept()
5976 with op:
5977 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5978 assoclen=assoclen, flags=socket.MSG_MORE)
5979 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005980 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005981 res = op.recv(assoclen + len(plain) + taglen)
5982 self.assertEqual(expected_ct, res[assoclen:-taglen])
5983 self.assertEqual(expected_tag, res[-taglen:])
5984
5985 # now with msg
5986 op, _ = algo.accept()
5987 with op:
matejcik9764c152017-02-16 14:41:31 +01005988 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005989 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5990 assoclen=assoclen)
5991 res = op.recv(assoclen + len(plain) + taglen)
5992 self.assertEqual(expected_ct, res[assoclen:-taglen])
5993 self.assertEqual(expected_tag, res[-taglen:])
5994
5995 # create anc data manually
5996 pack_uint32 = struct.Struct('I').pack
5997 op, _ = algo.accept()
5998 with op:
matejcik9764c152017-02-16 14:41:31 +01005999 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02006000 op.sendmsg(
6001 [msg],
6002 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
6003 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
6004 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
6005 )
6006 )
matejcik9764c152017-02-16 14:41:31 +01006007 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02006008 self.assertEqual(expected_ct, res[assoclen:-taglen])
6009 self.assertEqual(expected_tag, res[-taglen:])
6010
6011 # decrypt and verify
6012 op, _ = algo.accept()
6013 with op:
6014 msg = assoc + expected_ct + expected_tag
6015 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
6016 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01006017 res = op.recv(len(msg) - taglen)
6018 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02006019
Christian Heimese084f842016-09-11 20:11:30 +02006020 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006021 def test_drbg_pr_sha256(self):
6022 # deterministic random bit generator, prediction resistance, sha256
6023 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6024 extra_seed = os.urandom(32)
6025 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6026 op, _ = algo.accept()
6027 with op:
6028 rn = op.recv(32)
6029 self.assertEqual(len(rn), 32)
6030
6031 def test_sendmsg_afalg_args(self):
6032 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006033 with sock:
6034 with self.assertRaises(TypeError):
6035 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006036
Christian Heimes02b30352016-09-11 19:49:56 +02006037 with self.assertRaises(TypeError):
6038 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006039
Christian Heimes02b30352016-09-11 19:49:56 +02006040 with self.assertRaises(TypeError):
6041 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006042
Christian Heimes02b30352016-09-11 19:49:56 +02006043 with self.assertRaises(TypeError):
6044 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006045
Christian Heimes02b30352016-09-11 19:49:56 +02006046 with self.assertRaises(TypeError):
6047 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6048
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006049 def test_length_restriction(self):
6050 # bpo-35050, off-by-one error in length check
6051 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6052 self.addCleanup(sock.close)
6053
6054 # salg_type[14]
6055 with self.assertRaises(FileNotFoundError):
6056 sock.bind(("t" * 13, "name"))
6057 with self.assertRaisesRegex(ValueError, "type too long"):
6058 sock.bind(("t" * 14, "name"))
6059
6060 # salg_name[64]
6061 with self.assertRaises(FileNotFoundError):
6062 sock.bind(("type", "n" * 63))
6063 with self.assertRaisesRegex(ValueError, "name too long"):
6064 sock.bind(("type", "n" * 64))
6065
6066
animalize19e7d482018-02-27 02:10:36 +08006067@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6068class TestMSWindowsTCPFlags(unittest.TestCase):
6069 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006070 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006071 'TCP_MAXSEG',
6072 'TCP_NODELAY',
6073 # available starting with Windows 10 1607
6074 'TCP_FASTOPEN',
6075 # available starting with Windows 10 1703
6076 'TCP_KEEPCNT',
6077 # available starting with Windows 10 1709
6078 'TCP_KEEPIDLE',
6079 'TCP_KEEPINTVL'
6080 }
6081
6082 def test_new_tcp_flags(self):
6083 provided = [s for s in dir(socket) if s.startswith('TCP')]
6084 unknown = [s for s in provided if s not in self.knownTCPFlags]
6085
6086 self.assertEqual([], unknown,
6087 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006088
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006089
6090class CreateServerTest(unittest.TestCase):
6091
6092 def test_address(self):
6093 port = support.find_unused_port()
6094 with socket.create_server(("127.0.0.1", port)) as sock:
6095 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6096 self.assertEqual(sock.getsockname()[1], port)
6097 if support.IPV6_ENABLED:
6098 with socket.create_server(("::1", port),
6099 family=socket.AF_INET6) as sock:
6100 self.assertEqual(sock.getsockname()[0], "::1")
6101 self.assertEqual(sock.getsockname()[1], port)
6102
6103 def test_family_and_type(self):
6104 with socket.create_server(("127.0.0.1", 0)) as sock:
6105 self.assertEqual(sock.family, socket.AF_INET)
6106 self.assertEqual(sock.type, socket.SOCK_STREAM)
6107 if support.IPV6_ENABLED:
6108 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6109 self.assertEqual(s.family, socket.AF_INET6)
6110 self.assertEqual(sock.type, socket.SOCK_STREAM)
6111
6112 def test_reuse_port(self):
6113 if not hasattr(socket, "SO_REUSEPORT"):
6114 with self.assertRaises(ValueError):
6115 socket.create_server(("localhost", 0), reuse_port=True)
6116 else:
6117 with socket.create_server(("localhost", 0)) as sock:
6118 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6119 self.assertEqual(opt, 0)
6120 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6121 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6122 self.assertNotEqual(opt, 0)
6123
6124 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6125 not hasattr(_socket, 'IPV6_V6ONLY'),
6126 "IPV6_V6ONLY option not supported")
6127 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6128 def test_ipv6_only_default(self):
6129 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6130 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6131
6132 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6133 "dualstack_ipv6 not supported")
6134 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6135 def test_dualstack_ipv6_family(self):
6136 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6137 dualstack_ipv6=True) as sock:
6138 self.assertEqual(sock.family, socket.AF_INET6)
6139
6140
6141class CreateServerFunctionalTest(unittest.TestCase):
6142 timeout = 3
6143
6144 def setUp(self):
6145 self.thread = None
6146
6147 def tearDown(self):
6148 if self.thread is not None:
6149 self.thread.join(self.timeout)
6150
6151 def echo_server(self, sock):
6152 def run(sock):
6153 with sock:
6154 conn, _ = sock.accept()
6155 with conn:
6156 event.wait(self.timeout)
6157 msg = conn.recv(1024)
6158 if not msg:
6159 return
6160 conn.sendall(msg)
6161
6162 event = threading.Event()
6163 sock.settimeout(self.timeout)
6164 self.thread = threading.Thread(target=run, args=(sock, ))
6165 self.thread.start()
6166 event.set()
6167
6168 def echo_client(self, addr, family):
6169 with socket.socket(family=family) as sock:
6170 sock.settimeout(self.timeout)
6171 sock.connect(addr)
6172 sock.sendall(b'foo')
6173 self.assertEqual(sock.recv(1024), b'foo')
6174
6175 def test_tcp4(self):
6176 port = support.find_unused_port()
6177 with socket.create_server(("", port)) as sock:
6178 self.echo_server(sock)
6179 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6180
6181 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6182 def test_tcp6(self):
6183 port = support.find_unused_port()
6184 with socket.create_server(("", port),
6185 family=socket.AF_INET6) as sock:
6186 self.echo_server(sock)
6187 self.echo_client(("::1", port), socket.AF_INET6)
6188
6189 # --- dual stack tests
6190
6191 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6192 "dualstack_ipv6 not supported")
6193 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6194 def test_dual_stack_client_v4(self):
6195 port = support.find_unused_port()
6196 with socket.create_server(("", port), family=socket.AF_INET6,
6197 dualstack_ipv6=True) as sock:
6198 self.echo_server(sock)
6199 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6200
6201 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6202 "dualstack_ipv6 not supported")
6203 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6204 def test_dual_stack_client_v6(self):
6205 port = support.find_unused_port()
6206 with socket.create_server(("", port), family=socket.AF_INET6,
6207 dualstack_ipv6=True) as sock:
6208 self.echo_server(sock)
6209 self.echo_client(("::1", port), socket.AF_INET6)
6210
6211
Guido van Rossumb995eb72002-07-31 16:08:40 +00006212def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006213 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006214 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
6215 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006216
6217 tests.extend([
6218 NonBlockingTCPTests,
6219 FileObjectClassTestCase,
6220 UnbufferedFileObjectClassTestCase,
6221 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006222 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006223 UnicodeReadFileObjectClassTestCase,
6224 UnicodeWriteFileObjectClassTestCase,
6225 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006226 NetworkConnectionNoServer,
6227 NetworkConnectionAttributesTest,
6228 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006229 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006230 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006231 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006232 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006233 tests.append(BasicSocketPairTest)
6234 tests.append(TestUnixDomain)
6235 tests.append(TestLinuxAbstractNamespace)
6236 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006237 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006238 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006239 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006240 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006241 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006242 BasicVSOCKTest,
6243 ThreadedVSOCKSocketStreamTest,
6244 ])
6245 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006246 CmsgMacroTests,
6247 SendmsgUDPTest,
6248 RecvmsgUDPTest,
6249 RecvmsgIntoUDPTest,
6250 SendmsgUDP6Test,
6251 RecvmsgUDP6Test,
6252 RecvmsgRFC3542AncillaryUDP6Test,
6253 RecvmsgIntoRFC3542AncillaryUDP6Test,
6254 RecvmsgIntoUDP6Test,
6255 SendmsgTCPTest,
6256 RecvmsgTCPTest,
6257 RecvmsgIntoTCPTest,
6258 SendmsgSCTPStreamTest,
6259 RecvmsgSCTPStreamTest,
6260 RecvmsgIntoSCTPStreamTest,
6261 SendmsgUnixStreamTest,
6262 RecvmsgUnixStreamTest,
6263 RecvmsgIntoUnixStreamTest,
6264 RecvmsgSCMRightsStreamTest,
6265 RecvmsgIntoSCMRightsStreamTest,
6266 # These are slow when setitimer() is not available
6267 InterruptedRecvTimeoutTest,
6268 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006269 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006270 SendfileUsingSendTest,
6271 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006272 ])
animalize19e7d482018-02-27 02:10:36 +08006273 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006274
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006275 thread_info = support.threading_setup()
6276 support.run_unittest(*tests)
6277 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006278
6279if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006280 test_main()