blob: 0094cecb79cca6b58e65a2fad9d9a6214e245222 [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
976 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
977 'socket.if_nameindex() not available.')
978 def testInvalidInterfaceNameIndex(self):
979 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200980 self.assertRaises(OSError, socket.if_indextoname, 0)
981 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200982 # test with invalid values
983 self.assertRaises(TypeError, socket.if_nametoindex, 0)
984 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700985
Serhiy Storchaka43767632013-11-03 21:31:38 +0200986 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
987 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000988 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000989 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200990 try:
991 # On some versions, this loses a reference
992 orig = sys.getrefcount(__name__)
993 socket.getnameinfo(__name__,0)
994 except TypeError:
995 if sys.getrefcount(__name__) != orig:
996 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000997
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000999 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000 try:
1001 # On some versions, this crashes the interpreter.
1002 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001003 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001005
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001006 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001007 # This just checks that htons etc. are their own inverse,
1008 # when looking at the lower 16 or 32 bits.
1009 sizes = {socket.htonl: 32, socket.ntohl: 32,
1010 socket.htons: 16, socket.ntohs: 16}
1011 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001012 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001013 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1014 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001015
Guido van Rossuma2627af2002-09-14 00:58:46 +00001016 swapped = func(mask)
1017 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001018 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001019
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001020 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001021 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001022 import _testcapi
1023 s_good_values = [0, 1, 2, 0xffff]
1024 l_good_values = s_good_values + [0xffffffff]
1025 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1026 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1027 _testcapi.INT_MAX + 1]
1028 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1029 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001030 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001031 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001032 for k in l_good_values:
1033 socket.ntohl(k)
1034 socket.htonl(k)
1035 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001036 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001037 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001038 for k in l_bad_values:
1039 self.assertRaises(OverflowError, socket.ntohl, k)
1040 self.assertRaises(OverflowError, socket.htonl, k)
1041 for k in s_deprecated_values:
1042 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1043 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001044
Barry Warsaw11b91a02004-06-28 00:50:43 +00001045 def testGetServBy(self):
1046 eq = self.assertEqual
1047 # Find one service that exists, then check all the related interfaces.
1048 # I've ordered this by protocols that have both a tcp and udp
1049 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001050 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001051 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001052 # avoid the 'echo' service on this platform, as there is an
1053 # assumption breaking non-standard port/protocol entry
1054 services = ('daytime', 'qotd', 'domain')
1055 else:
1056 services = ('echo', 'daytime', 'domain')
1057 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001058 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001059 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001060 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001061 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001062 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001063 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001064 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001065 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001066 # Issue #26936: Android getservbyname() was broken before API 23.
1067 if (not hasattr(sys, 'getandroidapilevel') or
1068 sys.getandroidapilevel() >= 23):
1069 port2 = socket.getservbyname(service)
1070 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001071 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001072 try:
1073 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001074 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001075 udpport = None
1076 else:
1077 eq(udpport, port)
1078 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001079 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001080 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001081 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001082 eq(socket.getservbyport(port, 'tcp'), service)
1083 if udpport is not None:
1084 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001085 # Make sure getservbyport does not accept out of range ports.
1086 self.assertRaises(OverflowError, socket.getservbyport, -1)
1087 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001089 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001090 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001091 # The default timeout should initially be None
1092 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001093 with socket.socket() as s:
1094 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001095
1096 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001097 with socket_setdefaulttimeout(10):
1098 self.assertEqual(socket.getdefaulttimeout(), 10)
1099 with socket.socket() as sock:
1100 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001101
Victor Stinner304315d2018-11-30 13:22:44 +01001102 # Reset the default timeout to None, and see if it propagates
1103 socket.setdefaulttimeout(None)
1104 self.assertEqual(socket.getdefaulttimeout(), None)
1105 with socket.socket() as sock:
1106 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001107
1108 # Check that setting it to an invalid value raises ValueError
1109 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1110
1111 # Check that setting it to an invalid type raises TypeError
1112 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1113
Serhiy Storchaka43767632013-11-03 21:31:38 +02001114 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1115 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001116 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001117 # Test that issue1008086 and issue767150 are fixed.
1118 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001119 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1120 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001121
Serhiy Storchaka43767632013-11-03 21:31:38 +02001122 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1123 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001124 def testIPv4toString(self):
1125 from socket import inet_aton as f, inet_pton, AF_INET
1126 g = lambda a: inet_pton(AF_INET, a)
1127
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001128 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001129 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001130 )
1131
Ezio Melottib3aedd42010-11-20 19:04:17 +00001132 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1133 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1134 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1135 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1136 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001137 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001138 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001139 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001140 assertInvalid(f, '300.0.0.0')
1141 assertInvalid(f, 'a.0.0.0')
1142 assertInvalid(f, '1.2.3.4.5')
1143 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001144
Ezio Melottib3aedd42010-11-20 19:04:17 +00001145 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1146 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1147 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1148 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001149 assertInvalid(g, '0.0.0.')
1150 assertInvalid(g, '300.0.0.0')
1151 assertInvalid(g, 'a.0.0.0')
1152 assertInvalid(g, '1.2.3.4.5')
1153 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001154
Serhiy Storchaka43767632013-11-03 21:31:38 +02001155 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1156 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001157 def testIPv6toString(self):
1158 try:
1159 from socket import inet_pton, AF_INET6, has_ipv6
1160 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001161 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001162 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001163 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001164
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001165 if sys.platform == "win32":
1166 try:
1167 inet_pton(AF_INET6, '::')
1168 except OSError as e:
1169 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001170 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001171
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001172 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001173 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001174 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001175 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001176
Ezio Melottib3aedd42010-11-20 19:04:17 +00001177 self.assertEqual(b'\x00' * 16, f('::'))
1178 self.assertEqual(b'\x00' * 16, f('0::0'))
1179 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1180 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001181 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 +00001182 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1183 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001184 self.assertEqual(
1185 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1186 f('ad42:abc::127:0:254:2')
1187 )
1188 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1189 assertInvalid('0x20::')
1190 assertInvalid(':::')
1191 assertInvalid('::0::')
1192 assertInvalid('1::abc::')
1193 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001194 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001195 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001196 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001197 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001198 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001199 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001200
1201 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1202 f('::254.42.23.64')
1203 )
1204 self.assertEqual(
1205 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1206 f('42::a29b:254.42.23.64')
1207 )
1208 self.assertEqual(
1209 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1210 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1211 )
1212 assertInvalid('255.254.253.252')
1213 assertInvalid('1::260.2.3.0')
1214 assertInvalid('1::0.be.e.0')
1215 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1216 assertInvalid('::1.2.3.4:0')
1217 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001218
Serhiy Storchaka43767632013-11-03 21:31:38 +02001219 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1220 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001221 def testStringToIPv4(self):
1222 from socket import inet_ntoa as f, inet_ntop, AF_INET
1223 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001224 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001225 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001226 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001227
Ezio Melottib3aedd42010-11-20 19:04:17 +00001228 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1229 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1230 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1231 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001232 assertInvalid(f, b'\x00' * 3)
1233 assertInvalid(f, b'\x00' * 5)
1234 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001235 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001236
Ezio Melottib3aedd42010-11-20 19:04:17 +00001237 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1238 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1239 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001240 assertInvalid(g, b'\x00' * 3)
1241 assertInvalid(g, b'\x00' * 5)
1242 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001243 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001244
Serhiy Storchaka43767632013-11-03 21:31:38 +02001245 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1246 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001247 def testStringToIPv6(self):
1248 try:
1249 from socket import inet_ntop, AF_INET6, has_ipv6
1250 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001251 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001252 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001253 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001254
1255 if sys.platform == "win32":
1256 try:
1257 inet_ntop(AF_INET6, b'\x00' * 16)
1258 except OSError as e:
1259 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001260 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001261
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001262 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001263 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001264 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001265 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001266
Ezio Melottib3aedd42010-11-20 19:04:17 +00001267 self.assertEqual('::', f(b'\x00' * 16))
1268 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1269 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001270 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001271 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 +00001272 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001273 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001274
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001275 assertInvalid(b'\x12' * 15)
1276 assertInvalid(b'\x12' * 17)
1277 assertInvalid(b'\x12' * 4)
1278
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001279 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001280
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001281 def testSockName(self):
1282 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001283 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001284 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001285 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001286 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001287 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001288 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1289 # it reasonable to get the host's addr in addition to 0.0.0.0.
1290 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001291 try:
1292 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001293 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001294 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001295 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001296 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001297 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001298
1299 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001300 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001301 # We know a socket should start without reuse==0
1302 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001303 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001304 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001305 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001306
1307 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001308 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001309 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001310 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001311 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1312 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001313 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001314
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001315 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001316 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001317 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1318 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001319 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001320
Martin Panter50ab1a32016-04-11 00:38:12 +00001321 def testCloseException(self):
1322 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001323 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001324 socket.socket(fileno=sock.fileno()).close()
1325 try:
1326 sock.close()
1327 except OSError as err:
1328 # Winsock apparently raises ENOTSOCK
1329 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1330 else:
1331 self.fail("close() should raise EBADF/ENOTSOCK")
1332
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001333 def testNewAttributes(self):
1334 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001335
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001336 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1337 self.assertEqual(sock.family, socket.AF_INET)
1338 if hasattr(socket, 'SOCK_CLOEXEC'):
1339 self.assertIn(sock.type,
1340 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1341 socket.SOCK_STREAM))
1342 else:
1343 self.assertEqual(sock.type, socket.SOCK_STREAM)
1344 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001345
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001346 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001347 sock = socket.socket()
1348 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001349 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001350 big_port = port + 65536
1351 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001352 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1353 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1354 # Since find_unused_port() is inherently subject to race conditions, we
1355 # call it a couple times if necessary.
1356 for i in itertools.count():
1357 port = support.find_unused_port()
1358 try:
1359 sock.bind((HOST, port))
1360 except OSError as e:
1361 if e.errno != errno.EADDRINUSE or i == 5:
1362 raise
1363 else:
1364 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001365
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001366 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001367 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001368 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1369 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1370 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1371 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001372 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1373 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001374 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001375 self.assertRaises(ValueError, s.ioctl, -1, None)
1376 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001377
Steve Dowerea93ac02016-06-17 12:52:18 -07001378 @unittest.skipUnless(os.name == "nt", "Windows specific")
1379 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1380 'Loopback fast path support required for this test')
1381 def test_sio_loopback_fast_path(self):
1382 s = socket.socket()
1383 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001384 try:
1385 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1386 except OSError as exc:
1387 WSAEOPNOTSUPP = 10045
1388 if exc.winerror == WSAEOPNOTSUPP:
1389 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1390 "doesn't implemented in this Windows version")
1391 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001392 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1393
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001394 def testGetaddrinfo(self):
1395 try:
1396 socket.getaddrinfo('localhost', 80)
1397 except socket.gaierror as err:
1398 if err.errno == socket.EAI_SERVICE:
1399 # see http://bugs.python.org/issue1282647
1400 self.skipTest("buggy libc version")
1401 raise
1402 # len of every sequence is supposed to be == 5
1403 for info in socket.getaddrinfo(HOST, None):
1404 self.assertEqual(len(info), 5)
1405 # host can be a domain name, a string representation of an
1406 # IPv4/v6 address or None
1407 socket.getaddrinfo('localhost', 80)
1408 socket.getaddrinfo('127.0.0.1', 80)
1409 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001410 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001411 socket.getaddrinfo('::1', 80)
1412 # port can be a string service name such as "http", a numeric
1413 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001414 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1415 if (not hasattr(sys, 'getandroidapilevel') or
1416 sys.getandroidapilevel() >= 23):
1417 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001418 socket.getaddrinfo(HOST, 80)
1419 socket.getaddrinfo(HOST, None)
1420 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001421 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1422 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001423 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001424 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1425 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001426 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001427 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1428 for _, socktype, _, _, _ in infos:
1429 self.assertEqual(socktype, socket.SOCK_STREAM)
1430 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001431 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001432 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1433 # a server willing to support both IPv4 and IPv6 will
1434 # usually do this
1435 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1436 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001437 # test keyword arguments
1438 a = socket.getaddrinfo(HOST, None)
1439 b = socket.getaddrinfo(host=HOST, port=None)
1440 self.assertEqual(a, b)
1441 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1442 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1443 self.assertEqual(a, b)
1444 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1445 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1446 self.assertEqual(a, b)
1447 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1448 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1449 self.assertEqual(a, b)
1450 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1451 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1452 self.assertEqual(a, b)
1453 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1454 socket.AI_PASSIVE)
1455 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1456 type=socket.SOCK_STREAM, proto=0,
1457 flags=socket.AI_PASSIVE)
1458 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001459 # Issue #6697.
1460 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001461
Ned Deilyb24f4812014-02-13 22:50:42 -08001462 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001463 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001464 try:
1465 # The arguments here are undefined and the call may succeed
1466 # or fail. All we care here is that it doesn't segfault.
1467 socket.getaddrinfo("localhost", None, 0, 0, 0,
1468 socket.AI_NUMERICSERV)
1469 except socket.gaierror:
1470 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001471
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001472 def test_getnameinfo(self):
1473 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001474 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001475
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001476 @unittest.skipUnless(support.is_resource_enabled('network'),
1477 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001478 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001479 # Check for internet access before running test
1480 # (issue #12804, issue #25138).
1481 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001482 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001483
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001484 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001485 domain = 'испытание.pythontest.net'
1486 socket.gethostbyname(domain)
1487 socket.gethostbyname_ex(domain)
1488 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001489 # 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 +00001490 # have a reverse entry yet
1491 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001492
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001493 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001494 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001495 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1496 self.skipTest("signal.alarm and socket.socketpair required for this test")
1497 # Our signal handlers clobber the C errno by calling a math function
1498 # with an invalid domain value.
1499 def ok_handler(*args):
1500 self.assertRaises(ValueError, math.acosh, 0)
1501 def raising_handler(*args):
1502 self.assertRaises(ValueError, math.acosh, 0)
1503 1 // 0
1504 c, s = socket.socketpair()
1505 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1506 try:
1507 if with_timeout:
1508 # Just above the one second minimum for signal.alarm
1509 c.settimeout(1.5)
1510 with self.assertRaises(ZeroDivisionError):
1511 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001512 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001513 if with_timeout:
1514 signal.signal(signal.SIGALRM, ok_handler)
1515 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001516 self.assertRaises(socket.timeout, c.sendall,
1517 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001518 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001519 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001520 signal.signal(signal.SIGALRM, old_alarm)
1521 c.close()
1522 s.close()
1523
1524 def test_sendall_interrupted(self):
1525 self.check_sendall_interrupted(False)
1526
1527 def test_sendall_interrupted_with_timeout(self):
1528 self.check_sendall_interrupted(True)
1529
Antoine Pitroue033e062010-10-29 10:38:18 +00001530 def test_dealloc_warn(self):
1531 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1532 r = repr(sock)
1533 with self.assertWarns(ResourceWarning) as cm:
1534 sock = None
1535 support.gc_collect()
1536 self.assertIn(r, str(cm.warning.args[0]))
1537 # An open socket file object gets dereferenced after the socket
1538 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1539 f = sock.makefile('rb')
1540 r = repr(sock)
1541 sock = None
1542 support.gc_collect()
1543 with self.assertWarns(ResourceWarning):
1544 f = None
1545 support.gc_collect()
1546
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001547 def test_name_closed_socketio(self):
1548 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1549 fp = sock.makefile("rb")
1550 fp.close()
1551 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1552
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001553 def test_unusable_closed_socketio(self):
1554 with socket.socket() as sock:
1555 fp = sock.makefile("rb", buffering=0)
1556 self.assertTrue(fp.readable())
1557 self.assertFalse(fp.writable())
1558 self.assertFalse(fp.seekable())
1559 fp.close()
1560 self.assertRaises(ValueError, fp.readable)
1561 self.assertRaises(ValueError, fp.writable)
1562 self.assertRaises(ValueError, fp.seekable)
1563
Christian Heimesd0e31b92018-01-27 09:54:13 +01001564 def test_socket_close(self):
1565 sock = socket.socket()
1566 try:
1567 sock.bind((HOST, 0))
1568 socket.close(sock.fileno())
1569 with self.assertRaises(OSError):
1570 sock.listen(1)
1571 finally:
1572 with self.assertRaises(OSError):
1573 # sock.close() fails with EBADF
1574 sock.close()
1575 with self.assertRaises(TypeError):
1576 socket.close(None)
1577 with self.assertRaises(OSError):
1578 socket.close(-1)
1579
Berker Peksag3fe64d02016-02-18 17:34:00 +02001580 def test_makefile_mode(self):
1581 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1582 with self.subTest(mode=mode):
1583 with socket.socket() as sock:
1584 with sock.makefile(mode) as fp:
1585 self.assertEqual(fp.mode, mode)
1586
1587 def test_makefile_invalid_mode(self):
1588 for mode in 'rt', 'x', '+', 'a':
1589 with self.subTest(mode=mode):
1590 with socket.socket() as sock:
1591 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1592 sock.makefile(mode)
1593
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001594 def test_pickle(self):
1595 sock = socket.socket()
1596 with sock:
1597 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1598 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001599 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1600 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1601 self.assertEqual(family, socket.AF_INET)
1602 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1603 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001604
Serhiy Storchaka78980432013-01-15 01:12:17 +02001605 def test_listen_backlog(self):
1606 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001607 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1608 srv.bind((HOST, 0))
1609 srv.listen(backlog)
1610
1611 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001612 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001613 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001614
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001615 @support.cpython_only
1616 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001617 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001618 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001619 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1620 srv.bind((HOST, 0))
1621 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001622
Charles-François Natali42663332012-01-02 15:57:30 +01001623 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001624 def test_flowinfo(self):
1625 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001626 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001627 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001628 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001629
Коренберг Марк7766b962018-02-13 00:47:42 +05001630 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1631 def test_getaddrinfo_ipv6_basic(self):
1632 ((*_, sockaddr),) = socket.getaddrinfo(
1633 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1634 1234, socket.AF_INET6,
1635 socket.SOCK_DGRAM,
1636 socket.IPPROTO_UDP
1637 )
1638 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1639
1640 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1641 @unittest.skipUnless(
1642 hasattr(socket, 'if_nameindex'),
1643 'if_nameindex is not supported')
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.')
1675 @unittest.skipUnless(
1676 hasattr(socket, 'if_nameindex'),
1677 'if_nameindex is not supported')
Michael Felt56614592018-12-26 04:34:37 +01001678 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001679 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1680 # Just pick up any network interface.
1681 (ifindex, test_interface) = socket.if_nameindex()[0]
1682 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1683 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1684 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1685
1686 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001687 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001688 'Numeric scope id does not work or undocumented')
1689 def test_getnameinfo_ipv6_scopeid_numeric(self):
1690 # Also works on Linux (undocumented), but does not work on Mac OS X
1691 # Windows and Linux allow nonexistent interface numbers here.
1692 ifindex = 42
1693 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1694 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1695 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1696
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001697 def test_str_for_enums(self):
1698 # Make sure that the AF_* and SOCK_* constants have enum-like string
1699 # reprs.
1700 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1701 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001702 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001703
Yury Selivanov98181422017-12-18 20:02:54 -05001704 def test_socket_consistent_sock_type(self):
1705 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1706 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1707 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1708
1709 with socket.socket(socket.AF_INET, sock_type) as s:
1710 self.assertEqual(s.type, socket.SOCK_STREAM)
1711 s.settimeout(1)
1712 self.assertEqual(s.type, socket.SOCK_STREAM)
1713 s.settimeout(0)
1714 self.assertEqual(s.type, socket.SOCK_STREAM)
1715 s.setblocking(True)
1716 self.assertEqual(s.type, socket.SOCK_STREAM)
1717 s.setblocking(False)
1718 self.assertEqual(s.type, socket.SOCK_STREAM)
1719
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001720 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001721 # Test that when created with a family that's not one of the known
1722 # AF_*/SOCK_* constants, socket.family just returns the number.
1723 #
1724 # To do this we fool socket.socket into believing it already has an
1725 # open fd because on this path it doesn't actually verify the family and
1726 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001727 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1728 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001729 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1730
1731 unknown_type = max(
1732 kind
1733 for name, kind in socket.SocketKind.__members__.items()
1734 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1735 ) + 1
1736
1737 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001738 family=unknown_family, type=unknown_type, proto=23,
1739 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001740 self.assertEqual(s.family, unknown_family)
1741 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001742 # some OS like macOS ignore proto
1743 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001744
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001745 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1746 def test__sendfile_use_sendfile(self):
1747 class File:
1748 def __init__(self, fd):
1749 self.fd = fd
1750
1751 def fileno(self):
1752 return self.fd
1753 with socket.socket() as sock:
1754 fd = os.open(os.curdir, os.O_RDONLY)
1755 os.close(fd)
1756 with self.assertRaises(socket._GiveupOnSendfile):
1757 sock._sendfile_use_sendfile(File(fd))
1758 with self.assertRaises(OverflowError):
1759 sock._sendfile_use_sendfile(File(2**1000))
1760 with self.assertRaises(TypeError):
1761 sock._sendfile_use_sendfile(File(None))
1762
Christian Heimesb6e43af2018-01-29 22:37:58 +01001763 def _test_socket_fileno(self, s, family, stype):
1764 self.assertEqual(s.family, family)
1765 self.assertEqual(s.type, stype)
1766
1767 fd = s.fileno()
1768 s2 = socket.socket(fileno=fd)
1769 self.addCleanup(s2.close)
1770 # detach old fd to avoid double close
1771 s.detach()
1772 self.assertEqual(s2.family, family)
1773 self.assertEqual(s2.type, stype)
1774 self.assertEqual(s2.fileno(), fd)
1775
1776 def test_socket_fileno(self):
1777 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1778 self.addCleanup(s.close)
1779 s.bind((support.HOST, 0))
1780 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1781
1782 if hasattr(socket, "SOCK_DGRAM"):
1783 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1784 self.addCleanup(s.close)
1785 s.bind((support.HOST, 0))
1786 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1787
1788 if support.IPV6_ENABLED:
1789 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1790 self.addCleanup(s.close)
1791 s.bind((support.HOSTv6, 0, 0, 0))
1792 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1793
1794 if hasattr(socket, "AF_UNIX"):
1795 tmpdir = tempfile.mkdtemp()
1796 self.addCleanup(shutil.rmtree, tmpdir)
1797 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1798 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001799 try:
1800 s.bind(os.path.join(tmpdir, 'socket'))
1801 except PermissionError:
1802 pass
1803 else:
1804 self._test_socket_fileno(s, socket.AF_UNIX,
1805 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001806
Dima Tisneke9912702018-12-17 22:07:55 +09001807 def test_socket_fileno_rejects_float(self):
1808 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1809 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1810
1811 def test_socket_fileno_rejects_other_types(self):
1812 with self.assertRaisesRegex(TypeError, "integer is required"):
1813 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1814
1815 def test_socket_fileno_rejects_invalid_socket(self):
1816 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1817 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1818
1819 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1820 def test_socket_fileno_rejects_negative(self):
1821 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1822 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1823
1824 def test_socket_fileno_requires_valid_fd(self):
1825 WSAENOTSOCK = 10038
1826 with self.assertRaises(OSError) as cm:
1827 socket.socket(fileno=support.make_bad_fd())
1828 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1829
1830 with self.assertRaises(OSError) as cm:
1831 socket.socket(
1832 socket.AF_INET,
1833 socket.SOCK_STREAM,
1834 fileno=support.make_bad_fd())
1835 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1836
1837 def test_socket_fileno_requires_socket_fd(self):
1838 with tempfile.NamedTemporaryFile() as afile:
1839 with self.assertRaises(OSError):
1840 socket.socket(fileno=afile.fileno())
1841
1842 with self.assertRaises(OSError) as cm:
1843 socket.socket(
1844 socket.AF_INET,
1845 socket.SOCK_STREAM,
1846 fileno=afile.fileno())
1847 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1848
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001849
Charles-François Natali47413c12011-10-06 19:47:44 +02001850@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1851class BasicCANTest(unittest.TestCase):
1852
1853 def testCrucialConstants(self):
1854 socket.AF_CAN
1855 socket.PF_CAN
1856 socket.CAN_RAW
1857
Charles-François Natali773e42d2013-02-05 19:42:01 +01001858 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1859 'socket.CAN_BCM required for this test.')
1860 def testBCMConstants(self):
1861 socket.CAN_BCM
1862
1863 # opcodes
1864 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1865 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1866 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1867 socket.CAN_BCM_TX_SEND # send one CAN frame
1868 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1869 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1870 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1871 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1872 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1873 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1874 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1875 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1876
Charles-François Natali47413c12011-10-06 19:47:44 +02001877 def testCreateSocket(self):
1878 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1879 pass
1880
Charles-François Natali773e42d2013-02-05 19:42:01 +01001881 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1882 'socket.CAN_BCM required for this test.')
1883 def testCreateBCMSocket(self):
1884 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1885 pass
1886
Charles-François Natali47413c12011-10-06 19:47:44 +02001887 def testBindAny(self):
1888 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1889 s.bind(('', ))
1890
1891 def testTooLongInterfaceName(self):
1892 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1893 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001894 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001895 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001896
1897 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1898 'socket.CAN_RAW_LOOPBACK required for this test.')
1899 def testLoopback(self):
1900 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1901 for loopback in (0, 1):
1902 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1903 loopback)
1904 self.assertEqual(loopback,
1905 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1906
1907 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1908 'socket.CAN_RAW_FILTER required for this test.')
1909 def testFilter(self):
1910 can_id, can_mask = 0x200, 0x700
1911 can_filter = struct.pack("=II", can_id, can_mask)
1912 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1913 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1914 self.assertEqual(can_filter,
1915 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001916 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001917
1918
1919@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001920class CANTest(ThreadedCANSocketTest):
1921
Charles-François Natali47413c12011-10-06 19:47:44 +02001922 def __init__(self, methodName='runTest'):
1923 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1924
1925 @classmethod
1926 def build_can_frame(cls, can_id, data):
1927 """Build a CAN frame."""
1928 can_dlc = len(data)
1929 data = data.ljust(8, b'\x00')
1930 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1931
1932 @classmethod
1933 def dissect_can_frame(cls, frame):
1934 """Dissect a CAN frame."""
1935 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1936 return (can_id, can_dlc, data[:can_dlc])
1937
1938 def testSendFrame(self):
1939 cf, addr = self.s.recvfrom(self.bufsize)
1940 self.assertEqual(self.cf, cf)
1941 self.assertEqual(addr[0], self.interface)
1942 self.assertEqual(addr[1], socket.AF_CAN)
1943
1944 def _testSendFrame(self):
1945 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1946 self.cli.send(self.cf)
1947
1948 def testSendMaxFrame(self):
1949 cf, addr = self.s.recvfrom(self.bufsize)
1950 self.assertEqual(self.cf, cf)
1951
1952 def _testSendMaxFrame(self):
1953 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1954 self.cli.send(self.cf)
1955
1956 def testSendMultiFrames(self):
1957 cf, addr = self.s.recvfrom(self.bufsize)
1958 self.assertEqual(self.cf1, cf)
1959
1960 cf, addr = self.s.recvfrom(self.bufsize)
1961 self.assertEqual(self.cf2, cf)
1962
1963 def _testSendMultiFrames(self):
1964 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1965 self.cli.send(self.cf1)
1966
1967 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1968 self.cli.send(self.cf2)
1969
Charles-François Natali773e42d2013-02-05 19:42:01 +01001970 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1971 'socket.CAN_BCM required for this test.')
1972 def _testBCM(self):
1973 cf, addr = self.cli.recvfrom(self.bufsize)
1974 self.assertEqual(self.cf, cf)
1975 can_id, can_dlc, data = self.dissect_can_frame(cf)
1976 self.assertEqual(self.can_id, can_id)
1977 self.assertEqual(self.data, data)
1978
1979 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1980 'socket.CAN_BCM required for this test.')
1981 def testBCM(self):
1982 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1983 self.addCleanup(bcm.close)
1984 bcm.connect((self.interface,))
1985 self.can_id = 0x123
1986 self.data = bytes([0xc0, 0xff, 0xee])
1987 self.cf = self.build_can_frame(self.can_id, self.data)
1988 opcode = socket.CAN_BCM_TX_SEND
1989 flags = 0
1990 count = 0
1991 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1992 bcm_can_id = 0x0222
1993 nframes = 1
1994 assert len(self.cf) == 16
1995 header = struct.pack(self.bcm_cmd_msg_fmt,
1996 opcode,
1997 flags,
1998 count,
1999 ival1_seconds,
2000 ival1_usec,
2001 ival2_seconds,
2002 ival2_usec,
2003 bcm_can_id,
2004 nframes,
2005 )
2006 header_plus_frame = header + self.cf
2007 bytes_sent = bcm.send(header_plus_frame)
2008 self.assertEqual(bytes_sent, len(header_plus_frame))
2009
Charles-François Natali47413c12011-10-06 19:47:44 +02002010
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002011@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2012class ISOTPTest(unittest.TestCase):
2013
2014 def __init__(self, *args, **kwargs):
2015 super().__init__(*args, **kwargs)
2016 self.interface = "vcan0"
2017
2018 def testCrucialConstants(self):
2019 socket.AF_CAN
2020 socket.PF_CAN
2021 socket.CAN_ISOTP
2022 socket.SOCK_DGRAM
2023
2024 def testCreateSocket(self):
2025 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2026 pass
2027
2028 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2029 'socket.CAN_ISOTP required for this test.')
2030 def testCreateISOTPSocket(self):
2031 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2032 pass
2033
2034 def testTooLongInterfaceName(self):
2035 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2036 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2037 with self.assertRaisesRegex(OSError, 'interface name too long'):
2038 s.bind(('x' * 1024, 1, 2))
2039
2040 def testBind(self):
2041 try:
2042 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2043 addr = self.interface, 0x123, 0x456
2044 s.bind(addr)
2045 self.assertEqual(s.getsockname(), addr)
2046 except OSError as e:
2047 if e.errno == errno.ENODEV:
2048 self.skipTest('network interface `%s` does not exist' %
2049 self.interface)
2050 else:
2051 raise
2052
2053
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002054@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2055class BasicRDSTest(unittest.TestCase):
2056
2057 def testCrucialConstants(self):
2058 socket.AF_RDS
2059 socket.PF_RDS
2060
2061 def testCreateSocket(self):
2062 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2063 pass
2064
2065 def testSocketBufferSize(self):
2066 bufsize = 16384
2067 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2068 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2069 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2070
2071
2072@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002073class RDSTest(ThreadedRDSSocketTest):
2074
2075 def __init__(self, methodName='runTest'):
2076 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2077
Charles-François Natali240c55f2011-11-10 20:33:36 +01002078 def setUp(self):
2079 super().setUp()
2080 self.evt = threading.Event()
2081
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002082 def testSendAndRecv(self):
2083 data, addr = self.serv.recvfrom(self.bufsize)
2084 self.assertEqual(self.data, data)
2085 self.assertEqual(self.cli_addr, addr)
2086
2087 def _testSendAndRecv(self):
2088 self.data = b'spam'
2089 self.cli.sendto(self.data, 0, (HOST, self.port))
2090
2091 def testPeek(self):
2092 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2093 self.assertEqual(self.data, data)
2094 data, addr = self.serv.recvfrom(self.bufsize)
2095 self.assertEqual(self.data, data)
2096
2097 def _testPeek(self):
2098 self.data = b'spam'
2099 self.cli.sendto(self.data, 0, (HOST, self.port))
2100
2101 @requireAttrs(socket.socket, 'recvmsg')
2102 def testSendAndRecvMsg(self):
2103 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2104 self.assertEqual(self.data, data)
2105
2106 @requireAttrs(socket.socket, 'sendmsg')
2107 def _testSendAndRecvMsg(self):
2108 self.data = b'hello ' * 10
2109 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2110
2111 def testSendAndRecvMulti(self):
2112 data, addr = self.serv.recvfrom(self.bufsize)
2113 self.assertEqual(self.data1, data)
2114
2115 data, addr = self.serv.recvfrom(self.bufsize)
2116 self.assertEqual(self.data2, data)
2117
2118 def _testSendAndRecvMulti(self):
2119 self.data1 = b'bacon'
2120 self.cli.sendto(self.data1, 0, (HOST, self.port))
2121
2122 self.data2 = b'egg'
2123 self.cli.sendto(self.data2, 0, (HOST, self.port))
2124
2125 def testSelect(self):
2126 r, w, x = select.select([self.serv], [], [], 3.0)
2127 self.assertIn(self.serv, r)
2128 data, addr = self.serv.recvfrom(self.bufsize)
2129 self.assertEqual(self.data, data)
2130
2131 def _testSelect(self):
2132 self.data = b'select'
2133 self.cli.sendto(self.data, 0, (HOST, self.port))
2134
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002135@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2136 'QIPCRTR sockets required for this test.')
2137class BasicQIPCRTRTest(unittest.TestCase):
2138
2139 def testCrucialConstants(self):
2140 socket.AF_QIPCRTR
2141
2142 def testCreateSocket(self):
2143 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2144 pass
2145
2146 def testUnbound(self):
2147 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2148 self.assertEqual(s.getsockname()[1], 0)
2149
2150 def testBindSock(self):
2151 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2152 support.bind_port(s, host=s.getsockname()[0])
2153 self.assertNotEqual(s.getsockname()[1], 0)
2154
2155 def testInvalidBindSock(self):
2156 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2157 self.assertRaises(OSError, support.bind_port, s, host=-2)
2158
2159 def testAutoBindSock(self):
2160 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2161 s.connect((123, 123))
2162 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002163
caaveryeffc12f2017-09-06 18:18:10 -04002164@unittest.skipIf(fcntl is None, "need fcntl")
2165@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2166 'VSOCK sockets required for this test.')
2167class BasicVSOCKTest(unittest.TestCase):
2168
2169 def testCrucialConstants(self):
2170 socket.AF_VSOCK
2171
2172 def testVSOCKConstants(self):
2173 socket.SO_VM_SOCKETS_BUFFER_SIZE
2174 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2175 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2176 socket.VMADDR_CID_ANY
2177 socket.VMADDR_PORT_ANY
2178 socket.VMADDR_CID_HOST
2179 socket.VM_SOCKETS_INVALID_VERSION
2180 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2181
2182 def testCreateSocket(self):
2183 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2184 pass
2185
2186 def testSocketBufferSize(self):
2187 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2188 orig_max = s.getsockopt(socket.AF_VSOCK,
2189 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2190 orig = s.getsockopt(socket.AF_VSOCK,
2191 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2192 orig_min = s.getsockopt(socket.AF_VSOCK,
2193 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2194
2195 s.setsockopt(socket.AF_VSOCK,
2196 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2197 s.setsockopt(socket.AF_VSOCK,
2198 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2199 s.setsockopt(socket.AF_VSOCK,
2200 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2201
2202 self.assertEqual(orig_max * 2,
2203 s.getsockopt(socket.AF_VSOCK,
2204 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2205 self.assertEqual(orig * 2,
2206 s.getsockopt(socket.AF_VSOCK,
2207 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2208 self.assertEqual(orig_min * 2,
2209 s.getsockopt(socket.AF_VSOCK,
2210 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2211
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002212
Guido van Rossum24e4af82002-06-12 19:18:08 +00002213class BasicTCPTest(SocketConnectedTest):
2214
2215 def __init__(self, methodName='runTest'):
2216 SocketConnectedTest.__init__(self, methodName=methodName)
2217
2218 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002219 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002220 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002221 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002222
2223 def _testRecv(self):
2224 self.serv_conn.send(MSG)
2225
2226 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002227 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002228 seg1 = self.cli_conn.recv(len(MSG) - 3)
2229 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002230 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002231 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002232
2233 def _testOverFlowRecv(self):
2234 self.serv_conn.send(MSG)
2235
2236 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002237 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002238 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002239 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002240
2241 def _testRecvFrom(self):
2242 self.serv_conn.send(MSG)
2243
2244 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002245 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002246 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2247 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002248 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002249 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002250
2251 def _testOverFlowRecvFrom(self):
2252 self.serv_conn.send(MSG)
2253
2254 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002255 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002256 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002257 while 1:
2258 read = self.cli_conn.recv(1024)
2259 if not read:
2260 break
Guido van Rossume531e292002-08-08 20:28:34 +00002261 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002262 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002263
2264 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002265 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002266 self.serv_conn.sendall(big_chunk)
2267
2268 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002269 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002270 fd = self.cli_conn.fileno()
2271 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002272 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002273 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002274 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002275 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002276
2277 def _testFromFd(self):
2278 self.serv_conn.send(MSG)
2279
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002280 def testDup(self):
2281 # Testing dup()
2282 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002283 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002284 msg = sock.recv(1024)
2285 self.assertEqual(msg, MSG)
2286
2287 def _testDup(self):
2288 self.serv_conn.send(MSG)
2289
Guido van Rossum24e4af82002-06-12 19:18:08 +00002290 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002291 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002292 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002293 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002294 # wait for _testShutdown to finish: on OS X, when the server
2295 # closes the connection the client also becomes disconnected,
2296 # and the client's shutdown call will fail. (Issue #4397.)
2297 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002298
2299 def _testShutdown(self):
2300 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002301 self.serv_conn.shutdown(2)
2302
2303 testShutdown_overflow = support.cpython_only(testShutdown)
2304
2305 @support.cpython_only
2306 def _testShutdown_overflow(self):
2307 import _testcapi
2308 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002309 # Issue 15989
2310 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2311 _testcapi.INT_MAX + 1)
2312 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2313 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002314 self.serv_conn.shutdown(2)
2315
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002316 def testDetach(self):
2317 # Testing detach()
2318 fileno = self.cli_conn.fileno()
2319 f = self.cli_conn.detach()
2320 self.assertEqual(f, fileno)
2321 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002322 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002323 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002324 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002325 # ...but we can create another socket using the (still open)
2326 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002327 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002328 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002329 msg = sock.recv(1024)
2330 self.assertEqual(msg, MSG)
2331
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002332 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002333 self.serv_conn.send(MSG)
2334
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002335
Guido van Rossum24e4af82002-06-12 19:18:08 +00002336class BasicUDPTest(ThreadedUDPSocketTest):
2337
2338 def __init__(self, methodName='runTest'):
2339 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2340
2341 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002342 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002343 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002344 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002345
2346 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002347 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002348
Guido van Rossum1c938012002-06-12 21:17:20 +00002349 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002350 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002351 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002352 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002353
Guido van Rossum1c938012002-06-12 21:17:20 +00002354 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002355 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002356
Guido van Rossumd8faa362007-04-27 19:54:29 +00002357 def testRecvFromNegative(self):
2358 # Negative lengths passed to recvfrom should give ValueError.
2359 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2360
2361 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002362 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002363
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002364# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2365# same test code is used with different families and types of socket
2366# (e.g. stream, datagram), and tests using recvmsg() are repeated
2367# using recvmsg_into().
2368#
2369# The generic test classes such as SendmsgTests and
2370# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2371# supplied with sockets cli_sock and serv_sock representing the
2372# client's and the server's end of the connection respectively, and
2373# attributes cli_addr and serv_addr holding their (numeric where
2374# appropriate) addresses.
2375#
2376# The final concrete test classes combine these with subclasses of
2377# SocketTestBase which set up client and server sockets of a specific
2378# type, and with subclasses of SendrecvmsgBase such as
2379# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2380# sockets to cli_sock and serv_sock and override the methods and
2381# attributes of SendrecvmsgBase to fill in destination addresses if
2382# needed when sending, check for specific flags in msg_flags, etc.
2383#
2384# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2385# recvmsg_into().
2386
2387# XXX: like the other datagram (UDP) tests in this module, the code
2388# here assumes that datagram delivery on the local machine will be
2389# reliable.
2390
2391class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2392 # Base class for sendmsg()/recvmsg() tests.
2393
2394 # Time in seconds to wait before considering a test failed, or
2395 # None for no timeout. Not all tests actually set a timeout.
2396 fail_timeout = 3.0
2397
2398 def setUp(self):
2399 self.misc_event = threading.Event()
2400 super().setUp()
2401
2402 def sendToServer(self, msg):
2403 # Send msg to the server.
2404 return self.cli_sock.send(msg)
2405
2406 # Tuple of alternative default arguments for sendmsg() when called
2407 # via sendmsgToServer() (e.g. to include a destination address).
2408 sendmsg_to_server_defaults = ()
2409
2410 def sendmsgToServer(self, *args):
2411 # Call sendmsg() on self.cli_sock with the given arguments,
2412 # filling in any arguments which are not supplied with the
2413 # corresponding items of self.sendmsg_to_server_defaults, if
2414 # any.
2415 return self.cli_sock.sendmsg(
2416 *(args + self.sendmsg_to_server_defaults[len(args):]))
2417
2418 def doRecvmsg(self, sock, bufsize, *args):
2419 # Call recvmsg() on sock with given arguments and return its
2420 # result. Should be used for tests which can use either
2421 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2422 # this method with one which emulates it using recvmsg_into(),
2423 # thus allowing the same test to be used for both methods.
2424 result = sock.recvmsg(bufsize, *args)
2425 self.registerRecvmsgResult(result)
2426 return result
2427
2428 def registerRecvmsgResult(self, result):
2429 # Called by doRecvmsg() with the return value of recvmsg() or
2430 # recvmsg_into(). Can be overridden to arrange cleanup based
2431 # on the returned ancillary data, for instance.
2432 pass
2433
2434 def checkRecvmsgAddress(self, addr1, addr2):
2435 # Called to compare the received address with the address of
2436 # the peer.
2437 self.assertEqual(addr1, addr2)
2438
2439 # Flags that are normally unset in msg_flags
2440 msg_flags_common_unset = 0
2441 for name in ("MSG_CTRUNC", "MSG_OOB"):
2442 msg_flags_common_unset |= getattr(socket, name, 0)
2443
2444 # Flags that are normally set
2445 msg_flags_common_set = 0
2446
2447 # Flags set when a complete record has been received (e.g. MSG_EOR
2448 # for SCTP)
2449 msg_flags_eor_indicator = 0
2450
2451 # Flags set when a complete record has not been received
2452 # (e.g. MSG_TRUNC for datagram sockets)
2453 msg_flags_non_eor_indicator = 0
2454
2455 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2456 # Method to check the value of msg_flags returned by recvmsg[_into]().
2457 #
2458 # Checks that all bits in msg_flags_common_set attribute are
2459 # set in "flags" and all bits in msg_flags_common_unset are
2460 # unset.
2461 #
2462 # The "eor" argument specifies whether the flags should
2463 # indicate that a full record (or datagram) has been received.
2464 # If "eor" is None, no checks are done; otherwise, checks
2465 # that:
2466 #
2467 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2468 # set and all bits in msg_flags_non_eor_indicator are unset
2469 #
2470 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2471 # are set and all bits in msg_flags_eor_indicator are unset
2472 #
2473 # If "checkset" and/or "checkunset" are supplied, they require
2474 # the given bits to be set or unset respectively, overriding
2475 # what the attributes require for those bits.
2476 #
2477 # If any bits are set in "ignore", they will not be checked,
2478 # regardless of the other inputs.
2479 #
2480 # Will raise Exception if the inputs require a bit to be both
2481 # set and unset, and it is not ignored.
2482
2483 defaultset = self.msg_flags_common_set
2484 defaultunset = self.msg_flags_common_unset
2485
2486 if eor:
2487 defaultset |= self.msg_flags_eor_indicator
2488 defaultunset |= self.msg_flags_non_eor_indicator
2489 elif eor is not None:
2490 defaultset |= self.msg_flags_non_eor_indicator
2491 defaultunset |= self.msg_flags_eor_indicator
2492
2493 # Function arguments override defaults
2494 defaultset &= ~checkunset
2495 defaultunset &= ~checkset
2496
2497 # Merge arguments with remaining defaults, and check for conflicts
2498 checkset |= defaultset
2499 checkunset |= defaultunset
2500 inboth = checkset & checkunset & ~ignore
2501 if inboth:
2502 raise Exception("contradictory set, unset requirements for flags "
2503 "{0:#x}".format(inboth))
2504
2505 # Compare with given msg_flags value
2506 mask = (checkset | checkunset) & ~ignore
2507 self.assertEqual(flags & mask, checkset & mask)
2508
2509
2510class RecvmsgIntoMixin(SendrecvmsgBase):
2511 # Mixin to implement doRecvmsg() using recvmsg_into().
2512
2513 def doRecvmsg(self, sock, bufsize, *args):
2514 buf = bytearray(bufsize)
2515 result = sock.recvmsg_into([buf], *args)
2516 self.registerRecvmsgResult(result)
2517 self.assertGreaterEqual(result[0], 0)
2518 self.assertLessEqual(result[0], bufsize)
2519 return (bytes(buf[:result[0]]),) + result[1:]
2520
2521
2522class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2523 # Defines flags to be checked in msg_flags for datagram sockets.
2524
2525 @property
2526 def msg_flags_non_eor_indicator(self):
2527 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2528
2529
2530class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2531 # Defines flags to be checked in msg_flags for SCTP sockets.
2532
2533 @property
2534 def msg_flags_eor_indicator(self):
2535 return super().msg_flags_eor_indicator | socket.MSG_EOR
2536
2537
2538class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2539 # Base class for tests on connectionless-mode sockets. Users must
2540 # supply sockets on attributes cli and serv to be mapped to
2541 # cli_sock and serv_sock respectively.
2542
2543 @property
2544 def serv_sock(self):
2545 return self.serv
2546
2547 @property
2548 def cli_sock(self):
2549 return self.cli
2550
2551 @property
2552 def sendmsg_to_server_defaults(self):
2553 return ([], [], 0, self.serv_addr)
2554
2555 def sendToServer(self, msg):
2556 return self.cli_sock.sendto(msg, self.serv_addr)
2557
2558
2559class SendrecvmsgConnectedBase(SendrecvmsgBase):
2560 # Base class for tests on connected sockets. Users must supply
2561 # sockets on attributes serv_conn and cli_conn (representing the
2562 # connections *to* the server and the client), to be mapped to
2563 # cli_sock and serv_sock respectively.
2564
2565 @property
2566 def serv_sock(self):
2567 return self.cli_conn
2568
2569 @property
2570 def cli_sock(self):
2571 return self.serv_conn
2572
2573 def checkRecvmsgAddress(self, addr1, addr2):
2574 # Address is currently "unspecified" for a connected socket,
2575 # so we don't examine it
2576 pass
2577
2578
2579class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2580 # Base class to set a timeout on server's socket.
2581
2582 def setUp(self):
2583 super().setUp()
2584 self.serv_sock.settimeout(self.fail_timeout)
2585
2586
2587class SendmsgTests(SendrecvmsgServerTimeoutBase):
2588 # Tests for sendmsg() which can use any socket type and do not
2589 # involve recvmsg() or recvmsg_into().
2590
2591 def testSendmsg(self):
2592 # Send a simple message with sendmsg().
2593 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2594
2595 def _testSendmsg(self):
2596 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2597
2598 def testSendmsgDataGenerator(self):
2599 # Send from buffer obtained from a generator (not a sequence).
2600 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2601
2602 def _testSendmsgDataGenerator(self):
2603 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2604 len(MSG))
2605
2606 def testSendmsgAncillaryGenerator(self):
2607 # Gather (empty) ancillary data from a generator.
2608 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2609
2610 def _testSendmsgAncillaryGenerator(self):
2611 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2612 len(MSG))
2613
2614 def testSendmsgArray(self):
2615 # Send data from an array instead of the usual bytes object.
2616 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2617
2618 def _testSendmsgArray(self):
2619 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2620 len(MSG))
2621
2622 def testSendmsgGather(self):
2623 # Send message data from more than one buffer (gather write).
2624 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2625
2626 def _testSendmsgGather(self):
2627 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2628
2629 def testSendmsgBadArgs(self):
2630 # Check that sendmsg() rejects invalid arguments.
2631 self.assertEqual(self.serv_sock.recv(1000), b"done")
2632
2633 def _testSendmsgBadArgs(self):
2634 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2635 self.assertRaises(TypeError, self.sendmsgToServer,
2636 b"not in an iterable")
2637 self.assertRaises(TypeError, self.sendmsgToServer,
2638 object())
2639 self.assertRaises(TypeError, self.sendmsgToServer,
2640 [object()])
2641 self.assertRaises(TypeError, self.sendmsgToServer,
2642 [MSG, object()])
2643 self.assertRaises(TypeError, self.sendmsgToServer,
2644 [MSG], object())
2645 self.assertRaises(TypeError, self.sendmsgToServer,
2646 [MSG], [], object())
2647 self.assertRaises(TypeError, self.sendmsgToServer,
2648 [MSG], [], 0, object())
2649 self.sendToServer(b"done")
2650
2651 def testSendmsgBadCmsg(self):
2652 # Check that invalid ancillary data items are rejected.
2653 self.assertEqual(self.serv_sock.recv(1000), b"done")
2654
2655 def _testSendmsgBadCmsg(self):
2656 self.assertRaises(TypeError, self.sendmsgToServer,
2657 [MSG], [object()])
2658 self.assertRaises(TypeError, self.sendmsgToServer,
2659 [MSG], [(object(), 0, b"data")])
2660 self.assertRaises(TypeError, self.sendmsgToServer,
2661 [MSG], [(0, object(), b"data")])
2662 self.assertRaises(TypeError, self.sendmsgToServer,
2663 [MSG], [(0, 0, object())])
2664 self.assertRaises(TypeError, self.sendmsgToServer,
2665 [MSG], [(0, 0)])
2666 self.assertRaises(TypeError, self.sendmsgToServer,
2667 [MSG], [(0, 0, b"data", 42)])
2668 self.sendToServer(b"done")
2669
2670 @requireAttrs(socket, "CMSG_SPACE")
2671 def testSendmsgBadMultiCmsg(self):
2672 # Check that invalid ancillary data items are rejected when
2673 # more than one item is present.
2674 self.assertEqual(self.serv_sock.recv(1000), b"done")
2675
2676 @testSendmsgBadMultiCmsg.client_skip
2677 def _testSendmsgBadMultiCmsg(self):
2678 self.assertRaises(TypeError, self.sendmsgToServer,
2679 [MSG], [0, 0, b""])
2680 self.assertRaises(TypeError, self.sendmsgToServer,
2681 [MSG], [(0, 0, b""), object()])
2682 self.sendToServer(b"done")
2683
2684 def testSendmsgExcessCmsgReject(self):
2685 # Check that sendmsg() rejects excess ancillary data items
2686 # when the number that can be sent is limited.
2687 self.assertEqual(self.serv_sock.recv(1000), b"done")
2688
2689 def _testSendmsgExcessCmsgReject(self):
2690 if not hasattr(socket, "CMSG_SPACE"):
2691 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002692 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002693 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2694 self.assertIsNone(cm.exception.errno)
2695 self.sendToServer(b"done")
2696
2697 def testSendmsgAfterClose(self):
2698 # Check that sendmsg() fails on a closed socket.
2699 pass
2700
2701 def _testSendmsgAfterClose(self):
2702 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002703 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002704
2705
2706class SendmsgStreamTests(SendmsgTests):
2707 # Tests for sendmsg() which require a stream socket and do not
2708 # involve recvmsg() or recvmsg_into().
2709
2710 def testSendmsgExplicitNoneAddr(self):
2711 # Check that peer address can be specified as None.
2712 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2713
2714 def _testSendmsgExplicitNoneAddr(self):
2715 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2716
2717 def testSendmsgTimeout(self):
2718 # Check that timeout works with sendmsg().
2719 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2720 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2721
2722 def _testSendmsgTimeout(self):
2723 try:
2724 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002725 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002726 while True:
2727 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002728 except socket.timeout:
2729 pass
2730 except OSError as exc:
2731 if exc.errno != errno.ENOMEM:
2732 raise
2733 # bpo-33937 the test randomly fails on Travis CI with
2734 # "OSError: [Errno 12] Cannot allocate memory"
2735 else:
2736 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002737 finally:
2738 self.misc_event.set()
2739
2740 # XXX: would be nice to have more tests for sendmsg flags argument.
2741
2742 # Linux supports MSG_DONTWAIT when sending, but in general, it
2743 # only works when receiving. Could add other platforms if they
2744 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002745 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002746 "MSG_DONTWAIT not known to work on this platform when "
2747 "sending")
2748 def testSendmsgDontWait(self):
2749 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2750 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2751 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2752
2753 @testSendmsgDontWait.client_skip
2754 def _testSendmsgDontWait(self):
2755 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002756 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002757 while True:
2758 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002759 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2760 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002761 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002762 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002763 finally:
2764 self.misc_event.set()
2765
2766
2767class SendmsgConnectionlessTests(SendmsgTests):
2768 # Tests for sendmsg() which require a connectionless-mode
2769 # (e.g. datagram) socket, and do not involve recvmsg() or
2770 # recvmsg_into().
2771
2772 def testSendmsgNoDestAddr(self):
2773 # Check that sendmsg() fails when no destination address is
2774 # given for unconnected socket.
2775 pass
2776
2777 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002778 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002779 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002780 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002781 [MSG], [], 0, None)
2782
2783
2784class RecvmsgGenericTests(SendrecvmsgBase):
2785 # Tests for recvmsg() which can also be emulated using
2786 # recvmsg_into(), and can use any socket type.
2787
2788 def testRecvmsg(self):
2789 # Receive a simple message with recvmsg[_into]().
2790 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2791 self.assertEqual(msg, MSG)
2792 self.checkRecvmsgAddress(addr, self.cli_addr)
2793 self.assertEqual(ancdata, [])
2794 self.checkFlags(flags, eor=True)
2795
2796 def _testRecvmsg(self):
2797 self.sendToServer(MSG)
2798
2799 def testRecvmsgExplicitDefaults(self):
2800 # Test recvmsg[_into]() with default arguments provided explicitly.
2801 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2802 len(MSG), 0, 0)
2803 self.assertEqual(msg, MSG)
2804 self.checkRecvmsgAddress(addr, self.cli_addr)
2805 self.assertEqual(ancdata, [])
2806 self.checkFlags(flags, eor=True)
2807
2808 def _testRecvmsgExplicitDefaults(self):
2809 self.sendToServer(MSG)
2810
2811 def testRecvmsgShorter(self):
2812 # Receive a message smaller than buffer.
2813 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2814 len(MSG) + 42)
2815 self.assertEqual(msg, MSG)
2816 self.checkRecvmsgAddress(addr, self.cli_addr)
2817 self.assertEqual(ancdata, [])
2818 self.checkFlags(flags, eor=True)
2819
2820 def _testRecvmsgShorter(self):
2821 self.sendToServer(MSG)
2822
2823 def testRecvmsgTrunc(self):
2824 # Receive part of message, check for truncation indicators.
2825 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2826 len(MSG) - 3)
2827 self.assertEqual(msg, MSG[:-3])
2828 self.checkRecvmsgAddress(addr, self.cli_addr)
2829 self.assertEqual(ancdata, [])
2830 self.checkFlags(flags, eor=False)
2831
2832 def _testRecvmsgTrunc(self):
2833 self.sendToServer(MSG)
2834
2835 def testRecvmsgShortAncillaryBuf(self):
2836 # Test ancillary data buffer too small to hold any ancillary data.
2837 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2838 len(MSG), 1)
2839 self.assertEqual(msg, MSG)
2840 self.checkRecvmsgAddress(addr, self.cli_addr)
2841 self.assertEqual(ancdata, [])
2842 self.checkFlags(flags, eor=True)
2843
2844 def _testRecvmsgShortAncillaryBuf(self):
2845 self.sendToServer(MSG)
2846
2847 def testRecvmsgLongAncillaryBuf(self):
2848 # Test large ancillary data buffer.
2849 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2850 len(MSG), 10240)
2851 self.assertEqual(msg, MSG)
2852 self.checkRecvmsgAddress(addr, self.cli_addr)
2853 self.assertEqual(ancdata, [])
2854 self.checkFlags(flags, eor=True)
2855
2856 def _testRecvmsgLongAncillaryBuf(self):
2857 self.sendToServer(MSG)
2858
2859 def testRecvmsgAfterClose(self):
2860 # Check that recvmsg[_into]() fails on a closed socket.
2861 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002862 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002863
2864 def _testRecvmsgAfterClose(self):
2865 pass
2866
2867 def testRecvmsgTimeout(self):
2868 # Check that timeout works.
2869 try:
2870 self.serv_sock.settimeout(0.03)
2871 self.assertRaises(socket.timeout,
2872 self.doRecvmsg, self.serv_sock, len(MSG))
2873 finally:
2874 self.misc_event.set()
2875
2876 def _testRecvmsgTimeout(self):
2877 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2878
2879 @requireAttrs(socket, "MSG_PEEK")
2880 def testRecvmsgPeek(self):
2881 # Check that MSG_PEEK in flags enables examination of pending
2882 # data without consuming it.
2883
2884 # Receive part of data with MSG_PEEK.
2885 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2886 len(MSG) - 3, 0,
2887 socket.MSG_PEEK)
2888 self.assertEqual(msg, MSG[:-3])
2889 self.checkRecvmsgAddress(addr, self.cli_addr)
2890 self.assertEqual(ancdata, [])
2891 # Ignoring MSG_TRUNC here (so this test is the same for stream
2892 # and datagram sockets). Some wording in POSIX seems to
2893 # suggest that it needn't be set when peeking, but that may
2894 # just be a slip.
2895 self.checkFlags(flags, eor=False,
2896 ignore=getattr(socket, "MSG_TRUNC", 0))
2897
2898 # Receive all data with MSG_PEEK.
2899 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2900 len(MSG), 0,
2901 socket.MSG_PEEK)
2902 self.assertEqual(msg, MSG)
2903 self.checkRecvmsgAddress(addr, self.cli_addr)
2904 self.assertEqual(ancdata, [])
2905 self.checkFlags(flags, eor=True)
2906
2907 # Check that the same data can still be received normally.
2908 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2909 self.assertEqual(msg, MSG)
2910 self.checkRecvmsgAddress(addr, self.cli_addr)
2911 self.assertEqual(ancdata, [])
2912 self.checkFlags(flags, eor=True)
2913
2914 @testRecvmsgPeek.client_skip
2915 def _testRecvmsgPeek(self):
2916 self.sendToServer(MSG)
2917
2918 @requireAttrs(socket.socket, "sendmsg")
2919 def testRecvmsgFromSendmsg(self):
2920 # Test receiving with recvmsg[_into]() when message is sent
2921 # using sendmsg().
2922 self.serv_sock.settimeout(self.fail_timeout)
2923 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2924 self.assertEqual(msg, MSG)
2925 self.checkRecvmsgAddress(addr, self.cli_addr)
2926 self.assertEqual(ancdata, [])
2927 self.checkFlags(flags, eor=True)
2928
2929 @testRecvmsgFromSendmsg.client_skip
2930 def _testRecvmsgFromSendmsg(self):
2931 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2932
2933
2934class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2935 # Tests which require a stream socket and can use either recvmsg()
2936 # or recvmsg_into().
2937
2938 def testRecvmsgEOF(self):
2939 # Receive end-of-stream indicator (b"", peer socket closed).
2940 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2941 self.assertEqual(msg, b"")
2942 self.checkRecvmsgAddress(addr, self.cli_addr)
2943 self.assertEqual(ancdata, [])
2944 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2945
2946 def _testRecvmsgEOF(self):
2947 self.cli_sock.close()
2948
2949 def testRecvmsgOverflow(self):
2950 # Receive a message in more than one chunk.
2951 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2952 len(MSG) - 3)
2953 self.checkRecvmsgAddress(addr, self.cli_addr)
2954 self.assertEqual(ancdata, [])
2955 self.checkFlags(flags, eor=False)
2956
2957 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2958 self.checkRecvmsgAddress(addr, self.cli_addr)
2959 self.assertEqual(ancdata, [])
2960 self.checkFlags(flags, eor=True)
2961
2962 msg = seg1 + seg2
2963 self.assertEqual(msg, MSG)
2964
2965 def _testRecvmsgOverflow(self):
2966 self.sendToServer(MSG)
2967
2968
2969class RecvmsgTests(RecvmsgGenericTests):
2970 # Tests for recvmsg() which can use any socket type.
2971
2972 def testRecvmsgBadArgs(self):
2973 # Check that recvmsg() rejects invalid arguments.
2974 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2975 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2976 -1, 0, 0)
2977 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2978 len(MSG), -1, 0)
2979 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2980 [bytearray(10)], 0, 0)
2981 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2982 object(), 0, 0)
2983 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2984 len(MSG), object(), 0)
2985 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2986 len(MSG), 0, object())
2987
2988 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2989 self.assertEqual(msg, MSG)
2990 self.checkRecvmsgAddress(addr, self.cli_addr)
2991 self.assertEqual(ancdata, [])
2992 self.checkFlags(flags, eor=True)
2993
2994 def _testRecvmsgBadArgs(self):
2995 self.sendToServer(MSG)
2996
2997
2998class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2999 # Tests for recvmsg_into() which can use any socket type.
3000
3001 def testRecvmsgIntoBadArgs(self):
3002 # Check that recvmsg_into() rejects invalid arguments.
3003 buf = bytearray(len(MSG))
3004 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3005 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3006 len(MSG), 0, 0)
3007 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3008 buf, 0, 0)
3009 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3010 [object()], 0, 0)
3011 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3012 [b"I'm not writable"], 0, 0)
3013 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3014 [buf, object()], 0, 0)
3015 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3016 [buf], -1, 0)
3017 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3018 [buf], object(), 0)
3019 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3020 [buf], 0, object())
3021
3022 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3023 self.assertEqual(nbytes, len(MSG))
3024 self.assertEqual(buf, bytearray(MSG))
3025 self.checkRecvmsgAddress(addr, self.cli_addr)
3026 self.assertEqual(ancdata, [])
3027 self.checkFlags(flags, eor=True)
3028
3029 def _testRecvmsgIntoBadArgs(self):
3030 self.sendToServer(MSG)
3031
3032 def testRecvmsgIntoGenerator(self):
3033 # Receive into buffer obtained from a generator (not a sequence).
3034 buf = bytearray(len(MSG))
3035 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3036 (o for o in [buf]))
3037 self.assertEqual(nbytes, len(MSG))
3038 self.assertEqual(buf, bytearray(MSG))
3039 self.checkRecvmsgAddress(addr, self.cli_addr)
3040 self.assertEqual(ancdata, [])
3041 self.checkFlags(flags, eor=True)
3042
3043 def _testRecvmsgIntoGenerator(self):
3044 self.sendToServer(MSG)
3045
3046 def testRecvmsgIntoArray(self):
3047 # Receive into an array rather than the usual bytearray.
3048 buf = array.array("B", [0] * len(MSG))
3049 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3050 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003051 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003052 self.checkRecvmsgAddress(addr, self.cli_addr)
3053 self.assertEqual(ancdata, [])
3054 self.checkFlags(flags, eor=True)
3055
3056 def _testRecvmsgIntoArray(self):
3057 self.sendToServer(MSG)
3058
3059 def testRecvmsgIntoScatter(self):
3060 # Receive into multiple buffers (scatter write).
3061 b1 = bytearray(b"----")
3062 b2 = bytearray(b"0123456789")
3063 b3 = bytearray(b"--------------")
3064 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3065 [b1, memoryview(b2)[2:9], b3])
3066 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3067 self.assertEqual(b1, bytearray(b"Mary"))
3068 self.assertEqual(b2, bytearray(b"01 had a 9"))
3069 self.assertEqual(b3, bytearray(b"little lamb---"))
3070 self.checkRecvmsgAddress(addr, self.cli_addr)
3071 self.assertEqual(ancdata, [])
3072 self.checkFlags(flags, eor=True)
3073
3074 def _testRecvmsgIntoScatter(self):
3075 self.sendToServer(b"Mary had a little lamb")
3076
3077
3078class CmsgMacroTests(unittest.TestCase):
3079 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3080 # assumptions used by sendmsg() and recvmsg[_into](), which share
3081 # code with these functions.
3082
3083 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003084 try:
3085 import _testcapi
3086 except ImportError:
3087 socklen_t_limit = 0x7fffffff
3088 else:
3089 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003090
3091 @requireAttrs(socket, "CMSG_LEN")
3092 def testCMSG_LEN(self):
3093 # Test CMSG_LEN() with various valid and invalid values,
3094 # checking the assumptions used by recvmsg() and sendmsg().
3095 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3096 values = list(range(257)) + list(range(toobig - 257, toobig))
3097
3098 # struct cmsghdr has at least three members, two of which are ints
3099 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3100 for n in values:
3101 ret = socket.CMSG_LEN(n)
3102 # This is how recvmsg() calculates the data size
3103 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3104 self.assertLessEqual(ret, self.socklen_t_limit)
3105
3106 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3107 # sendmsg() shares code with these functions, and requires
3108 # that it reject values over the limit.
3109 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3110 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3111
3112 @requireAttrs(socket, "CMSG_SPACE")
3113 def testCMSG_SPACE(self):
3114 # Test CMSG_SPACE() with various valid and invalid values,
3115 # checking the assumptions used by sendmsg().
3116 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3117 values = list(range(257)) + list(range(toobig - 257, toobig))
3118
3119 last = socket.CMSG_SPACE(0)
3120 # struct cmsghdr has at least three members, two of which are ints
3121 self.assertGreater(last, array.array("i").itemsize * 2)
3122 for n in values:
3123 ret = socket.CMSG_SPACE(n)
3124 self.assertGreaterEqual(ret, last)
3125 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3126 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3127 self.assertLessEqual(ret, self.socklen_t_limit)
3128 last = ret
3129
3130 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3131 # sendmsg() shares code with these functions, and requires
3132 # that it reject values over the limit.
3133 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3134 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3135
3136
3137class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3138 # Tests for file descriptor passing on Unix-domain sockets.
3139
3140 # Invalid file descriptor value that's unlikely to evaluate to a
3141 # real FD even if one of its bytes is replaced with a different
3142 # value (which shouldn't actually happen).
3143 badfd = -0x5555
3144
3145 def newFDs(self, n):
3146 # Return a list of n file descriptors for newly-created files
3147 # containing their list indices as ASCII numbers.
3148 fds = []
3149 for i in range(n):
3150 fd, path = tempfile.mkstemp()
3151 self.addCleanup(os.unlink, path)
3152 self.addCleanup(os.close, fd)
3153 os.write(fd, str(i).encode())
3154 fds.append(fd)
3155 return fds
3156
3157 def checkFDs(self, fds):
3158 # Check that the file descriptors in the given list contain
3159 # their correct list indices as ASCII numbers.
3160 for n, fd in enumerate(fds):
3161 os.lseek(fd, 0, os.SEEK_SET)
3162 self.assertEqual(os.read(fd, 1024), str(n).encode())
3163
3164 def registerRecvmsgResult(self, result):
3165 self.addCleanup(self.closeRecvmsgFDs, result)
3166
3167 def closeRecvmsgFDs(self, recvmsg_result):
3168 # Close all file descriptors specified in the ancillary data
3169 # of the given return value from recvmsg() or recvmsg_into().
3170 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3171 if (cmsg_level == socket.SOL_SOCKET and
3172 cmsg_type == socket.SCM_RIGHTS):
3173 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003174 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003175 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3176 for fd in fds:
3177 os.close(fd)
3178
3179 def createAndSendFDs(self, n):
3180 # Send n new file descriptors created by newFDs() to the
3181 # server, with the constant MSG as the non-ancillary data.
3182 self.assertEqual(
3183 self.sendmsgToServer([MSG],
3184 [(socket.SOL_SOCKET,
3185 socket.SCM_RIGHTS,
3186 array.array("i", self.newFDs(n)))]),
3187 len(MSG))
3188
3189 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3190 # Check that constant MSG was received with numfds file
3191 # descriptors in a maximum of maxcmsgs control messages (which
3192 # must contain only complete integers). By default, check
3193 # that MSG_CTRUNC is unset, but ignore any flags in
3194 # ignoreflags.
3195 msg, ancdata, flags, addr = result
3196 self.assertEqual(msg, MSG)
3197 self.checkRecvmsgAddress(addr, self.cli_addr)
3198 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3199 ignore=ignoreflags)
3200
3201 self.assertIsInstance(ancdata, list)
3202 self.assertLessEqual(len(ancdata), maxcmsgs)
3203 fds = array.array("i")
3204 for item in ancdata:
3205 self.assertIsInstance(item, tuple)
3206 cmsg_level, cmsg_type, cmsg_data = item
3207 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3208 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3209 self.assertIsInstance(cmsg_data, bytes)
3210 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003211 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003212
3213 self.assertEqual(len(fds), numfds)
3214 self.checkFDs(fds)
3215
3216 def testFDPassSimple(self):
3217 # Pass a single FD (array read from bytes object).
3218 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3219 len(MSG), 10240))
3220
3221 def _testFDPassSimple(self):
3222 self.assertEqual(
3223 self.sendmsgToServer(
3224 [MSG],
3225 [(socket.SOL_SOCKET,
3226 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003227 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003228 len(MSG))
3229
3230 def testMultipleFDPass(self):
3231 # Pass multiple FDs in a single array.
3232 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3233 len(MSG), 10240))
3234
3235 def _testMultipleFDPass(self):
3236 self.createAndSendFDs(4)
3237
3238 @requireAttrs(socket, "CMSG_SPACE")
3239 def testFDPassCMSG_SPACE(self):
3240 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3241 self.checkRecvmsgFDs(
3242 4, self.doRecvmsg(self.serv_sock, len(MSG),
3243 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3244
3245 @testFDPassCMSG_SPACE.client_skip
3246 def _testFDPassCMSG_SPACE(self):
3247 self.createAndSendFDs(4)
3248
3249 def testFDPassCMSG_LEN(self):
3250 # Test using CMSG_LEN() to calculate ancillary buffer size.
3251 self.checkRecvmsgFDs(1,
3252 self.doRecvmsg(self.serv_sock, len(MSG),
3253 socket.CMSG_LEN(4 * SIZEOF_INT)),
3254 # RFC 3542 says implementations may set
3255 # MSG_CTRUNC if there isn't enough space
3256 # for trailing padding.
3257 ignoreflags=socket.MSG_CTRUNC)
3258
3259 def _testFDPassCMSG_LEN(self):
3260 self.createAndSendFDs(1)
3261
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003262 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003263 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003264 @requireAttrs(socket, "CMSG_SPACE")
3265 def testFDPassSeparate(self):
3266 # Pass two FDs in two separate arrays. Arrays may be combined
3267 # into a single control message by the OS.
3268 self.checkRecvmsgFDs(2,
3269 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3270 maxcmsgs=2)
3271
3272 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003273 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003274 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003275 def _testFDPassSeparate(self):
3276 fd0, fd1 = self.newFDs(2)
3277 self.assertEqual(
3278 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3279 socket.SCM_RIGHTS,
3280 array.array("i", [fd0])),
3281 (socket.SOL_SOCKET,
3282 socket.SCM_RIGHTS,
3283 array.array("i", [fd1]))]),
3284 len(MSG))
3285
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 @requireAttrs(socket, "CMSG_SPACE")
3289 def testFDPassSeparateMinSpace(self):
3290 # Pass two FDs in two separate arrays, receiving them into the
3291 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003292 num_fds = 2
3293 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003294 self.doRecvmsg(self.serv_sock, len(MSG),
3295 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003296 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003297 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3298
3299 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003300 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003301 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003302 def _testFDPassSeparateMinSpace(self):
3303 fd0, fd1 = self.newFDs(2)
3304 self.assertEqual(
3305 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3306 socket.SCM_RIGHTS,
3307 array.array("i", [fd0])),
3308 (socket.SOL_SOCKET,
3309 socket.SCM_RIGHTS,
3310 array.array("i", [fd1]))]),
3311 len(MSG))
3312
3313 def sendAncillaryIfPossible(self, msg, ancdata):
3314 # Try to send msg and ancdata to server, but if the system
3315 # call fails, just send msg with no ancillary data.
3316 try:
3317 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003318 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003319 # Check that it was the system call that failed
3320 self.assertIsInstance(e.errno, int)
3321 nbytes = self.sendmsgToServer([msg])
3322 self.assertEqual(nbytes, len(msg))
3323
Brett Cannon3bbad122015-12-28 17:21:44 -08003324 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003325 def testFDPassEmpty(self):
3326 # Try to pass an empty FD array. Can receive either no array
3327 # or an empty array.
3328 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3329 len(MSG), 10240),
3330 ignoreflags=socket.MSG_CTRUNC)
3331
3332 def _testFDPassEmpty(self):
3333 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3334 socket.SCM_RIGHTS,
3335 b"")])
3336
3337 def testFDPassPartialInt(self):
3338 # Try to pass a truncated FD array.
3339 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3340 len(MSG), 10240)
3341 self.assertEqual(msg, MSG)
3342 self.checkRecvmsgAddress(addr, self.cli_addr)
3343 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3344 self.assertLessEqual(len(ancdata), 1)
3345 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3346 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3347 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3348 self.assertLess(len(cmsg_data), SIZEOF_INT)
3349
3350 def _testFDPassPartialInt(self):
3351 self.sendAncillaryIfPossible(
3352 MSG,
3353 [(socket.SOL_SOCKET,
3354 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003355 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003356
3357 @requireAttrs(socket, "CMSG_SPACE")
3358 def testFDPassPartialIntInMiddle(self):
3359 # Try to pass two FD arrays, the first of which is truncated.
3360 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3361 len(MSG), 10240)
3362 self.assertEqual(msg, MSG)
3363 self.checkRecvmsgAddress(addr, self.cli_addr)
3364 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3365 self.assertLessEqual(len(ancdata), 2)
3366 fds = array.array("i")
3367 # Arrays may have been combined in a single control message
3368 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3369 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3370 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003371 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003372 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3373 self.assertLessEqual(len(fds), 2)
3374 self.checkFDs(fds)
3375
3376 @testFDPassPartialIntInMiddle.client_skip
3377 def _testFDPassPartialIntInMiddle(self):
3378 fd0, fd1 = self.newFDs(2)
3379 self.sendAncillaryIfPossible(
3380 MSG,
3381 [(socket.SOL_SOCKET,
3382 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003383 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003384 (socket.SOL_SOCKET,
3385 socket.SCM_RIGHTS,
3386 array.array("i", [fd1]))])
3387
3388 def checkTruncatedHeader(self, result, ignoreflags=0):
3389 # Check that no ancillary data items are returned when data is
3390 # truncated inside the cmsghdr structure.
3391 msg, ancdata, flags, addr = result
3392 self.assertEqual(msg, MSG)
3393 self.checkRecvmsgAddress(addr, self.cli_addr)
3394 self.assertEqual(ancdata, [])
3395 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3396 ignore=ignoreflags)
3397
3398 def testCmsgTruncNoBufSize(self):
3399 # Check that no ancillary data is received when no buffer size
3400 # is specified.
3401 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3402 # BSD seems to set MSG_CTRUNC only
3403 # if an item has been partially
3404 # received.
3405 ignoreflags=socket.MSG_CTRUNC)
3406
3407 def _testCmsgTruncNoBufSize(self):
3408 self.createAndSendFDs(1)
3409
3410 def testCmsgTrunc0(self):
3411 # Check that no ancillary data is received when buffer size is 0.
3412 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3413 ignoreflags=socket.MSG_CTRUNC)
3414
3415 def _testCmsgTrunc0(self):
3416 self.createAndSendFDs(1)
3417
3418 # Check that no ancillary data is returned for various non-zero
3419 # (but still too small) buffer sizes.
3420
3421 def testCmsgTrunc1(self):
3422 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3423
3424 def _testCmsgTrunc1(self):
3425 self.createAndSendFDs(1)
3426
3427 def testCmsgTrunc2Int(self):
3428 # The cmsghdr structure has at least three members, two of
3429 # which are ints, so we still shouldn't see any ancillary
3430 # data.
3431 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3432 SIZEOF_INT * 2))
3433
3434 def _testCmsgTrunc2Int(self):
3435 self.createAndSendFDs(1)
3436
3437 def testCmsgTruncLen0Minus1(self):
3438 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3439 socket.CMSG_LEN(0) - 1))
3440
3441 def _testCmsgTruncLen0Minus1(self):
3442 self.createAndSendFDs(1)
3443
3444 # The following tests try to truncate the control message in the
3445 # middle of the FD array.
3446
3447 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3448 # Check that file descriptor data is truncated to between
3449 # mindata and maxdata bytes when received with buffer size
3450 # ancbuf, and that any complete file descriptor numbers are
3451 # valid.
3452 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3453 len(MSG), ancbuf)
3454 self.assertEqual(msg, MSG)
3455 self.checkRecvmsgAddress(addr, self.cli_addr)
3456 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3457
3458 if mindata == 0 and ancdata == []:
3459 return
3460 self.assertEqual(len(ancdata), 1)
3461 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3462 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3463 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3464 self.assertGreaterEqual(len(cmsg_data), mindata)
3465 self.assertLessEqual(len(cmsg_data), maxdata)
3466 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003467 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003468 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3469 self.checkFDs(fds)
3470
3471 def testCmsgTruncLen0(self):
3472 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3473
3474 def _testCmsgTruncLen0(self):
3475 self.createAndSendFDs(1)
3476
3477 def testCmsgTruncLen0Plus1(self):
3478 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3479
3480 def _testCmsgTruncLen0Plus1(self):
3481 self.createAndSendFDs(2)
3482
3483 def testCmsgTruncLen1(self):
3484 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3485 maxdata=SIZEOF_INT)
3486
3487 def _testCmsgTruncLen1(self):
3488 self.createAndSendFDs(2)
3489
3490 def testCmsgTruncLen2Minus1(self):
3491 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3492 maxdata=(2 * SIZEOF_INT) - 1)
3493
3494 def _testCmsgTruncLen2Minus1(self):
3495 self.createAndSendFDs(2)
3496
3497
3498class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3499 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3500 # features of the RFC 3542 Advanced Sockets API for IPv6.
3501 # Currently we can only handle certain data items (e.g. traffic
3502 # class, hop limit, MTU discovery and fragmentation settings)
3503 # without resorting to unportable means such as the struct module,
3504 # but the tests here are aimed at testing the ancillary data
3505 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3506 # itself.
3507
3508 # Test value to use when setting hop limit of packet
3509 hop_limit = 2
3510
3511 # Test value to use when setting traffic class of packet.
3512 # -1 means "use kernel default".
3513 traffic_class = -1
3514
3515 def ancillaryMapping(self, ancdata):
3516 # Given ancillary data list ancdata, return a mapping from
3517 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3518 # Check that no (level, type) pair appears more than once.
3519 d = {}
3520 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3521 self.assertNotIn((cmsg_level, cmsg_type), d)
3522 d[(cmsg_level, cmsg_type)] = cmsg_data
3523 return d
3524
3525 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3526 # Receive hop limit into ancbufsize bytes of ancillary data
3527 # space. Check that data is MSG, ancillary data is not
3528 # truncated (but ignore any flags in ignoreflags), and hop
3529 # limit is between 0 and maxhop inclusive.
3530 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3531 socket.IPV6_RECVHOPLIMIT, 1)
3532 self.misc_event.set()
3533 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3534 len(MSG), ancbufsize)
3535
3536 self.assertEqual(msg, MSG)
3537 self.checkRecvmsgAddress(addr, self.cli_addr)
3538 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3539 ignore=ignoreflags)
3540
3541 self.assertEqual(len(ancdata), 1)
3542 self.assertIsInstance(ancdata[0], tuple)
3543 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3544 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3545 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3546 self.assertIsInstance(cmsg_data, bytes)
3547 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3548 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003549 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003550 self.assertGreaterEqual(a[0], 0)
3551 self.assertLessEqual(a[0], maxhop)
3552
3553 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3554 def testRecvHopLimit(self):
3555 # Test receiving the packet hop limit as ancillary data.
3556 self.checkHopLimit(ancbufsize=10240)
3557
3558 @testRecvHopLimit.client_skip
3559 def _testRecvHopLimit(self):
3560 # Need to wait until server has asked to receive ancillary
3561 # data, as implementations are not required to buffer it
3562 # otherwise.
3563 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3564 self.sendToServer(MSG)
3565
3566 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3567 def testRecvHopLimitCMSG_SPACE(self):
3568 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3569 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3570
3571 @testRecvHopLimitCMSG_SPACE.client_skip
3572 def _testRecvHopLimitCMSG_SPACE(self):
3573 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3574 self.sendToServer(MSG)
3575
3576 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3577 # 3542 says portable applications must provide space for trailing
3578 # padding. Implementations may set MSG_CTRUNC if there isn't
3579 # enough space for the padding.
3580
3581 @requireAttrs(socket.socket, "sendmsg")
3582 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3583 def testSetHopLimit(self):
3584 # Test setting hop limit on outgoing packet and receiving it
3585 # at the other end.
3586 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3587
3588 @testSetHopLimit.client_skip
3589 def _testSetHopLimit(self):
3590 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3591 self.assertEqual(
3592 self.sendmsgToServer([MSG],
3593 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3594 array.array("i", [self.hop_limit]))]),
3595 len(MSG))
3596
3597 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3598 ignoreflags=0):
3599 # Receive traffic class and hop limit into ancbufsize bytes of
3600 # ancillary data space. Check that data is MSG, ancillary
3601 # data is not truncated (but ignore any flags in ignoreflags),
3602 # and traffic class and hop limit are in range (hop limit no
3603 # more than maxhop).
3604 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3605 socket.IPV6_RECVHOPLIMIT, 1)
3606 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3607 socket.IPV6_RECVTCLASS, 1)
3608 self.misc_event.set()
3609 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3610 len(MSG), ancbufsize)
3611
3612 self.assertEqual(msg, MSG)
3613 self.checkRecvmsgAddress(addr, self.cli_addr)
3614 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3615 ignore=ignoreflags)
3616 self.assertEqual(len(ancdata), 2)
3617 ancmap = self.ancillaryMapping(ancdata)
3618
3619 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3620 self.assertEqual(len(tcdata), SIZEOF_INT)
3621 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003622 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003623 self.assertGreaterEqual(a[0], 0)
3624 self.assertLessEqual(a[0], 255)
3625
3626 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3627 self.assertEqual(len(hldata), SIZEOF_INT)
3628 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003629 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003630 self.assertGreaterEqual(a[0], 0)
3631 self.assertLessEqual(a[0], maxhop)
3632
3633 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3634 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3635 def testRecvTrafficClassAndHopLimit(self):
3636 # Test receiving traffic class and hop limit as ancillary data.
3637 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3638
3639 @testRecvTrafficClassAndHopLimit.client_skip
3640 def _testRecvTrafficClassAndHopLimit(self):
3641 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3642 self.sendToServer(MSG)
3643
3644 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3645 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3646 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3647 # Test receiving traffic class and hop limit, using
3648 # CMSG_SPACE() to calculate buffer size.
3649 self.checkTrafficClassAndHopLimit(
3650 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3651
3652 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3653 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3654 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3655 self.sendToServer(MSG)
3656
3657 @requireAttrs(socket.socket, "sendmsg")
3658 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3659 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3660 def testSetTrafficClassAndHopLimit(self):
3661 # Test setting traffic class and hop limit on outgoing packet,
3662 # and receiving them at the other end.
3663 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3664 maxhop=self.hop_limit)
3665
3666 @testSetTrafficClassAndHopLimit.client_skip
3667 def _testSetTrafficClassAndHopLimit(self):
3668 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3669 self.assertEqual(
3670 self.sendmsgToServer([MSG],
3671 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3672 array.array("i", [self.traffic_class])),
3673 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3674 array.array("i", [self.hop_limit]))]),
3675 len(MSG))
3676
3677 @requireAttrs(socket.socket, "sendmsg")
3678 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3679 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3680 def testOddCmsgSize(self):
3681 # Try to send ancillary data with first item one byte too
3682 # long. Fall back to sending with correct size if this fails,
3683 # and check that second item was handled correctly.
3684 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3685 maxhop=self.hop_limit)
3686
3687 @testOddCmsgSize.client_skip
3688 def _testOddCmsgSize(self):
3689 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3690 try:
3691 nbytes = self.sendmsgToServer(
3692 [MSG],
3693 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003694 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003695 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3696 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003697 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003698 self.assertIsInstance(e.errno, int)
3699 nbytes = self.sendmsgToServer(
3700 [MSG],
3701 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3702 array.array("i", [self.traffic_class])),
3703 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3704 array.array("i", [self.hop_limit]))])
3705 self.assertEqual(nbytes, len(MSG))
3706
3707 # Tests for proper handling of truncated ancillary data
3708
3709 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3710 # Receive hop limit into ancbufsize bytes of ancillary data
3711 # space, which should be too small to contain the ancillary
3712 # data header (if ancbufsize is None, pass no second argument
3713 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3714 # (unless included in ignoreflags), and no ancillary data is
3715 # returned.
3716 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3717 socket.IPV6_RECVHOPLIMIT, 1)
3718 self.misc_event.set()
3719 args = () if ancbufsize is None else (ancbufsize,)
3720 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3721 len(MSG), *args)
3722
3723 self.assertEqual(msg, MSG)
3724 self.checkRecvmsgAddress(addr, self.cli_addr)
3725 self.assertEqual(ancdata, [])
3726 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3727 ignore=ignoreflags)
3728
3729 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3730 def testCmsgTruncNoBufSize(self):
3731 # Check that no ancillary data is received when no ancillary
3732 # buffer size is provided.
3733 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3734 # BSD seems to set
3735 # MSG_CTRUNC only if an item
3736 # has been partially
3737 # received.
3738 ignoreflags=socket.MSG_CTRUNC)
3739
3740 @testCmsgTruncNoBufSize.client_skip
3741 def _testCmsgTruncNoBufSize(self):
3742 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3743 self.sendToServer(MSG)
3744
3745 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3746 def testSingleCmsgTrunc0(self):
3747 # Check that no ancillary data is received when ancillary
3748 # buffer size is zero.
3749 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3750 ignoreflags=socket.MSG_CTRUNC)
3751
3752 @testSingleCmsgTrunc0.client_skip
3753 def _testSingleCmsgTrunc0(self):
3754 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3755 self.sendToServer(MSG)
3756
3757 # Check that no ancillary data is returned for various non-zero
3758 # (but still too small) buffer sizes.
3759
3760 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3761 def testSingleCmsgTrunc1(self):
3762 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3763
3764 @testSingleCmsgTrunc1.client_skip
3765 def _testSingleCmsgTrunc1(self):
3766 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3767 self.sendToServer(MSG)
3768
3769 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3770 def testSingleCmsgTrunc2Int(self):
3771 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3772
3773 @testSingleCmsgTrunc2Int.client_skip
3774 def _testSingleCmsgTrunc2Int(self):
3775 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3776 self.sendToServer(MSG)
3777
3778 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3779 def testSingleCmsgTruncLen0Minus1(self):
3780 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3781
3782 @testSingleCmsgTruncLen0Minus1.client_skip
3783 def _testSingleCmsgTruncLen0Minus1(self):
3784 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3785 self.sendToServer(MSG)
3786
3787 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3788 def testSingleCmsgTruncInData(self):
3789 # Test truncation of a control message inside its associated
3790 # data. The message may be returned with its data truncated,
3791 # or not returned at all.
3792 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3793 socket.IPV6_RECVHOPLIMIT, 1)
3794 self.misc_event.set()
3795 msg, ancdata, flags, addr = self.doRecvmsg(
3796 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3797
3798 self.assertEqual(msg, MSG)
3799 self.checkRecvmsgAddress(addr, self.cli_addr)
3800 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3801
3802 self.assertLessEqual(len(ancdata), 1)
3803 if ancdata:
3804 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3805 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3806 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3807 self.assertLess(len(cmsg_data), SIZEOF_INT)
3808
3809 @testSingleCmsgTruncInData.client_skip
3810 def _testSingleCmsgTruncInData(self):
3811 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3812 self.sendToServer(MSG)
3813
3814 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3815 # Receive traffic class and hop limit into ancbufsize bytes of
3816 # ancillary data space, which should be large enough to
3817 # contain the first item, but too small to contain the header
3818 # of the second. Check that data is MSG, MSG_CTRUNC is set
3819 # (unless included in ignoreflags), and only one ancillary
3820 # data item is returned.
3821 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3822 socket.IPV6_RECVHOPLIMIT, 1)
3823 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3824 socket.IPV6_RECVTCLASS, 1)
3825 self.misc_event.set()
3826 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3827 len(MSG), ancbufsize)
3828
3829 self.assertEqual(msg, MSG)
3830 self.checkRecvmsgAddress(addr, self.cli_addr)
3831 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3832 ignore=ignoreflags)
3833
3834 self.assertEqual(len(ancdata), 1)
3835 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3836 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3837 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3838 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3839 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003840 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003841 self.assertGreaterEqual(a[0], 0)
3842 self.assertLessEqual(a[0], 255)
3843
3844 # Try the above test with various buffer sizes.
3845
3846 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3847 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3848 def testSecondCmsgTrunc0(self):
3849 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3850 ignoreflags=socket.MSG_CTRUNC)
3851
3852 @testSecondCmsgTrunc0.client_skip
3853 def _testSecondCmsgTrunc0(self):
3854 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3855 self.sendToServer(MSG)
3856
3857 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3858 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3859 def testSecondCmsgTrunc1(self):
3860 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3861
3862 @testSecondCmsgTrunc1.client_skip
3863 def _testSecondCmsgTrunc1(self):
3864 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3865 self.sendToServer(MSG)
3866
3867 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3868 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3869 def testSecondCmsgTrunc2Int(self):
3870 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3871 2 * SIZEOF_INT)
3872
3873 @testSecondCmsgTrunc2Int.client_skip
3874 def _testSecondCmsgTrunc2Int(self):
3875 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3876 self.sendToServer(MSG)
3877
3878 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3879 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3880 def testSecondCmsgTruncLen0Minus1(self):
3881 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3882 socket.CMSG_LEN(0) - 1)
3883
3884 @testSecondCmsgTruncLen0Minus1.client_skip
3885 def _testSecondCmsgTruncLen0Minus1(self):
3886 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3887 self.sendToServer(MSG)
3888
3889 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3890 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3891 def testSecomdCmsgTruncInData(self):
3892 # Test truncation of the second of two control messages inside
3893 # its associated data.
3894 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3895 socket.IPV6_RECVHOPLIMIT, 1)
3896 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3897 socket.IPV6_RECVTCLASS, 1)
3898 self.misc_event.set()
3899 msg, ancdata, flags, addr = self.doRecvmsg(
3900 self.serv_sock, len(MSG),
3901 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3902
3903 self.assertEqual(msg, MSG)
3904 self.checkRecvmsgAddress(addr, self.cli_addr)
3905 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3906
3907 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3908
3909 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3910 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3911 cmsg_types.remove(cmsg_type)
3912 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3913 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003914 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003915 self.assertGreaterEqual(a[0], 0)
3916 self.assertLessEqual(a[0], 255)
3917
3918 if ancdata:
3919 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3920 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3921 cmsg_types.remove(cmsg_type)
3922 self.assertLess(len(cmsg_data), SIZEOF_INT)
3923
3924 self.assertEqual(ancdata, [])
3925
3926 @testSecomdCmsgTruncInData.client_skip
3927 def _testSecomdCmsgTruncInData(self):
3928 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3929 self.sendToServer(MSG)
3930
3931
3932# Derive concrete test classes for different socket types.
3933
3934class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3935 SendrecvmsgConnectionlessBase,
3936 ThreadedSocketTestMixin, UDPTestBase):
3937 pass
3938
3939@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003940class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3941 pass
3942
3943@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003944class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3945 pass
3946
3947@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003948class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3949 pass
3950
3951
3952class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3953 SendrecvmsgConnectionlessBase,
3954 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003955
3956 def checkRecvmsgAddress(self, addr1, addr2):
3957 # Called to compare the received address with the address of
3958 # the peer, ignoring scope ID
3959 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003960
3961@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003962@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003963@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003964class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3965 pass
3966
3967@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003968@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003969@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003970class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3971 pass
3972
3973@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003974@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003975@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3977 pass
3978
3979@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003980@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003981@requireAttrs(socket, "IPPROTO_IPV6")
3982@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003983class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3984 SendrecvmsgUDP6TestBase):
3985 pass
3986
3987@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003988@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003989@requireAttrs(socket, "IPPROTO_IPV6")
3990@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003991class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3992 RFC3542AncillaryTest,
3993 SendrecvmsgUDP6TestBase):
3994 pass
3995
3996
3997class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3998 ConnectedStreamTestMixin, TCPTestBase):
3999 pass
4000
4001@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004002class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4003 pass
4004
4005@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004006class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4007 SendrecvmsgTCPTestBase):
4008 pass
4009
4010@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004011class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4012 SendrecvmsgTCPTestBase):
4013 pass
4014
4015
4016class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4017 SendrecvmsgConnectedBase,
4018 ConnectedStreamTestMixin, SCTPStreamBase):
4019 pass
4020
4021@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004022@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004023@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004024class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4025 pass
4026
4027@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004028@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004029@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004030class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4031 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004032
4033 def testRecvmsgEOF(self):
4034 try:
4035 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4036 except OSError as e:
4037 if e.errno != errno.ENOTCONN:
4038 raise
4039 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004040
4041@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004042@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004043@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004044class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4045 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004046
4047 def testRecvmsgEOF(self):
4048 try:
4049 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4050 except OSError as e:
4051 if e.errno != errno.ENOTCONN:
4052 raise
4053 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054
4055
4056class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4057 ConnectedStreamTestMixin, UnixStreamBase):
4058 pass
4059
4060@requireAttrs(socket.socket, "sendmsg")
4061@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004062class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4063 pass
4064
4065@requireAttrs(socket.socket, "recvmsg")
4066@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004067class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4068 SendrecvmsgUnixStreamTestBase):
4069 pass
4070
4071@requireAttrs(socket.socket, "recvmsg_into")
4072@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004073class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4074 SendrecvmsgUnixStreamTestBase):
4075 pass
4076
4077@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4078@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004079class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4080 pass
4081
4082@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4083@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4085 SendrecvmsgUnixStreamTestBase):
4086 pass
4087
4088
4089# Test interrupting the interruptible send/receive methods with a
4090# signal when a timeout is set. These tests avoid having multiple
4091# threads alive during the test so that the OS cannot deliver the
4092# signal to the wrong one.
4093
4094class InterruptedTimeoutBase(unittest.TestCase):
4095 # Base class for interrupted send/receive tests. Installs an
4096 # empty handler for SIGALRM and removes it on teardown, along with
4097 # any scheduled alarms.
4098
4099 def setUp(self):
4100 super().setUp()
4101 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004102 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004103 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104
4105 # Timeout for socket operations
4106 timeout = 4.0
4107
4108 # Provide setAlarm() method to schedule delivery of SIGALRM after
4109 # given number of seconds, or cancel it if zero, and an
4110 # appropriate time value to use. Use setitimer() if available.
4111 if hasattr(signal, "setitimer"):
4112 alarm_time = 0.05
4113
4114 def setAlarm(self, seconds):
4115 signal.setitimer(signal.ITIMER_REAL, seconds)
4116 else:
4117 # Old systems may deliver the alarm up to one second early
4118 alarm_time = 2
4119
4120 def setAlarm(self, seconds):
4121 signal.alarm(seconds)
4122
4123
4124# Require siginterrupt() in order to ensure that system calls are
4125# interrupted by default.
4126@requireAttrs(signal, "siginterrupt")
4127@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4128 "Don't have signal.alarm or signal.setitimer")
4129class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4130 # Test interrupting the recv*() methods with signals when a
4131 # timeout is set.
4132
4133 def setUp(self):
4134 super().setUp()
4135 self.serv.settimeout(self.timeout)
4136
4137 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004138 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004139 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004140 try:
4141 self.setAlarm(self.alarm_time)
4142 with self.assertRaises(ZeroDivisionError) as cm:
4143 func(*args, **kwargs)
4144 finally:
4145 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004146
4147 def testInterruptedRecvTimeout(self):
4148 self.checkInterruptedRecv(self.serv.recv, 1024)
4149
4150 def testInterruptedRecvIntoTimeout(self):
4151 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4152
4153 def testInterruptedRecvfromTimeout(self):
4154 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4155
4156 def testInterruptedRecvfromIntoTimeout(self):
4157 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4158
4159 @requireAttrs(socket.socket, "recvmsg")
4160 def testInterruptedRecvmsgTimeout(self):
4161 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4162
4163 @requireAttrs(socket.socket, "recvmsg_into")
4164 def testInterruptedRecvmsgIntoTimeout(self):
4165 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4166
4167
4168# Require siginterrupt() in order to ensure that system calls are
4169# interrupted by default.
4170@requireAttrs(signal, "siginterrupt")
4171@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4172 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004173class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4174 ThreadSafeCleanupTestCase,
4175 SocketListeningTestMixin, TCPTestBase):
4176 # Test interrupting the interruptible send*() methods with signals
4177 # when a timeout is set.
4178
4179 def setUp(self):
4180 super().setUp()
4181 self.serv_conn = self.newSocket()
4182 self.addCleanup(self.serv_conn.close)
4183 # Use a thread to complete the connection, but wait for it to
4184 # terminate before running the test, so that there is only one
4185 # thread to accept the signal.
4186 cli_thread = threading.Thread(target=self.doConnect)
4187 cli_thread.start()
4188 self.cli_conn, addr = self.serv.accept()
4189 self.addCleanup(self.cli_conn.close)
4190 cli_thread.join()
4191 self.serv_conn.settimeout(self.timeout)
4192
4193 def doConnect(self):
4194 self.serv_conn.connect(self.serv_addr)
4195
4196 def checkInterruptedSend(self, func, *args, **kwargs):
4197 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004198 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004199 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004200 try:
4201 with self.assertRaises(ZeroDivisionError) as cm:
4202 while True:
4203 self.setAlarm(self.alarm_time)
4204 func(*args, **kwargs)
4205 finally:
4206 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004207
Ned Deilyc5640382014-02-03 13:58:31 -08004208 # Issue #12958: The following tests have problems on OS X prior to 10.7
4209 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004210 def testInterruptedSendTimeout(self):
4211 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4212
Ned Deilyc5640382014-02-03 13:58:31 -08004213 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004214 def testInterruptedSendtoTimeout(self):
4215 # Passing an actual address here as Python's wrapper for
4216 # sendto() doesn't allow passing a zero-length one; POSIX
4217 # requires that the address is ignored since the socket is
4218 # connection-mode, however.
4219 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4220 self.serv_addr)
4221
Ned Deilyc5640382014-02-03 13:58:31 -08004222 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004223 @requireAttrs(socket.socket, "sendmsg")
4224 def testInterruptedSendmsgTimeout(self):
4225 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4226
4227
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004228class TCPCloserTest(ThreadedTCPSocketTest):
4229
4230 def testClose(self):
4231 conn, addr = self.serv.accept()
4232 conn.close()
4233
4234 sd = self.cli
4235 read, write, err = select.select([sd], [], [], 1.0)
4236 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004237 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004238
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004239 # Calling close() many times should be safe.
4240 conn.close()
4241 conn.close()
4242
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004243 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004244 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004245 time.sleep(1.0)
4246
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004247
Dave Cole331708b2004-08-09 04:51:41 +00004248class BasicSocketPairTest(SocketPairTest):
4249
4250 def __init__(self, methodName='runTest'):
4251 SocketPairTest.__init__(self, methodName=methodName)
4252
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004253 def _check_defaults(self, sock):
4254 self.assertIsInstance(sock, socket.socket)
4255 if hasattr(socket, 'AF_UNIX'):
4256 self.assertEqual(sock.family, socket.AF_UNIX)
4257 else:
4258 self.assertEqual(sock.family, socket.AF_INET)
4259 self.assertEqual(sock.type, socket.SOCK_STREAM)
4260 self.assertEqual(sock.proto, 0)
4261
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004262 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004263 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004264
4265 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004266 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004267
Dave Cole331708b2004-08-09 04:51:41 +00004268 def testRecv(self):
4269 msg = self.serv.recv(1024)
4270 self.assertEqual(msg, MSG)
4271
4272 def _testRecv(self):
4273 self.cli.send(MSG)
4274
4275 def testSend(self):
4276 self.serv.send(MSG)
4277
4278 def _testSend(self):
4279 msg = self.cli.recv(1024)
4280 self.assertEqual(msg, MSG)
4281
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004282
Guido van Rossum24e4af82002-06-12 19:18:08 +00004283class NonBlockingTCPTests(ThreadedTCPSocketTest):
4284
4285 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004286 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004287 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4288
Victor Stinner304315d2018-11-30 13:22:44 +01004289 def assert_sock_timeout(self, sock, timeout):
4290 self.assertEqual(self.serv.gettimeout(), timeout)
4291
4292 blocking = (timeout != 0.0)
4293 self.assertEqual(sock.getblocking(), blocking)
4294
4295 if fcntl is not None:
4296 # When a Python socket has a non-zero timeout, it's switched
4297 # internally to a non-blocking mode. Later, sock.sendall(),
4298 # sock.recv(), and other socket operations use a select() call and
4299 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4300 # timeouts are enforced.
4301 fd_blocking = (timeout is None)
4302
4303 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4304 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4305
Guido van Rossum24e4af82002-06-12 19:18:08 +00004306 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004307 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004308 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004309 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004310
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004311 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004312 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004313
4314 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004315 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004316
4317 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004318 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004319
4320 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004321 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004322
4323 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004324 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004325
4326 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004327 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004328
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004329 @support.cpython_only
4330 def testSetBlocking_overflow(self):
4331 # Issue 15989
4332 import _testcapi
4333 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4334 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004335
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004336 self.serv.setblocking(False)
4337 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004338
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004339 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4340 self.assertIsNone(self.serv.gettimeout())
4341
4342 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4343
Serhiy Storchaka43767632013-11-03 21:31:38 +02004344 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4345 'test needs socket.SOCK_NONBLOCK')
4346 @support.requires_linux_version(2, 6, 28)
4347 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004348 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004349 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004350 self.serv = socket.socket(socket.AF_INET,
4351 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4352 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004353
4354 def _testInitNonBlocking(self):
4355 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004356
Victor Stinner304315d2018-11-30 13:22:44 +01004357 def testInheritFlagsBlocking(self):
4358 # bpo-7995: accept() on a listening socket with a timeout and the
4359 # default timeout is None, the resulting socket must be blocking.
4360 with socket_setdefaulttimeout(None):
4361 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004362 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004363 self.addCleanup(conn.close)
4364 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004365
Victor Stinner304315d2018-11-30 13:22:44 +01004366 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004367 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004368
4369 def testInheritFlagsTimeout(self):
4370 # bpo-7995: accept() on a listening socket with a timeout and the
4371 # default timeout is None, the resulting socket must inherit
4372 # the default timeout.
4373 default_timeout = 20.0
4374 with socket_setdefaulttimeout(default_timeout):
4375 self.serv.settimeout(10)
4376 conn, addr = self.serv.accept()
4377 self.addCleanup(conn.close)
4378 self.assertEqual(conn.gettimeout(), default_timeout)
4379
4380 def _testInheritFlagsTimeout(self):
4381 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004382
Guido van Rossum24e4af82002-06-12 19:18:08 +00004383 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004384 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004385 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004386
4387 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004388 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004389 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004390 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004391 dt = time.monotonic() - start_time
4392 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004393
4394 self.event.set()
4395
4396 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4397 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004398 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004399
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004400 # connect() completed: non-blocking accept() doesn't block
4401 conn, addr = self.serv.accept()
4402 self.addCleanup(conn.close)
4403 self.assertIsNone(conn.gettimeout())
4404
Guido van Rossum24e4af82002-06-12 19:18:08 +00004405 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004406 # don't connect before event is set to check
4407 # that non-blocking accept() raises BlockingIOError
4408 self.event.wait()
4409
Christian Heimes5e696852008-04-09 08:37:03 +00004410 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004411
Guido van Rossum24e4af82002-06-12 19:18:08 +00004412 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004413 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004414 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004415 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004416 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004417
4418 # the server didn't send data yet: non-blocking recv() fails
4419 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004420 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004421
4422 self.event.set()
4423
4424 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4425 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004426 self.fail("Error during select call to non-blocking socket.")
4427
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004428 # the server sent data yet: non-blocking recv() doesn't block
4429 msg = conn.recv(len(MSG))
4430 self.assertEqual(msg, MSG)
4431
Guido van Rossum24e4af82002-06-12 19:18:08 +00004432 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004433 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004434
4435 # don't send anything before event is set to check
4436 # that non-blocking recv() raises BlockingIOError
4437 self.event.wait()
4438
4439 # send data: recv() will no longer block
4440 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004441
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004442
Guido van Rossum24e4af82002-06-12 19:18:08 +00004443class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004444 """Unit tests for the object returned by socket.makefile()
4445
Antoine Pitrou834bd812010-10-13 16:17:14 +00004446 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004447 the client connection. You can read from this file to
4448 get output from the server.
4449
Antoine Pitrou834bd812010-10-13 16:17:14 +00004450 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004451 server connection. You can write to this file to send output
4452 to the client.
4453 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004454
Guido van Rossume9f66142002-08-07 15:46:19 +00004455 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004456 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004457 errors = 'strict'
4458 newline = None
4459
4460 read_mode = 'rb'
4461 read_msg = MSG
4462 write_mode = 'wb'
4463 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004464
Guido van Rossum24e4af82002-06-12 19:18:08 +00004465 def __init__(self, methodName='runTest'):
4466 SocketConnectedTest.__init__(self, methodName=methodName)
4467
4468 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004469 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4470 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004471 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004472 self.read_file = self.cli_conn.makefile(
4473 self.read_mode, self.bufsize,
4474 encoding = self.encoding,
4475 errors = self.errors,
4476 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004477
4478 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004479 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004480 self.read_file.close()
4481 self.assertTrue(self.read_file.closed)
4482 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004483 SocketConnectedTest.tearDown(self)
4484
4485 def clientSetUp(self):
4486 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004487 self.write_file = self.serv_conn.makefile(
4488 self.write_mode, self.bufsize,
4489 encoding = self.encoding,
4490 errors = self.errors,
4491 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004492
4493 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004494 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004495 self.write_file.close()
4496 self.assertTrue(self.write_file.closed)
4497 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004498 SocketConnectedTest.clientTearDown(self)
4499
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004500 def testReadAfterTimeout(self):
4501 # Issue #7322: A file object must disallow further reads
4502 # after a timeout has occurred.
4503 self.cli_conn.settimeout(1)
4504 self.read_file.read(3)
4505 # First read raises a timeout
4506 self.assertRaises(socket.timeout, self.read_file.read, 1)
4507 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004508 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004509 self.read_file.read(1)
4510 self.assertIn("cannot read from timed out object", str(ctx.exception))
4511
4512 def _testReadAfterTimeout(self):
4513 self.write_file.write(self.write_msg[0:3])
4514 self.write_file.flush()
4515 self.serv_finished.wait()
4516
Guido van Rossum24e4af82002-06-12 19:18:08 +00004517 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004518 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004519 first_seg = self.read_file.read(len(self.read_msg)-3)
4520 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004521 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004522 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004523
4524 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004525 self.write_file.write(self.write_msg)
4526 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004527
Guido van Rossum8c943832002-08-08 01:00:28 +00004528 def testFullRead(self):
4529 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004530 msg = self.read_file.read()
4531 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004532
4533 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004534 self.write_file.write(self.write_msg)
4535 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004536
Guido van Rossum24e4af82002-06-12 19:18:08 +00004537 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004538 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004539 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004540 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004541 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004542 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004543 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004544 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004545 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004546
4547 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004548 self.write_file.write(self.write_msg)
4549 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004550
4551 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004552 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004553 line = self.read_file.readline()
4554 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004555
4556 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004557 self.write_file.write(self.write_msg)
4558 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004559
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004560 def testCloseAfterMakefile(self):
4561 # The file returned by makefile should keep the socket open.
4562 self.cli_conn.close()
4563 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004564 msg = self.read_file.read()
4565 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004566
4567 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004568 self.write_file.write(self.write_msg)
4569 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004570
4571 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004572 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004573 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004574 if isinstance(self.read_msg, str):
4575 msg = msg.decode()
4576 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004577
4578 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004579 self.write_file.write(self.write_msg)
4580 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004581
Tim Peters116d83c2004-03-28 02:20:45 +00004582 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004583 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004584
4585 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004586 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004587
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004588 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004589 self.assertEqual(self.read_file.mode, self.read_mode)
4590 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004591
4592 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004593 self.assertEqual(self.write_file.mode, self.write_mode)
4594 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004595
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004596 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004597 self.read_file.close()
4598 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004599 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004600 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004601
4602 def _testRealClose(self):
4603 pass
4604
4605
Guido van Rossume9f66142002-08-07 15:46:19 +00004606class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4607
4608 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004609
Guido van Rossume9f66142002-08-07 15:46:19 +00004610 In this case (and in this case only), it should be possible to
4611 create a file object, read a line from it, create another file
4612 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004613 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004614 when reading multiple requests from the same socket."""
4615
4616 bufsize = 0 # Use unbuffered mode
4617
4618 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004619 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004620 line = self.read_file.readline() # first line
4621 self.assertEqual(line, b"A. " + self.write_msg) # first line
4622 self.read_file = self.cli_conn.makefile('rb', 0)
4623 line = self.read_file.readline() # second line
4624 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004625
4626 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004627 self.write_file.write(b"A. " + self.write_msg)
4628 self.write_file.write(b"B. " + self.write_msg)
4629 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004630
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004631 def testMakefileClose(self):
4632 # The file returned by makefile should keep the socket open...
4633 self.cli_conn.close()
4634 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004635 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004636 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004637 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004638 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004639
4640 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004641 self.write_file.write(self.write_msg)
4642 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004643
4644 def testMakefileCloseSocketDestroy(self):
4645 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004646 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004647 refcount_after = sys.getrefcount(self.cli_conn)
4648 self.assertEqual(refcount_before - 1, refcount_after)
4649
4650 def _testMakefileCloseSocketDestroy(self):
4651 pass
4652
Antoine Pitrou98b46702010-09-18 22:59:00 +00004653 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004654 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004655 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4656
4657 def testSmallReadNonBlocking(self):
4658 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004659 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4660 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004661 self.evt1.set()
4662 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004663 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004664 if first_seg is None:
4665 # Data not arrived (can happen under Windows), wait a bit
4666 time.sleep(0.5)
4667 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004668 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004669 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004670 self.assertEqual(n, 3)
4671 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004672 self.assertEqual(msg, self.read_msg)
4673 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4674 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004675
4676 def _testSmallReadNonBlocking(self):
4677 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004678 self.write_file.write(self.write_msg)
4679 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004680 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004681 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004682 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4683 self.serv_finished.wait(5.0)
4684
4685 def testWriteNonBlocking(self):
4686 self.cli_finished.wait(5.0)
4687 # The client thread can't skip directly - the SkipTest exception
4688 # would appear as a failure.
4689 if self.serv_skipped:
4690 self.skipTest(self.serv_skipped)
4691
4692 def _testWriteNonBlocking(self):
4693 self.serv_skipped = None
4694 self.serv_conn.setblocking(False)
4695 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004696 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004697 LIMIT = 10
4698 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004699 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004700 self.assertGreater(n, 0)
4701 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004702 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004703 if n is None:
4704 # Succeeded
4705 break
4706 self.assertGreater(n, 0)
4707 else:
4708 # Let us know that this test didn't manage to establish
4709 # the expected conditions. This is not a failure in itself but,
4710 # if it happens repeatedly, the test should be fixed.
4711 self.serv_skipped = "failed to saturate the socket buffer"
4712
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004713
Guido van Rossum8c943832002-08-08 01:00:28 +00004714class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4715
4716 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4717
4718
4719class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4720
4721 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004722
Thomas Woutersb2137042007-02-01 18:02:27 +00004723
Antoine Pitrou834bd812010-10-13 16:17:14 +00004724class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4725 """Tests for socket.makefile() in text mode (rather than binary)"""
4726
4727 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004728 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004729 write_mode = 'wb'
4730 write_msg = MSG
4731 newline = ''
4732
4733
4734class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4735 """Tests for socket.makefile() in text mode (rather than binary)"""
4736
4737 read_mode = 'rb'
4738 read_msg = MSG
4739 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004740 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004741 newline = ''
4742
4743
4744class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4745 """Tests for socket.makefile() in text mode (rather than binary)"""
4746
4747 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004748 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004749 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004750 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004751 newline = ''
4752
4753
Guido van Rossumd8faa362007-04-27 19:54:29 +00004754class NetworkConnectionTest(object):
4755 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004756
Guido van Rossumd8faa362007-04-27 19:54:29 +00004757 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004758 # We're inherited below by BasicTCPTest2, which also inherits
4759 # BasicTCPTest, which defines self.port referenced below.
4760 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004761 self.serv_conn = self.cli
4762
4763class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4764 """Tests that NetworkConnection does not break existing TCP functionality.
4765 """
4766
4767class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004768
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004769 class MockSocket(socket.socket):
4770 def connect(self, *args):
4771 raise socket.timeout('timed out')
4772
4773 @contextlib.contextmanager
4774 def mocked_socket_module(self):
4775 """Return a socket which times out on connect"""
4776 old_socket = socket.socket
4777 socket.socket = self.MockSocket
4778 try:
4779 yield
4780 finally:
4781 socket.socket = old_socket
4782
4783 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004784 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004785 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004786 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004787 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004788 cli.connect((HOST, port))
4789 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4790
4791 def test_create_connection(self):
4792 # Issue #9792: errors raised by create_connection() should have
4793 # a proper errno attribute.
4794 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004795 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004796 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004797
4798 # Issue #16257: create_connection() calls getaddrinfo() against
4799 # 'localhost'. This may result in an IPV6 addr being returned
4800 # as well as an IPV4 one:
4801 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4802 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4803 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4804 #
4805 # create_connection() enumerates through all the addresses returned
4806 # and if it doesn't successfully bind to any of them, it propagates
4807 # the last exception it encountered.
4808 #
4809 # On Solaris, ENETUNREACH is returned in this circumstance instead
4810 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4811 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02004812 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04004813 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004814
4815 def test_create_connection_timeout(self):
4816 # Issue #9792: create_connection() should not recast timeout errors
4817 # as generic socket errors.
4818 with self.mocked_socket_module():
4819 with self.assertRaises(socket.timeout):
4820 socket.create_connection((HOST, 1234))
4821
Guido van Rossumd8faa362007-04-27 19:54:29 +00004822
4823class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4824
4825 def __init__(self, methodName='runTest'):
4826 SocketTCPTest.__init__(self, methodName=methodName)
4827 ThreadableTest.__init__(self)
4828
4829 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004830 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004831
4832 def clientTearDown(self):
4833 self.cli.close()
4834 self.cli = None
4835 ThreadableTest.clientTearDown(self)
4836
4837 def _justAccept(self):
4838 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004839 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004840
4841 testFamily = _justAccept
4842 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004843 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004844 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004845 self.assertEqual(self.cli.family, 2)
4846
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004847 testSourceAddress = _justAccept
4848 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004849 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4850 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004851 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004852 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004853 # The port number being used is sufficient to show that the bind()
4854 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004855
Guido van Rossumd8faa362007-04-27 19:54:29 +00004856 testTimeoutDefault = _justAccept
4857 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004858 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004859 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004860 socket.setdefaulttimeout(42)
4861 try:
4862 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004863 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004864 finally:
4865 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004866 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004867
4868 testTimeoutNone = _justAccept
4869 def _testTimeoutNone(self):
4870 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004871 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004872 socket.setdefaulttimeout(30)
4873 try:
4874 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004875 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004876 finally:
4877 socket.setdefaulttimeout(None)
4878 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004879
4880 testTimeoutValueNamed = _justAccept
4881 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004882 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004883 self.assertEqual(self.cli.gettimeout(), 30)
4884
4885 testTimeoutValueNonamed = _justAccept
4886 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004887 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004888 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004889 self.assertEqual(self.cli.gettimeout(), 30)
4890
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004891
Guido van Rossumd8faa362007-04-27 19:54:29 +00004892class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4893
4894 def __init__(self, methodName='runTest'):
4895 SocketTCPTest.__init__(self, methodName=methodName)
4896 ThreadableTest.__init__(self)
4897
4898 def clientSetUp(self):
4899 pass
4900
4901 def clientTearDown(self):
4902 self.cli.close()
4903 self.cli = None
4904 ThreadableTest.clientTearDown(self)
4905
4906 def testInsideTimeout(self):
4907 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004908 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004909 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004910 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004911 testOutsideTimeout = testInsideTimeout
4912
4913 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004914 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004915 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004916 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004917
4918 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004919 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004920 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004921
4922
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004923class TCPTimeoutTest(SocketTCPTest):
4924
4925 def testTCPTimeout(self):
4926 def raise_timeout(*args, **kwargs):
4927 self.serv.settimeout(1.0)
4928 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004929 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004930 "Error generating a timeout exception (TCP)")
4931
4932 def testTimeoutZero(self):
4933 ok = False
4934 try:
4935 self.serv.settimeout(0.0)
4936 foo = self.serv.accept()
4937 except socket.timeout:
4938 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004939 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004940 ok = True
4941 except:
4942 self.fail("caught unexpected exception (TCP)")
4943 if not ok:
4944 self.fail("accept() returned success when we did not expect it")
4945
Serhiy Storchaka43767632013-11-03 21:31:38 +02004946 @unittest.skipUnless(hasattr(signal, 'alarm'),
4947 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004948 def testInterruptedTimeout(self):
4949 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004950 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004951 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004952 self.serv.settimeout(5.0) # must be longer than alarm
4953 class Alarm(Exception):
4954 pass
4955 def alarm_handler(signal, frame):
4956 raise Alarm
4957 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4958 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004959 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004960 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004961 foo = self.serv.accept()
4962 except socket.timeout:
4963 self.fail("caught timeout instead of Alarm")
4964 except Alarm:
4965 pass
4966 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004967 self.fail("caught other exception instead of Alarm:"
4968 " %s(%s):\n%s" %
4969 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004970 else:
4971 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004972 finally:
4973 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004974 except Alarm:
4975 self.fail("got Alarm in wrong place")
4976 finally:
4977 # no alarm can be pending. Safe to restore old handler.
4978 signal.signal(signal.SIGALRM, old_alarm)
4979
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004980class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004981
4982 def testUDPTimeout(self):
4983 def raise_timeout(*args, **kwargs):
4984 self.serv.settimeout(1.0)
4985 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004986 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004987 "Error generating a timeout exception (UDP)")
4988
4989 def testTimeoutZero(self):
4990 ok = False
4991 try:
4992 self.serv.settimeout(0.0)
4993 foo = self.serv.recv(1024)
4994 except socket.timeout:
4995 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004996 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004997 ok = True
4998 except:
4999 self.fail("caught unexpected exception (UDP)")
5000 if not ok:
5001 self.fail("recv() returned success when we did not expect it")
5002
5003class TestExceptions(unittest.TestCase):
5004
5005 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005006 self.assertTrue(issubclass(OSError, Exception))
5007 self.assertTrue(issubclass(socket.herror, OSError))
5008 self.assertTrue(issubclass(socket.gaierror, OSError))
5009 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005010
Yury Selivanovfa22b292016-10-18 16:03:52 -04005011 def test_setblocking_invalidfd(self):
5012 # Regression test for issue #28471
5013
5014 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5015 sock = socket.socket(
5016 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5017 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005018 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005019
5020 with self.assertRaises(OSError):
5021 sock.setblocking(False)
5022
5023
Serhiy Storchaka43767632013-11-03 21:31:38 +02005024@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005025class TestLinuxAbstractNamespace(unittest.TestCase):
5026
5027 UNIX_PATH_MAX = 108
5028
5029 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005030 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005031 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5032 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005033 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005034 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5035 s2.connect(s1.getsockname())
5036 with s1.accept()[0] as s3:
5037 self.assertEqual(s1.getsockname(), address)
5038 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005039
5040 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005041 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005042 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5043 s.bind(address)
5044 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005045
5046 def testNameOverflow(self):
5047 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005048 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005049 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005050
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005051 def testStrName(self):
5052 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005053 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5054 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005055 s.bind("\x00python\x00test\x00")
5056 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005057 finally:
5058 s.close()
5059
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005060 def testBytearrayName(self):
5061 # Check that an abstract name can be passed as a bytearray.
5062 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5063 s.bind(bytearray(b"\x00python\x00test\x00"))
5064 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5065
Serhiy Storchaka43767632013-11-03 21:31:38 +02005066@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005067class TestUnixDomain(unittest.TestCase):
5068
5069 def setUp(self):
5070 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5071
5072 def tearDown(self):
5073 self.sock.close()
5074
5075 def encoded(self, path):
5076 # Return the given path encoded in the file system encoding,
5077 # or skip the test if this is not possible.
5078 try:
5079 return os.fsencode(path)
5080 except UnicodeEncodeError:
5081 self.skipTest(
5082 "Pathname {0!a} cannot be represented in file "
5083 "system encoding {1!r}".format(
5084 path, sys.getfilesystemencoding()))
5085
Antoine Pitrou16374872011-12-16 15:04:12 +01005086 def bind(self, sock, path):
5087 # Bind the socket
5088 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005089 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005090 except OSError as e:
5091 if str(e) == "AF_UNIX path too long":
5092 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005093 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005094 .format(path))
5095 else:
5096 raise
5097
Antoine Pitrou495b5022017-05-02 17:20:00 +02005098 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005099 # Issue #30205 (note getsockname() can return None on OS X)
5100 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005101
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005102 def testStrAddr(self):
5103 # Test binding to and retrieving a normal string pathname.
5104 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005105 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005106 self.addCleanup(support.unlink, path)
5107 self.assertEqual(self.sock.getsockname(), path)
5108
5109 def testBytesAddr(self):
5110 # Test binding to a bytes pathname.
5111 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005112 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005113 self.addCleanup(support.unlink, path)
5114 self.assertEqual(self.sock.getsockname(), path)
5115
5116 def testSurrogateescapeBind(self):
5117 # Test binding to a valid non-ASCII pathname, with the
5118 # non-ASCII bytes supplied using surrogateescape encoding.
5119 path = os.path.abspath(support.TESTFN_UNICODE)
5120 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005121 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005122 self.addCleanup(support.unlink, path)
5123 self.assertEqual(self.sock.getsockname(), path)
5124
5125 def testUnencodableAddr(self):
5126 # Test binding to a pathname that cannot be encoded in the
5127 # file system encoding.
5128 if support.TESTFN_UNENCODABLE is None:
5129 self.skipTest("No unencodable filename available")
5130 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005131 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005132 self.addCleanup(support.unlink, path)
5133 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005134
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005135
Thomas Wouters477c8d52006-05-27 19:21:47 +00005136class BufferIOTest(SocketConnectedTest):
5137 """
5138 Test the buffer versions of socket.recv() and socket.send().
5139 """
5140 def __init__(self, methodName='runTest'):
5141 SocketConnectedTest.__init__(self, methodName=methodName)
5142
Antoine Pitrou25480782010-03-17 22:50:28 +00005143 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005144 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005145 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005146 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005147 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005148 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005149 self.assertEqual(msg, MSG)
5150
Antoine Pitrou25480782010-03-17 22:50:28 +00005151 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005152 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005153 self.serv_conn.send(buf)
5154
Antoine Pitrou25480782010-03-17 22:50:28 +00005155 def testRecvIntoBytearray(self):
5156 buf = bytearray(1024)
5157 nbytes = self.cli_conn.recv_into(buf)
5158 self.assertEqual(nbytes, len(MSG))
5159 msg = buf[:len(MSG)]
5160 self.assertEqual(msg, MSG)
5161
5162 _testRecvIntoBytearray = _testRecvIntoArray
5163
5164 def testRecvIntoMemoryview(self):
5165 buf = bytearray(1024)
5166 nbytes = self.cli_conn.recv_into(memoryview(buf))
5167 self.assertEqual(nbytes, len(MSG))
5168 msg = buf[:len(MSG)]
5169 self.assertEqual(msg, MSG)
5170
5171 _testRecvIntoMemoryview = _testRecvIntoArray
5172
5173 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005174 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005175 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005176 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005177 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005178 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005179 self.assertEqual(msg, MSG)
5180
Antoine Pitrou25480782010-03-17 22:50:28 +00005181 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005182 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005183 self.serv_conn.send(buf)
5184
Antoine Pitrou25480782010-03-17 22:50:28 +00005185 def testRecvFromIntoBytearray(self):
5186 buf = bytearray(1024)
5187 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5188 self.assertEqual(nbytes, len(MSG))
5189 msg = buf[:len(MSG)]
5190 self.assertEqual(msg, MSG)
5191
5192 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5193
5194 def testRecvFromIntoMemoryview(self):
5195 buf = bytearray(1024)
5196 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5197 self.assertEqual(nbytes, len(MSG))
5198 msg = buf[:len(MSG)]
5199 self.assertEqual(msg, MSG)
5200
5201 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5202
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005203 def testRecvFromIntoSmallBuffer(self):
5204 # See issue #20246.
5205 buf = bytearray(8)
5206 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5207
5208 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005209 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005210
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005211 def testRecvFromIntoEmptyBuffer(self):
5212 buf = bytearray()
5213 self.cli_conn.recvfrom_into(buf)
5214 self.cli_conn.recvfrom_into(buf, 0)
5215
5216 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5217
Christian Heimes043d6f62008-01-07 17:19:16 +00005218
5219TIPC_STYPE = 2000
5220TIPC_LOWER = 200
5221TIPC_UPPER = 210
5222
5223def isTipcAvailable():
5224 """Check if the TIPC module is loaded
5225
5226 The TIPC module is not loaded automatically on Ubuntu and probably
5227 other Linux distros.
5228 """
5229 if not hasattr(socket, "AF_TIPC"):
5230 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005231 try:
5232 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005233 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005234 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005235 # have not the permission to read it.
5236 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005237 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005238 for line in f:
5239 if line.startswith("tipc "):
5240 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005241 return False
5242
Serhiy Storchaka43767632013-11-03 21:31:38 +02005243@unittest.skipUnless(isTipcAvailable(),
5244 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005245class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005246 def testRDM(self):
5247 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5248 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005249 self.addCleanup(srv.close)
5250 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005251
5252 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5253 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5254 TIPC_LOWER, TIPC_UPPER)
5255 srv.bind(srvaddr)
5256
5257 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5258 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5259 cli.sendto(MSG, sendaddr)
5260
5261 msg, recvaddr = srv.recvfrom(1024)
5262
5263 self.assertEqual(cli.getsockname(), recvaddr)
5264 self.assertEqual(msg, MSG)
5265
5266
Serhiy Storchaka43767632013-11-03 21:31:38 +02005267@unittest.skipUnless(isTipcAvailable(),
5268 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005269class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005270 def __init__(self, methodName = 'runTest'):
5271 unittest.TestCase.__init__(self, methodName = methodName)
5272 ThreadableTest.__init__(self)
5273
5274 def setUp(self):
5275 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005276 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005277 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5278 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5279 TIPC_LOWER, TIPC_UPPER)
5280 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005281 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005282 self.serverExplicitReady()
5283 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005284 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005285
5286 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005287 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005288 # accept() call; sleep a little while to avoid it, otherwise
5289 # we could get an exception
5290 time.sleep(0.1)
5291 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005292 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005293 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5294 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5295 self.cli.connect(addr)
5296 self.cliaddr = self.cli.getsockname()
5297
5298 def testStream(self):
5299 msg = self.conn.recv(1024)
5300 self.assertEqual(msg, MSG)
5301 self.assertEqual(self.cliaddr, self.connaddr)
5302
5303 def _testStream(self):
5304 self.cli.send(MSG)
5305 self.cli.close()
5306
5307
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005308class ContextManagersTest(ThreadedTCPSocketTest):
5309
5310 def _testSocketClass(self):
5311 # base test
5312 with socket.socket() as sock:
5313 self.assertFalse(sock._closed)
5314 self.assertTrue(sock._closed)
5315 # close inside with block
5316 with socket.socket() as sock:
5317 sock.close()
5318 self.assertTrue(sock._closed)
5319 # exception inside with block
5320 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005321 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005322 self.assertTrue(sock._closed)
5323
5324 def testCreateConnectionBase(self):
5325 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005326 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005327 data = conn.recv(1024)
5328 conn.sendall(data)
5329
5330 def _testCreateConnectionBase(self):
5331 address = self.serv.getsockname()
5332 with socket.create_connection(address) as sock:
5333 self.assertFalse(sock._closed)
5334 sock.sendall(b'foo')
5335 self.assertEqual(sock.recv(1024), b'foo')
5336 self.assertTrue(sock._closed)
5337
5338 def testCreateConnectionClose(self):
5339 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005340 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005341 data = conn.recv(1024)
5342 conn.sendall(data)
5343
5344 def _testCreateConnectionClose(self):
5345 address = self.serv.getsockname()
5346 with socket.create_connection(address) as sock:
5347 sock.close()
5348 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005349 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005350
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005351
Victor Stinnerdaf45552013-08-28 00:53:59 +02005352class InheritanceTest(unittest.TestCase):
5353 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5354 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005355 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005356 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005357 with socket.socket(socket.AF_INET,
5358 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005359 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005360 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005361
5362 def test_default_inheritable(self):
5363 sock = socket.socket()
5364 with sock:
5365 self.assertEqual(sock.get_inheritable(), False)
5366
5367 def test_dup(self):
5368 sock = socket.socket()
5369 with sock:
5370 newsock = sock.dup()
5371 sock.close()
5372 with newsock:
5373 self.assertEqual(newsock.get_inheritable(), False)
5374
5375 def test_set_inheritable(self):
5376 sock = socket.socket()
5377 with sock:
5378 sock.set_inheritable(True)
5379 self.assertEqual(sock.get_inheritable(), True)
5380
5381 sock.set_inheritable(False)
5382 self.assertEqual(sock.get_inheritable(), False)
5383
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005384 @unittest.skipIf(fcntl is None, "need fcntl")
5385 def test_get_inheritable_cloexec(self):
5386 sock = socket.socket()
5387 with sock:
5388 fd = sock.fileno()
5389 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005390
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005391 # clear FD_CLOEXEC flag
5392 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5393 flags &= ~fcntl.FD_CLOEXEC
5394 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005395
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005396 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005397
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005398 @unittest.skipIf(fcntl is None, "need fcntl")
5399 def test_set_inheritable_cloexec(self):
5400 sock = socket.socket()
5401 with sock:
5402 fd = sock.fileno()
5403 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5404 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005405
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005406 sock.set_inheritable(True)
5407 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5408 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005409
5410
Victor Stinnerdaf45552013-08-28 00:53:59 +02005411 def test_socketpair(self):
5412 s1, s2 = socket.socketpair()
5413 self.addCleanup(s1.close)
5414 self.addCleanup(s2.close)
5415 self.assertEqual(s1.get_inheritable(), False)
5416 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005417
5418
5419@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5420 "SOCK_NONBLOCK not defined")
5421class NonblockConstantTest(unittest.TestCase):
5422 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5423 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005424 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005425 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005426 self.assertTrue(
5427 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005428 if timeout == 0:
5429 # timeout == 0: means that getblocking() must be False.
5430 self.assertFalse(s.getblocking())
5431 else:
5432 # If timeout > 0, the socket will be in a "blocking" mode
5433 # from the standpoint of the Python API. For Python socket
5434 # object, "blocking" means that operations like 'sock.recv()'
5435 # will block. Internally, file descriptors for
5436 # "blocking" Python sockets *with timeouts* are in a
5437 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5438 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5439 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005440 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005441 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005442 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005443 self.assertFalse(
5444 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005445 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005446
Charles-François Natali239bb962011-06-03 12:55:15 +02005447 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005448 def test_SOCK_NONBLOCK(self):
5449 # a lot of it seems silly and redundant, but I wanted to test that
5450 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005451 with socket.socket(socket.AF_INET,
5452 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5453 self.checkNonblock(s)
5454 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005455 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005456 s.setblocking(0)
5457 self.checkNonblock(s)
5458 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005459 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005460 s.settimeout(2.0)
5461 self.checkNonblock(s, timeout=2.0)
5462 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005463 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005464 # defaulttimeout
5465 t = socket.getdefaulttimeout()
5466 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005467 with socket.socket() as s:
5468 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005469 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005470 with socket.socket() as s:
5471 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005472 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005473 with socket.socket() as s:
5474 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005475 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005476 with socket.socket() as s:
5477 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005478 socket.setdefaulttimeout(t)
5479
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005480
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005481@unittest.skipUnless(os.name == "nt", "Windows specific")
5482@unittest.skipUnless(multiprocessing, "need multiprocessing")
5483class TestSocketSharing(SocketTCPTest):
5484 # This must be classmethod and not staticmethod or multiprocessing
5485 # won't be able to bootstrap it.
5486 @classmethod
5487 def remoteProcessServer(cls, q):
5488 # Recreate socket from shared data
5489 sdata = q.get()
5490 message = q.get()
5491
5492 s = socket.fromshare(sdata)
5493 s2, c = s.accept()
5494
5495 # Send the message
5496 s2.sendall(message)
5497 s2.close()
5498 s.close()
5499
5500 def testShare(self):
5501 # Transfer the listening server socket to another process
5502 # and service it from there.
5503
5504 # Create process:
5505 q = multiprocessing.Queue()
5506 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5507 p.start()
5508
5509 # Get the shared socket data
5510 data = self.serv.share(p.pid)
5511
5512 # Pass the shared socket to the other process
5513 addr = self.serv.getsockname()
5514 self.serv.close()
5515 q.put(data)
5516
5517 # The data that the server will send us
5518 message = b"slapmahfro"
5519 q.put(message)
5520
5521 # Connect
5522 s = socket.create_connection(addr)
5523 # listen for the data
5524 m = []
5525 while True:
5526 data = s.recv(100)
5527 if not data:
5528 break
5529 m.append(data)
5530 s.close()
5531 received = b"".join(m)
5532 self.assertEqual(received, message)
5533 p.join()
5534
5535 def testShareLength(self):
5536 data = self.serv.share(os.getpid())
5537 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5538 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5539
5540 def compareSockets(self, org, other):
5541 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005542 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005543 self.assertEqual(org.gettimeout(), None)
5544 self.assertEqual(org.gettimeout(), other.gettimeout())
5545
5546 self.assertEqual(org.family, other.family)
5547 self.assertEqual(org.type, other.type)
5548 # If the user specified "0" for proto, then
5549 # internally windows will have picked the correct value.
5550 # Python introspection on the socket however will still return
5551 # 0. For the shared socket, the python value is recreated
5552 # from the actual value, so it may not compare correctly.
5553 if org.proto != 0:
5554 self.assertEqual(org.proto, other.proto)
5555
5556 def testShareLocal(self):
5557 data = self.serv.share(os.getpid())
5558 s = socket.fromshare(data)
5559 try:
5560 self.compareSockets(self.serv, s)
5561 finally:
5562 s.close()
5563
5564 def testTypes(self):
5565 families = [socket.AF_INET, socket.AF_INET6]
5566 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5567 for f in families:
5568 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005569 try:
5570 source = socket.socket(f, t)
5571 except OSError:
5572 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005573 try:
5574 data = source.share(os.getpid())
5575 shared = socket.fromshare(data)
5576 try:
5577 self.compareSockets(source, shared)
5578 finally:
5579 shared.close()
5580 finally:
5581 source.close()
5582
5583
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005584class SendfileUsingSendTest(ThreadedTCPSocketTest):
5585 """
5586 Test the send() implementation of socket.sendfile().
5587 """
5588
Victor Stinner8c663fd2017-11-08 14:44:44 -08005589 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005590 BUFSIZE = 8192
5591 FILEDATA = b""
5592 TIMEOUT = 2
5593
5594 @classmethod
5595 def setUpClass(cls):
5596 def chunks(total, step):
5597 assert total >= step
5598 while total > step:
5599 yield step
5600 total -= step
5601 if total:
5602 yield total
5603
5604 chunk = b"".join([random.choice(string.ascii_letters).encode()
5605 for i in range(cls.BUFSIZE)])
5606 with open(support.TESTFN, 'wb') as f:
5607 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5608 f.write(chunk)
5609 with open(support.TESTFN, 'rb') as f:
5610 cls.FILEDATA = f.read()
5611 assert len(cls.FILEDATA) == cls.FILESIZE
5612
5613 @classmethod
5614 def tearDownClass(cls):
5615 support.unlink(support.TESTFN)
5616
5617 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005618 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005619 conn, addr = self.serv.accept()
5620 conn.settimeout(self.TIMEOUT)
5621 self.addCleanup(conn.close)
5622 return conn
5623
5624 def recv_data(self, conn):
5625 received = []
5626 while True:
5627 chunk = conn.recv(self.BUFSIZE)
5628 if not chunk:
5629 break
5630 received.append(chunk)
5631 return b''.join(received)
5632
5633 def meth_from_sock(self, sock):
5634 # Depending on the mixin class being run return either send()
5635 # or sendfile() method implementation.
5636 return getattr(sock, "_sendfile_use_send")
5637
5638 # regular file
5639
5640 def _testRegularFile(self):
5641 address = self.serv.getsockname()
5642 file = open(support.TESTFN, 'rb')
5643 with socket.create_connection(address) as sock, file as file:
5644 meth = self.meth_from_sock(sock)
5645 sent = meth(file)
5646 self.assertEqual(sent, self.FILESIZE)
5647 self.assertEqual(file.tell(), self.FILESIZE)
5648
5649 def testRegularFile(self):
5650 conn = self.accept_conn()
5651 data = self.recv_data(conn)
5652 self.assertEqual(len(data), self.FILESIZE)
5653 self.assertEqual(data, self.FILEDATA)
5654
5655 # non regular file
5656
5657 def _testNonRegularFile(self):
5658 address = self.serv.getsockname()
5659 file = io.BytesIO(self.FILEDATA)
5660 with socket.create_connection(address) as sock, file as file:
5661 sent = sock.sendfile(file)
5662 self.assertEqual(sent, self.FILESIZE)
5663 self.assertEqual(file.tell(), self.FILESIZE)
5664 self.assertRaises(socket._GiveupOnSendfile,
5665 sock._sendfile_use_sendfile, file)
5666
5667 def testNonRegularFile(self):
5668 conn = self.accept_conn()
5669 data = self.recv_data(conn)
5670 self.assertEqual(len(data), self.FILESIZE)
5671 self.assertEqual(data, self.FILEDATA)
5672
5673 # empty file
5674
5675 def _testEmptyFileSend(self):
5676 address = self.serv.getsockname()
5677 filename = support.TESTFN + "2"
5678 with open(filename, 'wb'):
5679 self.addCleanup(support.unlink, filename)
5680 file = open(filename, 'rb')
5681 with socket.create_connection(address) as sock, file as file:
5682 meth = self.meth_from_sock(sock)
5683 sent = meth(file)
5684 self.assertEqual(sent, 0)
5685 self.assertEqual(file.tell(), 0)
5686
5687 def testEmptyFileSend(self):
5688 conn = self.accept_conn()
5689 data = self.recv_data(conn)
5690 self.assertEqual(data, b"")
5691
5692 # offset
5693
5694 def _testOffset(self):
5695 address = self.serv.getsockname()
5696 file = open(support.TESTFN, 'rb')
5697 with socket.create_connection(address) as sock, file as file:
5698 meth = self.meth_from_sock(sock)
5699 sent = meth(file, offset=5000)
5700 self.assertEqual(sent, self.FILESIZE - 5000)
5701 self.assertEqual(file.tell(), self.FILESIZE)
5702
5703 def testOffset(self):
5704 conn = self.accept_conn()
5705 data = self.recv_data(conn)
5706 self.assertEqual(len(data), self.FILESIZE - 5000)
5707 self.assertEqual(data, self.FILEDATA[5000:])
5708
5709 # count
5710
5711 def _testCount(self):
5712 address = self.serv.getsockname()
5713 file = open(support.TESTFN, 'rb')
5714 with socket.create_connection(address, timeout=2) as sock, file as file:
5715 count = 5000007
5716 meth = self.meth_from_sock(sock)
5717 sent = meth(file, count=count)
5718 self.assertEqual(sent, count)
5719 self.assertEqual(file.tell(), count)
5720
5721 def testCount(self):
5722 count = 5000007
5723 conn = self.accept_conn()
5724 data = self.recv_data(conn)
5725 self.assertEqual(len(data), count)
5726 self.assertEqual(data, self.FILEDATA[:count])
5727
5728 # count small
5729
5730 def _testCountSmall(self):
5731 address = self.serv.getsockname()
5732 file = open(support.TESTFN, 'rb')
5733 with socket.create_connection(address, timeout=2) as sock, file as file:
5734 count = 1
5735 meth = self.meth_from_sock(sock)
5736 sent = meth(file, count=count)
5737 self.assertEqual(sent, count)
5738 self.assertEqual(file.tell(), count)
5739
5740 def testCountSmall(self):
5741 count = 1
5742 conn = self.accept_conn()
5743 data = self.recv_data(conn)
5744 self.assertEqual(len(data), count)
5745 self.assertEqual(data, self.FILEDATA[:count])
5746
5747 # count + offset
5748
5749 def _testCountWithOffset(self):
5750 address = self.serv.getsockname()
5751 file = open(support.TESTFN, 'rb')
5752 with socket.create_connection(address, timeout=2) as sock, file as file:
5753 count = 100007
5754 meth = self.meth_from_sock(sock)
5755 sent = meth(file, offset=2007, count=count)
5756 self.assertEqual(sent, count)
5757 self.assertEqual(file.tell(), count + 2007)
5758
5759 def testCountWithOffset(self):
5760 count = 100007
5761 conn = self.accept_conn()
5762 data = self.recv_data(conn)
5763 self.assertEqual(len(data), count)
5764 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5765
5766 # non blocking sockets are not supposed to work
5767
5768 def _testNonBlocking(self):
5769 address = self.serv.getsockname()
5770 file = open(support.TESTFN, 'rb')
5771 with socket.create_connection(address) as sock, file as file:
5772 sock.setblocking(False)
5773 meth = self.meth_from_sock(sock)
5774 self.assertRaises(ValueError, meth, file)
5775 self.assertRaises(ValueError, sock.sendfile, file)
5776
5777 def testNonBlocking(self):
5778 conn = self.accept_conn()
5779 if conn.recv(8192):
5780 self.fail('was not supposed to receive any data')
5781
5782 # timeout (non-triggered)
5783
5784 def _testWithTimeout(self):
5785 address = self.serv.getsockname()
5786 file = open(support.TESTFN, 'rb')
5787 with socket.create_connection(address, timeout=2) as sock, file as file:
5788 meth = self.meth_from_sock(sock)
5789 sent = meth(file)
5790 self.assertEqual(sent, self.FILESIZE)
5791
5792 def testWithTimeout(self):
5793 conn = self.accept_conn()
5794 data = self.recv_data(conn)
5795 self.assertEqual(len(data), self.FILESIZE)
5796 self.assertEqual(data, self.FILEDATA)
5797
5798 # timeout (triggered)
5799
5800 def _testWithTimeoutTriggeredSend(self):
5801 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00005802 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005803 with socket.create_connection(address) as sock:
5804 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00005805 meth = self.meth_from_sock(sock)
5806 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005807
5808 def testWithTimeoutTriggeredSend(self):
5809 conn = self.accept_conn()
5810 conn.recv(88192)
5811
5812 # errors
5813
5814 def _test_errors(self):
5815 pass
5816
5817 def test_errors(self):
5818 with open(support.TESTFN, 'rb') as file:
5819 with socket.socket(type=socket.SOCK_DGRAM) as s:
5820 meth = self.meth_from_sock(s)
5821 self.assertRaisesRegex(
5822 ValueError, "SOCK_STREAM", meth, file)
5823 with open(support.TESTFN, 'rt') as file:
5824 with socket.socket() as s:
5825 meth = self.meth_from_sock(s)
5826 self.assertRaisesRegex(
5827 ValueError, "binary mode", meth, file)
5828 with open(support.TESTFN, 'rb') as file:
5829 with socket.socket() as s:
5830 meth = self.meth_from_sock(s)
5831 self.assertRaisesRegex(TypeError, "positive integer",
5832 meth, file, count='2')
5833 self.assertRaisesRegex(TypeError, "positive integer",
5834 meth, file, count=0.1)
5835 self.assertRaisesRegex(ValueError, "positive integer",
5836 meth, file, count=0)
5837 self.assertRaisesRegex(ValueError, "positive integer",
5838 meth, file, count=-1)
5839
5840
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005841@unittest.skipUnless(hasattr(os, "sendfile"),
5842 'os.sendfile() required for this test.')
5843class SendfileUsingSendfileTest(SendfileUsingSendTest):
5844 """
5845 Test the sendfile() implementation of socket.sendfile().
5846 """
5847 def meth_from_sock(self, sock):
5848 return getattr(sock, "_sendfile_use_sendfile")
5849
Christian Heimes48371412016-09-06 00:37:46 +02005850
5851@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005852class LinuxKernelCryptoAPI(unittest.TestCase):
5853 # tests for AF_ALG
5854 def create_alg(self, typ, name):
5855 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005856 try:
5857 sock.bind((typ, name))
5858 except FileNotFoundError as e:
5859 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005860 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005861 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005862 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005863 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005864
Victor Stinner86afc1f2017-11-30 13:58:43 +01005865 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5866 # at least on ppc64le architecture
5867 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005868 def test_sha256(self):
5869 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5870 "177a9cb410ff61f20015ad")
5871 with self.create_alg('hash', 'sha256') as algo:
5872 op, _ = algo.accept()
5873 with op:
5874 op.sendall(b"abc")
5875 self.assertEqual(op.recv(512), expected)
5876
5877 op, _ = algo.accept()
5878 with op:
5879 op.send(b'a', socket.MSG_MORE)
5880 op.send(b'b', socket.MSG_MORE)
5881 op.send(b'c', socket.MSG_MORE)
5882 op.send(b'')
5883 self.assertEqual(op.recv(512), expected)
5884
5885 def test_hmac_sha1(self):
5886 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5887 with self.create_alg('hash', 'hmac(sha1)') as algo:
5888 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5889 op, _ = algo.accept()
5890 with op:
5891 op.sendall(b"what do ya want for nothing?")
5892 self.assertEqual(op.recv(512), expected)
5893
Christian Heimese084f842016-09-11 20:11:30 +02005894 # Although it should work with 3.19 and newer the test blocks on
5895 # Ubuntu 15.10 with Kernel 4.2.0-19.
5896 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005897 def test_aes_cbc(self):
5898 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5899 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5900 msg = b"Single block msg"
5901 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5902 msglen = len(msg)
5903 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5904 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5905 op, _ = algo.accept()
5906 with op:
5907 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5908 flags=socket.MSG_MORE)
5909 op.sendall(msg)
5910 self.assertEqual(op.recv(msglen), ciphertext)
5911
5912 op, _ = algo.accept()
5913 with op:
5914 op.sendmsg_afalg([ciphertext],
5915 op=socket.ALG_OP_DECRYPT, iv=iv)
5916 self.assertEqual(op.recv(msglen), msg)
5917
5918 # long message
5919 multiplier = 1024
5920 longmsg = [msg] * multiplier
5921 op, _ = algo.accept()
5922 with op:
5923 op.sendmsg_afalg(longmsg,
5924 op=socket.ALG_OP_ENCRYPT, iv=iv)
5925 enc = op.recv(msglen * multiplier)
5926 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05005927 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005928
5929 op, _ = algo.accept()
5930 with op:
5931 op.sendmsg_afalg([enc],
5932 op=socket.ALG_OP_DECRYPT, iv=iv)
5933 dec = op.recv(msglen * multiplier)
5934 self.assertEqual(len(dec), msglen * multiplier)
5935 self.assertEqual(dec, msg * multiplier)
5936
matejcik9764c152017-02-16 14:41:31 +01005937 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005938 def test_aead_aes_gcm(self):
5939 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5940 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5941 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5942 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5943 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5944 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5945
5946 taglen = len(expected_tag)
5947 assoclen = len(assoc)
5948
5949 with self.create_alg('aead', 'gcm(aes)') as algo:
5950 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5951 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5952 None, taglen)
5953
5954 # send assoc, plain and tag buffer in separate steps
5955 op, _ = algo.accept()
5956 with op:
5957 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5958 assoclen=assoclen, flags=socket.MSG_MORE)
5959 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005960 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005961 res = op.recv(assoclen + len(plain) + taglen)
5962 self.assertEqual(expected_ct, res[assoclen:-taglen])
5963 self.assertEqual(expected_tag, res[-taglen:])
5964
5965 # now with msg
5966 op, _ = algo.accept()
5967 with op:
matejcik9764c152017-02-16 14:41:31 +01005968 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005969 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5970 assoclen=assoclen)
5971 res = op.recv(assoclen + len(plain) + taglen)
5972 self.assertEqual(expected_ct, res[assoclen:-taglen])
5973 self.assertEqual(expected_tag, res[-taglen:])
5974
5975 # create anc data manually
5976 pack_uint32 = struct.Struct('I').pack
5977 op, _ = algo.accept()
5978 with op:
matejcik9764c152017-02-16 14:41:31 +01005979 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005980 op.sendmsg(
5981 [msg],
5982 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5983 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5984 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5985 )
5986 )
matejcik9764c152017-02-16 14:41:31 +01005987 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005988 self.assertEqual(expected_ct, res[assoclen:-taglen])
5989 self.assertEqual(expected_tag, res[-taglen:])
5990
5991 # decrypt and verify
5992 op, _ = algo.accept()
5993 with op:
5994 msg = assoc + expected_ct + expected_tag
5995 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5996 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005997 res = op.recv(len(msg) - taglen)
5998 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005999
Christian Heimese084f842016-09-11 20:11:30 +02006000 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02006001 def test_drbg_pr_sha256(self):
6002 # deterministic random bit generator, prediction resistance, sha256
6003 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6004 extra_seed = os.urandom(32)
6005 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6006 op, _ = algo.accept()
6007 with op:
6008 rn = op.recv(32)
6009 self.assertEqual(len(rn), 32)
6010
6011 def test_sendmsg_afalg_args(self):
6012 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006013 with sock:
6014 with self.assertRaises(TypeError):
6015 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006016
Christian Heimes02b30352016-09-11 19:49:56 +02006017 with self.assertRaises(TypeError):
6018 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006019
Christian Heimes02b30352016-09-11 19:49:56 +02006020 with self.assertRaises(TypeError):
6021 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006022
Christian Heimes02b30352016-09-11 19:49:56 +02006023 with self.assertRaises(TypeError):
6024 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006025
Christian Heimes02b30352016-09-11 19:49:56 +02006026 with self.assertRaises(TypeError):
6027 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6028
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006029 def test_length_restriction(self):
6030 # bpo-35050, off-by-one error in length check
6031 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6032 self.addCleanup(sock.close)
6033
6034 # salg_type[14]
6035 with self.assertRaises(FileNotFoundError):
6036 sock.bind(("t" * 13, "name"))
6037 with self.assertRaisesRegex(ValueError, "type too long"):
6038 sock.bind(("t" * 14, "name"))
6039
6040 # salg_name[64]
6041 with self.assertRaises(FileNotFoundError):
6042 sock.bind(("type", "n" * 63))
6043 with self.assertRaisesRegex(ValueError, "name too long"):
6044 sock.bind(("type", "n" * 64))
6045
6046
animalize19e7d482018-02-27 02:10:36 +08006047@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6048class TestMSWindowsTCPFlags(unittest.TestCase):
6049 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006050 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006051 'TCP_MAXSEG',
6052 'TCP_NODELAY',
6053 # available starting with Windows 10 1607
6054 'TCP_FASTOPEN',
6055 # available starting with Windows 10 1703
6056 'TCP_KEEPCNT',
6057 # available starting with Windows 10 1709
6058 'TCP_KEEPIDLE',
6059 'TCP_KEEPINTVL'
6060 }
6061
6062 def test_new_tcp_flags(self):
6063 provided = [s for s in dir(socket) if s.startswith('TCP')]
6064 unknown = [s for s in provided if s not in self.knownTCPFlags]
6065
6066 self.assertEqual([], unknown,
6067 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006068
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006069
6070class CreateServerTest(unittest.TestCase):
6071
6072 def test_address(self):
6073 port = support.find_unused_port()
6074 with socket.create_server(("127.0.0.1", port)) as sock:
6075 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6076 self.assertEqual(sock.getsockname()[1], port)
6077 if support.IPV6_ENABLED:
6078 with socket.create_server(("::1", port),
6079 family=socket.AF_INET6) as sock:
6080 self.assertEqual(sock.getsockname()[0], "::1")
6081 self.assertEqual(sock.getsockname()[1], port)
6082
6083 def test_family_and_type(self):
6084 with socket.create_server(("127.0.0.1", 0)) as sock:
6085 self.assertEqual(sock.family, socket.AF_INET)
6086 self.assertEqual(sock.type, socket.SOCK_STREAM)
6087 if support.IPV6_ENABLED:
6088 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6089 self.assertEqual(s.family, socket.AF_INET6)
6090 self.assertEqual(sock.type, socket.SOCK_STREAM)
6091
6092 def test_reuse_port(self):
6093 if not hasattr(socket, "SO_REUSEPORT"):
6094 with self.assertRaises(ValueError):
6095 socket.create_server(("localhost", 0), reuse_port=True)
6096 else:
6097 with socket.create_server(("localhost", 0)) as sock:
6098 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6099 self.assertEqual(opt, 0)
6100 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6101 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6102 self.assertNotEqual(opt, 0)
6103
6104 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6105 not hasattr(_socket, 'IPV6_V6ONLY'),
6106 "IPV6_V6ONLY option not supported")
6107 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6108 def test_ipv6_only_default(self):
6109 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6110 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6111
6112 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6113 "dualstack_ipv6 not supported")
6114 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6115 def test_dualstack_ipv6_family(self):
6116 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6117 dualstack_ipv6=True) as sock:
6118 self.assertEqual(sock.family, socket.AF_INET6)
6119
6120
6121class CreateServerFunctionalTest(unittest.TestCase):
6122 timeout = 3
6123
6124 def setUp(self):
6125 self.thread = None
6126
6127 def tearDown(self):
6128 if self.thread is not None:
6129 self.thread.join(self.timeout)
6130
6131 def echo_server(self, sock):
6132 def run(sock):
6133 with sock:
6134 conn, _ = sock.accept()
6135 with conn:
6136 event.wait(self.timeout)
6137 msg = conn.recv(1024)
6138 if not msg:
6139 return
6140 conn.sendall(msg)
6141
6142 event = threading.Event()
6143 sock.settimeout(self.timeout)
6144 self.thread = threading.Thread(target=run, args=(sock, ))
6145 self.thread.start()
6146 event.set()
6147
6148 def echo_client(self, addr, family):
6149 with socket.socket(family=family) as sock:
6150 sock.settimeout(self.timeout)
6151 sock.connect(addr)
6152 sock.sendall(b'foo')
6153 self.assertEqual(sock.recv(1024), b'foo')
6154
6155 def test_tcp4(self):
6156 port = support.find_unused_port()
6157 with socket.create_server(("", port)) as sock:
6158 self.echo_server(sock)
6159 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6160
6161 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6162 def test_tcp6(self):
6163 port = support.find_unused_port()
6164 with socket.create_server(("", port),
6165 family=socket.AF_INET6) as sock:
6166 self.echo_server(sock)
6167 self.echo_client(("::1", port), socket.AF_INET6)
6168
6169 # --- dual stack tests
6170
6171 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6172 "dualstack_ipv6 not supported")
6173 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6174 def test_dual_stack_client_v4(self):
6175 port = support.find_unused_port()
6176 with socket.create_server(("", port), family=socket.AF_INET6,
6177 dualstack_ipv6=True) as sock:
6178 self.echo_server(sock)
6179 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6180
6181 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6182 "dualstack_ipv6 not supported")
6183 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6184 def test_dual_stack_client_v6(self):
6185 port = support.find_unused_port()
6186 with socket.create_server(("", port), family=socket.AF_INET6,
6187 dualstack_ipv6=True) as sock:
6188 self.echo_server(sock)
6189 self.echo_client(("::1", port), socket.AF_INET6)
6190
6191
Guido van Rossumb995eb72002-07-31 16:08:40 +00006192def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006193 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006194 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
6195 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006196
6197 tests.extend([
6198 NonBlockingTCPTests,
6199 FileObjectClassTestCase,
6200 UnbufferedFileObjectClassTestCase,
6201 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006202 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006203 UnicodeReadFileObjectClassTestCase,
6204 UnicodeWriteFileObjectClassTestCase,
6205 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006206 NetworkConnectionNoServer,
6207 NetworkConnectionAttributesTest,
6208 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006209 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006210 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006211 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006212 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006213 tests.append(BasicSocketPairTest)
6214 tests.append(TestUnixDomain)
6215 tests.append(TestLinuxAbstractNamespace)
6216 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006217 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006218 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006219 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006220 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006221 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006222 BasicVSOCKTest,
6223 ThreadedVSOCKSocketStreamTest,
6224 ])
6225 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006226 CmsgMacroTests,
6227 SendmsgUDPTest,
6228 RecvmsgUDPTest,
6229 RecvmsgIntoUDPTest,
6230 SendmsgUDP6Test,
6231 RecvmsgUDP6Test,
6232 RecvmsgRFC3542AncillaryUDP6Test,
6233 RecvmsgIntoRFC3542AncillaryUDP6Test,
6234 RecvmsgIntoUDP6Test,
6235 SendmsgTCPTest,
6236 RecvmsgTCPTest,
6237 RecvmsgIntoTCPTest,
6238 SendmsgSCTPStreamTest,
6239 RecvmsgSCTPStreamTest,
6240 RecvmsgIntoSCTPStreamTest,
6241 SendmsgUnixStreamTest,
6242 RecvmsgUnixStreamTest,
6243 RecvmsgIntoUnixStreamTest,
6244 RecvmsgSCMRightsStreamTest,
6245 RecvmsgIntoSCMRightsStreamTest,
6246 # These are slow when setitimer() is not available
6247 InterruptedRecvTimeoutTest,
6248 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006249 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006250 SendfileUsingSendTest,
6251 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006252 ])
animalize19e7d482018-02-27 02:10:36 +08006253 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006254
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006255 thread_info = support.threading_setup()
6256 support.run_unittest(*tests)
6257 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006258
6259if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006260 test_main()