blob: 74662cfeb327af598fdecf6147668dfa047948a1 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
Michael Felt56614592018-12-26 04:34:37 +010015import platform
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020022import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020023import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010024import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020025import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020026import _thread as thread
27import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000028try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000029 import multiprocessing
30except ImportError:
31 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020032try:
33 import fcntl
34except ImportError:
35 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Benjamin Petersonee8712c2008-05-20 21:35:26 +000037HOST = support.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010038# test unicode string and carriage return
39MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Victor Stinnerebd5d6d2018-11-30 12:29:25 +010040MAIN_TIMEOUT = 60.0
Barry Warsawcf3d4b51997-01-03 20:03:32 +000041
caaveryeffc12f2017-09-06 18:18:10 -040042VSOCKPORT = 1234
Michael Felt56614592018-12-26 04:34:37 +010043AIX = platform.system() == "AIX"
caaveryeffc12f2017-09-06 18:18:10 -040044
Victor Stinner45df8202010-04-28 22:31:17 +000045try:
Victor Stinnere254e532014-07-26 14:36:55 +020046 import _socket
47except ImportError:
48 _socket = None
49
caaveryeffc12f2017-09-06 18:18:10 -040050def get_cid():
51 if fcntl is None:
52 return None
53 try:
54 with open("/dev/vsock", "rb") as f:
55 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
56 except OSError:
57 return None
58 else:
59 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000060
Charles-François Natali47413c12011-10-06 19:47:44 +020061def _have_socket_can():
62 """Check whether CAN sockets are supported on this host."""
63 try:
64 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020065 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020066 return False
67 else:
68 s.close()
69 return True
70
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040071def _have_socket_can_isotp():
72 """Check whether CAN ISOTP sockets are supported on this host."""
73 try:
74 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
75 except (AttributeError, OSError):
76 return False
77 else:
78 s.close()
79 return True
80
Charles-François Natali10b8cf42011-11-10 19:21:37 +010081def _have_socket_rds():
82 """Check whether RDS sockets are supported on this host."""
83 try:
84 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
85 except (AttributeError, OSError):
86 return False
87 else:
88 s.close()
89 return True
90
Christian Heimes48371412016-09-06 00:37:46 +020091def _have_socket_alg():
92 """Check whether AF_ALG sockets are supported on this host."""
93 try:
94 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
95 except (AttributeError, OSError):
96 return False
97 else:
98 s.close()
99 return True
100
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700101def _have_socket_qipcrtr():
102 """Check whether AF_QIPCRTR sockets are supported on this host."""
103 try:
104 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
105 except (AttributeError, OSError):
106 return False
107 else:
108 s.close()
109 return True
110
caaveryeffc12f2017-09-06 18:18:10 -0400111def _have_socket_vsock():
112 """Check whether AF_VSOCK sockets are supported on this host."""
113 ret = get_cid() is not None
114 return ret
115
Yury Selivanovf11b4602018-01-28 17:27:38 -0500116
Victor Stinner304315d2018-11-30 13:22:44 +0100117@contextlib.contextmanager
118def socket_setdefaulttimeout(timeout):
119 old_timeout = socket.getdefaulttimeout()
120 try:
121 socket.setdefaulttimeout(timeout)
122 yield
123 finally:
124 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500125
126
Charles-François Natali47413c12011-10-06 19:47:44 +0200127HAVE_SOCKET_CAN = _have_socket_can()
128
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400129HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
130
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100131HAVE_SOCKET_RDS = _have_socket_rds()
132
Christian Heimes48371412016-09-06 00:37:46 +0200133HAVE_SOCKET_ALG = _have_socket_alg()
134
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700135HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
136
caaveryeffc12f2017-09-06 18:18:10 -0400137HAVE_SOCKET_VSOCK = _have_socket_vsock()
138
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000139# Size in bytes of the int type
140SIZEOF_INT = array.array("i").itemsize
141
Guido van Rossum24e4af82002-06-12 19:18:08 +0000142class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000143
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144 def setUp(self):
145 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000146 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100147 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000148
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149 def tearDown(self):
150 self.serv.close()
151 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000152
Guido van Rossum24e4af82002-06-12 19:18:08 +0000153class SocketUDPTest(unittest.TestCase):
154
155 def setUp(self):
156 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000157 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000158
159 def tearDown(self):
160 self.serv.close()
161 self.serv = None
162
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000163class ThreadSafeCleanupTestCase(unittest.TestCase):
164 """Subclass of unittest.TestCase with thread-safe cleanup methods.
165
166 This subclass protects the addCleanup() and doCleanups() methods
167 with a recursive lock.
168 """
169
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200170 def __init__(self, *args, **kwargs):
171 super().__init__(*args, **kwargs)
172 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000173
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200174 def addCleanup(self, *args, **kwargs):
175 with self._cleanup_lock:
176 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000177
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200178 def doCleanups(self, *args, **kwargs):
179 with self._cleanup_lock:
180 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000181
Charles-François Natali47413c12011-10-06 19:47:44 +0200182class SocketCANTest(unittest.TestCase):
183
184 """To be able to run this test, a `vcan0` CAN interface can be created with
185 the following commands:
186 # modprobe vcan
187 # ip link add dev vcan0 type vcan
188 # ifconfig vcan0 up
189 """
190 interface = 'vcan0'
191 bufsize = 128
192
Charles-François Natali773e42d2013-02-05 19:42:01 +0100193 """The CAN frame structure is defined in <linux/can.h>:
194
195 struct can_frame {
196 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
197 __u8 can_dlc; /* data length code: 0 .. 8 */
198 __u8 data[8] __attribute__((aligned(8)));
199 };
200 """
201 can_frame_fmt = "=IB3x8s"
202 can_frame_size = struct.calcsize(can_frame_fmt)
203
204 """The Broadcast Management Command frame structure is defined
205 in <linux/can/bcm.h>:
206
207 struct bcm_msg_head {
208 __u32 opcode;
209 __u32 flags;
210 __u32 count;
211 struct timeval ival1, ival2;
212 canid_t can_id;
213 __u32 nframes;
214 struct can_frame frames[0];
215 }
216
217 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
218 `struct can_frame` definition). Must use native not standard types for packing.
219 """
220 bcm_cmd_msg_fmt = "@3I4l2I"
221 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
222
Charles-François Natali47413c12011-10-06 19:47:44 +0200223 def setUp(self):
224 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200225 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200226 try:
227 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200228 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200229 self.skipTest('network interface `%s` does not exist' %
230 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200231
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100232
233class SocketRDSTest(unittest.TestCase):
234
235 """To be able to run this test, the `rds` kernel module must be loaded:
236 # modprobe rds
237 """
238 bufsize = 8192
239
240 def setUp(self):
241 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
242 self.addCleanup(self.serv.close)
243 try:
244 self.port = support.bind_port(self.serv)
245 except OSError:
246 self.skipTest('unable to bind RDS socket')
247
248
Guido van Rossum24e4af82002-06-12 19:18:08 +0000249class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000250 """Threadable Test class
251
252 The ThreadableTest class makes it easy to create a threaded
253 client/server pair from an existing unit test. To create a
254 new threaded class from an existing unit test, use multiple
255 inheritance:
256
257 class NewClass (OldClass, ThreadableTest):
258 pass
259
260 This class defines two new fixture functions with obvious
261 purposes for overriding:
262
263 clientSetUp ()
264 clientTearDown ()
265
266 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000267 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000268 '_' to indicate the client portion of the test. Ex:
269
270 def testFoo(self):
271 # Server portion
272
273 def _testFoo(self):
274 # Client portion
275
276 Any exceptions raised by the clients during their tests
277 are caught and transferred to the main thread to alert
278 the testing framework.
279
280 Note, the server setup function cannot call any blocking
281 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000282 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000283 the blocking call (such as in setting up a client/server
284 connection and performing the accept() in setUp().
285 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286
287 def __init__(self):
288 # Swap the true setup function
289 self.__setUp = self.setUp
290 self.__tearDown = self.tearDown
291 self.setUp = self._setUp
292 self.tearDown = self._tearDown
293
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000294 def serverExplicitReady(self):
295 """This method allows the server to explicitly indicate that
296 it wants the client thread to proceed. This is useful if the
297 server is about to execute a blocking routine that is
298 dependent upon the client thread during its setup routine."""
299 self.server_ready.set()
300
Guido van Rossum24e4af82002-06-12 19:18:08 +0000301 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700302 self.wait_threads = support.wait_threads_exit()
303 self.wait_threads.__enter__()
304
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000305 self.server_ready = threading.Event()
306 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000307 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000308 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200309 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000310
311 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000312 methodname = self.id()
313 i = methodname.rfind('.')
314 methodname = methodname[i+1:]
315 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000316 self.client_thread = thread.start_new_thread(
317 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200319 try:
320 self.__setUp()
321 except:
322 self.server_crashed = True
323 raise
324 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000325 self.server_ready.set()
326 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327
328 def _tearDown(self):
329 self.__tearDown()
330 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700331 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000333 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000334 exc = self.queue.get()
335 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000336
337 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000338 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100339 try:
340 self.clientSetUp()
341 except BaseException as e:
342 self.queue.put(e)
343 self.clientTearDown()
344 return
345 finally:
346 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200347 if self.server_crashed:
348 self.clientTearDown()
349 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000350 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000351 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000352 try:
353 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000354 except BaseException as e:
355 self.queue.put(e)
356 finally:
357 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358
359 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000360 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361
362 def clientTearDown(self):
363 self.done.set()
364 thread.exit()
365
366class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
367
368 def __init__(self, methodName='runTest'):
369 SocketTCPTest.__init__(self, methodName=methodName)
370 ThreadableTest.__init__(self)
371
372 def clientSetUp(self):
373 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
374
375 def clientTearDown(self):
376 self.cli.close()
377 self.cli = None
378 ThreadableTest.clientTearDown(self)
379
380class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
381
382 def __init__(self, methodName='runTest'):
383 SocketUDPTest.__init__(self, methodName=methodName)
384 ThreadableTest.__init__(self)
385
386 def clientSetUp(self):
387 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
388
Brian Curtin3beb38f2010-11-04 03:41:43 +0000389 def clientTearDown(self):
390 self.cli.close()
391 self.cli = None
392 ThreadableTest.clientTearDown(self)
393
Charles-François Natali47413c12011-10-06 19:47:44 +0200394class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
395
396 def __init__(self, methodName='runTest'):
397 SocketCANTest.__init__(self, methodName=methodName)
398 ThreadableTest.__init__(self)
399
400 def clientSetUp(self):
401 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
402 try:
403 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200404 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200405 # skipTest should not be called here, and will be called in the
406 # server instead
407 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200408
409 def clientTearDown(self):
410 self.cli.close()
411 self.cli = None
412 ThreadableTest.clientTearDown(self)
413
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100414class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
415
416 def __init__(self, methodName='runTest'):
417 SocketRDSTest.__init__(self, methodName=methodName)
418 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100419
420 def clientSetUp(self):
421 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
422 try:
423 # RDS sockets must be bound explicitly to send or receive data
424 self.cli.bind((HOST, 0))
425 self.cli_addr = self.cli.getsockname()
426 except OSError:
427 # skipTest should not be called here, and will be called in the
428 # server instead
429 pass
430
431 def clientTearDown(self):
432 self.cli.close()
433 self.cli = None
434 ThreadableTest.clientTearDown(self)
435
caaveryeffc12f2017-09-06 18:18:10 -0400436@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400437@unittest.skipUnless(HAVE_SOCKET_VSOCK,
438 'VSOCK sockets required for this test.')
439@unittest.skipUnless(get_cid() != 2,
440 "This test can only be run on a virtual guest.")
441class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
442
443 def __init__(self, methodName='runTest'):
444 unittest.TestCase.__init__(self, methodName=methodName)
445 ThreadableTest.__init__(self)
446
447 def setUp(self):
448 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
449 self.addCleanup(self.serv.close)
450 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
451 self.serv.listen()
452 self.serverExplicitReady()
453 self.conn, self.connaddr = self.serv.accept()
454 self.addCleanup(self.conn.close)
455
456 def clientSetUp(self):
457 time.sleep(0.1)
458 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
459 self.addCleanup(self.cli.close)
460 cid = get_cid()
461 self.cli.connect((cid, VSOCKPORT))
462
463 def testStream(self):
464 msg = self.conn.recv(1024)
465 self.assertEqual(msg, MSG)
466
467 def _testStream(self):
468 self.cli.send(MSG)
469 self.cli.close()
470
Guido van Rossum24e4af82002-06-12 19:18:08 +0000471class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000472 """Socket tests for client-server connection.
473
474 self.cli_conn is a client socket connected to the server. The
475 setUp() method guarantees that it is connected to the server.
476 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477
478 def __init__(self, methodName='runTest'):
479 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
480
481 def setUp(self):
482 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000483 # Indicate explicitly we're ready for the client thread to
484 # proceed and then perform the blocking call to accept
485 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486 conn, addr = self.serv.accept()
487 self.cli_conn = conn
488
489 def tearDown(self):
490 self.cli_conn.close()
491 self.cli_conn = None
492 ThreadedTCPSocketTest.tearDown(self)
493
494 def clientSetUp(self):
495 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000496 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000497 self.serv_conn = self.cli
498
499 def clientTearDown(self):
500 self.serv_conn.close()
501 self.serv_conn = None
502 ThreadedTCPSocketTest.clientTearDown(self)
503
Dave Cole331708b2004-08-09 04:51:41 +0000504class SocketPairTest(unittest.TestCase, ThreadableTest):
505
506 def __init__(self, methodName='runTest'):
507 unittest.TestCase.__init__(self, methodName=methodName)
508 ThreadableTest.__init__(self)
509
510 def setUp(self):
511 self.serv, self.cli = socket.socketpair()
512
513 def tearDown(self):
514 self.serv.close()
515 self.serv = None
516
517 def clientSetUp(self):
518 pass
519
520 def clientTearDown(self):
521 self.cli.close()
522 self.cli = None
523 ThreadableTest.clientTearDown(self)
524
Tim Peters494aaee2004-08-09 18:54:11 +0000525
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000526# The following classes are used by the sendmsg()/recvmsg() tests.
527# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
528# gives a drop-in replacement for SocketConnectedTest, but different
529# address families can be used, and the attributes serv_addr and
530# cli_addr will be set to the addresses of the endpoints.
531
532class SocketTestBase(unittest.TestCase):
533 """A base class for socket tests.
534
535 Subclasses must provide methods newSocket() to return a new socket
536 and bindSock(sock) to bind it to an unused address.
537
538 Creates a socket self.serv and sets self.serv_addr to its address.
539 """
540
541 def setUp(self):
542 self.serv = self.newSocket()
543 self.bindServer()
544
545 def bindServer(self):
546 """Bind server socket and set self.serv_addr to its address."""
547 self.bindSock(self.serv)
548 self.serv_addr = self.serv.getsockname()
549
550 def tearDown(self):
551 self.serv.close()
552 self.serv = None
553
554
555class SocketListeningTestMixin(SocketTestBase):
556 """Mixin to listen on the server socket."""
557
558 def setUp(self):
559 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100560 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000561
562
563class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
564 ThreadableTest):
565 """Mixin to add client socket and allow client/server tests.
566
567 Client socket is self.cli and its address is self.cli_addr. See
568 ThreadableTest for usage information.
569 """
570
571 def __init__(self, *args, **kwargs):
572 super().__init__(*args, **kwargs)
573 ThreadableTest.__init__(self)
574
575 def clientSetUp(self):
576 self.cli = self.newClientSocket()
577 self.bindClient()
578
579 def newClientSocket(self):
580 """Return a new socket for use as client."""
581 return self.newSocket()
582
583 def bindClient(self):
584 """Bind client socket and set self.cli_addr to its address."""
585 self.bindSock(self.cli)
586 self.cli_addr = self.cli.getsockname()
587
588 def clientTearDown(self):
589 self.cli.close()
590 self.cli = None
591 ThreadableTest.clientTearDown(self)
592
593
594class ConnectedStreamTestMixin(SocketListeningTestMixin,
595 ThreadedSocketTestMixin):
596 """Mixin to allow client/server stream tests with connected client.
597
598 Server's socket representing connection to client is self.cli_conn
599 and client's connection to server is self.serv_conn. (Based on
600 SocketConnectedTest.)
601 """
602
603 def setUp(self):
604 super().setUp()
605 # Indicate explicitly we're ready for the client thread to
606 # proceed and then perform the blocking call to accept
607 self.serverExplicitReady()
608 conn, addr = self.serv.accept()
609 self.cli_conn = conn
610
611 def tearDown(self):
612 self.cli_conn.close()
613 self.cli_conn = None
614 super().tearDown()
615
616 def clientSetUp(self):
617 super().clientSetUp()
618 self.cli.connect(self.serv_addr)
619 self.serv_conn = self.cli
620
621 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100622 try:
623 self.serv_conn.close()
624 self.serv_conn = None
625 except AttributeError:
626 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000627 super().clientTearDown()
628
629
630class UnixSocketTestBase(SocketTestBase):
631 """Base class for Unix-domain socket tests."""
632
633 # This class is used for file descriptor passing tests, so we
634 # create the sockets in a private directory so that other users
635 # can't send anything that might be problematic for a privileged
636 # user running the tests.
637
638 def setUp(self):
639 self.dir_path = tempfile.mkdtemp()
640 self.addCleanup(os.rmdir, self.dir_path)
641 super().setUp()
642
643 def bindSock(self, sock):
644 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100645 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000646 self.addCleanup(support.unlink, path)
647
648class UnixStreamBase(UnixSocketTestBase):
649 """Base class for Unix-domain SOCK_STREAM tests."""
650
651 def newSocket(self):
652 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
653
654
655class InetTestBase(SocketTestBase):
656 """Base class for IPv4 socket tests."""
657
658 host = HOST
659
660 def setUp(self):
661 super().setUp()
662 self.port = self.serv_addr[1]
663
664 def bindSock(self, sock):
665 support.bind_port(sock, host=self.host)
666
667class TCPTestBase(InetTestBase):
668 """Base class for TCP-over-IPv4 tests."""
669
670 def newSocket(self):
671 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
672
673class UDPTestBase(InetTestBase):
674 """Base class for UDP-over-IPv4 tests."""
675
676 def newSocket(self):
677 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
678
679class SCTPStreamBase(InetTestBase):
680 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
681
682 def newSocket(self):
683 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
684 socket.IPPROTO_SCTP)
685
686
687class Inet6TestBase(InetTestBase):
688 """Base class for IPv6 socket tests."""
689
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200690 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000691
692class UDP6TestBase(Inet6TestBase):
693 """Base class for UDP-over-IPv6 tests."""
694
695 def newSocket(self):
696 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
697
698
699# Test-skipping decorators for use with ThreadableTest.
700
701def skipWithClientIf(condition, reason):
702 """Skip decorated test if condition is true, add client_skip decorator.
703
704 If the decorated object is not a class, sets its attribute
705 "client_skip" to a decorator which will return an empty function
706 if the test is to be skipped, or the original function if it is
707 not. This can be used to avoid running the client part of a
708 skipped test when using ThreadableTest.
709 """
710 def client_pass(*args, **kwargs):
711 pass
712 def skipdec(obj):
713 retval = unittest.skip(reason)(obj)
714 if not isinstance(obj, type):
715 retval.client_skip = lambda f: client_pass
716 return retval
717 def noskipdec(obj):
718 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
719 obj.client_skip = lambda f: f
720 return obj
721 return skipdec if condition else noskipdec
722
723
724def requireAttrs(obj, *attributes):
725 """Skip decorated test if obj is missing any of the given attributes.
726
727 Sets client_skip attribute as skipWithClientIf() does.
728 """
729 missing = [name for name in attributes if not hasattr(obj, name)]
730 return skipWithClientIf(
731 missing, "don't have " + ", ".join(name for name in missing))
732
733
734def requireSocket(*args):
735 """Skip decorated test if a socket cannot be created with given arguments.
736
737 When an argument is given as a string, will use the value of that
738 attribute of the socket module, or skip the test if it doesn't
739 exist. Sets client_skip attribute as skipWithClientIf() does.
740 """
741 err = None
742 missing = [obj for obj in args if
743 isinstance(obj, str) and not hasattr(socket, obj)]
744 if missing:
745 err = "don't have " + ", ".join(name for name in missing)
746 else:
747 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
748 for obj in args]
749 try:
750 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200751 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000752 # XXX: check errno?
753 err = str(e)
754 else:
755 s.close()
756 return skipWithClientIf(
757 err is not None,
758 "can't create socket({0}): {1}".format(
759 ", ".join(str(o) for o in args), err))
760
761
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762#######################################################################
763## Begin Tests
764
765class GeneralModuleTests(unittest.TestCase):
766
Ethan Furman7184bac2014-10-14 18:56:53 -0700767 def test_SocketType_is_socketobject(self):
768 import _socket
769 self.assertTrue(socket.SocketType is _socket.socket)
770 s = socket.socket()
771 self.assertIsInstance(s, socket.SocketType)
772 s.close()
773
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000774 def test_repr(self):
775 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200776 with s:
777 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000778 self.assertIn('family=%s' % socket.AF_INET, repr(s))
779 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200780 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200781 self.assertNotIn('raddr', repr(s))
782 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200783 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200784 self.assertIn(str(s.getsockname()), repr(s))
785 self.assertIn('[closed]', repr(s))
786 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000787
Victor Stinnere254e532014-07-26 14:36:55 +0200788 @unittest.skipUnless(_socket is not None, 'need _socket module')
789 def test_csocket_repr(self):
790 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
791 try:
792 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
793 % (s.fileno(), s.family, s.type, s.proto))
794 self.assertEqual(repr(s), expected)
795 finally:
796 s.close()
797 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
798 % (s.family, s.type, s.proto))
799 self.assertEqual(repr(s), expected)
800
Raymond Hettinger027bb632004-05-31 03:09:25 +0000801 def test_weakref(self):
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +0200802 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
803 p = proxy(s)
804 self.assertEqual(p.fileno(), s.fileno())
Raymond Hettinger027bb632004-05-31 03:09:25 +0000805 s = None
806 try:
807 p.fileno()
808 except ReferenceError:
809 pass
810 else:
811 self.fail('Socket proxy still exists')
812
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000814 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300815 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200816 with self.assertRaises(OSError, msg=msg % 'OSError'):
817 raise OSError
818 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200820 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
Ezio Melotti63e42302011-05-07 19:47:48 +0300823 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000824 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300825 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
826 self.addCleanup(s.close)
827 s.bind(('', 0))
828 sockname = s.getsockname()
829 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300830 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300831 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300832 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400833 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300834 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300835 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300836 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400837 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300838 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300839 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300840 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300841 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300842 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300843 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300844 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400845 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300846 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300847 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300848 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400849 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300850 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300851 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300852 self.assertIn('not NoneType', str(cm.exception))
853 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300854 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300855 self.assertIn('an integer is required', str(cm.exception))
856 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300857 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300858 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300859 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300860 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300861 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300862 self.assertIn('(1 given)', str(cm.exception))
863 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300864 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300865 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300866
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000868 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869 socket.AF_INET
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100870 if socket.has_ipv6:
871 socket.AF_INET6
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 socket.SOCK_STREAM
873 socket.SOCK_DGRAM
874 socket.SOCK_RAW
875 socket.SOCK_RDM
876 socket.SOCK_SEQPACKET
877 socket.SOL_SOCKET
878 socket.SO_REUSEADDR
879
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100880 def testCrucialIpProtoConstants(self):
881 socket.IPPROTO_TCP
882 socket.IPPROTO_UDP
883 if socket.has_ipv6:
884 socket.IPPROTO_IPV6
885
886 @unittest.skipUnless(os.name == "nt", "Windows specific")
887 def testWindowsSpecificConstants(self):
888 socket.IPPROTO_ICLFXBM
889 socket.IPPROTO_ST
890 socket.IPPROTO_CBT
891 socket.IPPROTO_IGP
892 socket.IPPROTO_RDP
893 socket.IPPROTO_PGM
894 socket.IPPROTO_L2TP
895 socket.IPPROTO_SCTP
896
Guido van Rossum654c11e2002-06-13 20:24:17 +0000897 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000898 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000899 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000900 try:
901 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200902 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000903 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600904 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000905 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000906 try:
907 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200908 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000909 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600910 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000911 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000912 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000913 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000914 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000915
Charles-François Natali0cc86852013-09-13 19:53:08 +0200916 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700917 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200918 self.assertEqual(socket.gethostbyname(addr), addr)
919
920 # we don't test support.HOSTv6 because there's a chance it doesn't have
921 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700922 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200923 self.assertIn(host, socket.gethostbyaddr(host)[2])
924
Xiang Zhangd36a7162017-03-07 11:06:09 +0800925 def test_host_resolution_bad_address(self):
926 # These are all malformed IP addresses and expected not to resolve to
927 # any result. But some ISPs, e.g. AWS, may successfully resolve these
928 # IPs.
929 explanation = (
930 "resolving an invalid IP address did not raise OSError; "
931 "can be caused by a broken DNS server"
932 )
933 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
934 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400935 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800936 socket.gethostbyname(addr)
937 with self.assertRaises(OSError, msg=explanation):
938 socket.gethostbyaddr(addr)
939
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000940 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
941 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
942 def test_sethostname(self):
943 oldhn = socket.gethostname()
944 try:
945 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200946 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000947 if e.errno == errno.EPERM:
948 self.skipTest("test should be run as root")
949 else:
950 raise
951 try:
952 # running test as root!
953 self.assertEqual(socket.gethostname(), 'new')
954 # Should work with bytes objects too
955 socket.sethostname(b'bar')
956 self.assertEqual(socket.gethostname(), 'bar')
957 finally:
958 socket.sethostname(oldhn)
959
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700960 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
961 'socket.if_nameindex() not available.')
962 def testInterfaceNameIndex(self):
963 interfaces = socket.if_nameindex()
964 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200965 self.assertIsInstance(index, int)
966 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700967 # interface indices are non-zero integers
968 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200969 _index = socket.if_nametoindex(name)
970 self.assertIsInstance(_index, int)
971 self.assertEqual(index, _index)
972 _name = socket.if_indextoname(index)
973 self.assertIsInstance(_name, str)
974 self.assertEqual(name, _name)
975
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600976 @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
977 'socket.if_indextoname() not available.')
978 def testInvalidInterfaceIndexToName(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +0200979 self.assertRaises(OSError, socket.if_indextoname, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200980 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700981
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600982 @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
983 'socket.if_nametoindex() not available.')
984 def testInvalidInterfaceNameToIndex(self):
985 self.assertRaises(TypeError, socket.if_nametoindex, 0)
986 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
987
Serhiy Storchaka43767632013-11-03 21:31:38 +0200988 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
989 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000990 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000991 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200992 try:
993 # On some versions, this loses a reference
994 orig = sys.getrefcount(__name__)
995 socket.getnameinfo(__name__,0)
996 except TypeError:
997 if sys.getrefcount(__name__) != orig:
998 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000999
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001001 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002 try:
1003 # On some versions, this crashes the interpreter.
1004 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001005 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001007
Guido van Rossumc0a0e082002-09-16 01:30:03 +00001008 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +00001009 # This just checks that htons etc. are their own inverse,
1010 # when looking at the lower 16 or 32 bits.
1011 sizes = {socket.htonl: 32, socket.ntohl: 32,
1012 socket.htons: 16, socket.ntohs: 16}
1013 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +00001014 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +00001015 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
1016 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +00001017
Guido van Rossuma2627af2002-09-14 00:58:46 +00001018 swapped = func(mask)
1019 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001020 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001021
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001022 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001023 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001024 import _testcapi
1025 s_good_values = [0, 1, 2, 0xffff]
1026 l_good_values = s_good_values + [0xffffffff]
1027 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1028 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1029 _testcapi.INT_MAX + 1]
1030 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1031 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001032 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001033 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001034 for k in l_good_values:
1035 socket.ntohl(k)
1036 socket.htonl(k)
1037 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001038 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001039 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001040 for k in l_bad_values:
1041 self.assertRaises(OverflowError, socket.ntohl, k)
1042 self.assertRaises(OverflowError, socket.htonl, k)
1043 for k in s_deprecated_values:
1044 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1045 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001046
Barry Warsaw11b91a02004-06-28 00:50:43 +00001047 def testGetServBy(self):
1048 eq = self.assertEqual
1049 # Find one service that exists, then check all the related interfaces.
1050 # I've ordered this by protocols that have both a tcp and udp
1051 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001052 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001053 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001054 # avoid the 'echo' service on this platform, as there is an
1055 # assumption breaking non-standard port/protocol entry
1056 services = ('daytime', 'qotd', 'domain')
1057 else:
1058 services = ('echo', 'daytime', 'domain')
1059 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001060 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001061 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001062 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001063 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001064 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001065 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001066 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001067 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001068 # Issue #26936: Android getservbyname() was broken before API 23.
1069 if (not hasattr(sys, 'getandroidapilevel') or
1070 sys.getandroidapilevel() >= 23):
1071 port2 = socket.getservbyname(service)
1072 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001073 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001074 try:
1075 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001076 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001077 udpport = None
1078 else:
1079 eq(udpport, port)
1080 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001081 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001082 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001083 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001084 eq(socket.getservbyport(port, 'tcp'), service)
1085 if udpport is not None:
1086 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001087 # Make sure getservbyport does not accept out of range ports.
1088 self.assertRaises(OverflowError, socket.getservbyport, -1)
1089 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001090
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001091 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001092 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001093 # The default timeout should initially be None
1094 self.assertEqual(socket.getdefaulttimeout(), None)
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001095 with socket.socket() as s:
1096 self.assertEqual(s.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001097
1098 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001099 with socket_setdefaulttimeout(10):
1100 self.assertEqual(socket.getdefaulttimeout(), 10)
1101 with socket.socket() as sock:
1102 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001103
Victor Stinner304315d2018-11-30 13:22:44 +01001104 # Reset the default timeout to None, and see if it propagates
1105 socket.setdefaulttimeout(None)
1106 self.assertEqual(socket.getdefaulttimeout(), None)
1107 with socket.socket() as sock:
1108 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001109
1110 # Check that setting it to an invalid value raises ValueError
1111 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1112
1113 # Check that setting it to an invalid type raises TypeError
1114 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1115
Serhiy Storchaka43767632013-11-03 21:31:38 +02001116 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1117 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001118 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001119 # Test that issue1008086 and issue767150 are fixed.
1120 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001121 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1122 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001123
Serhiy Storchaka43767632013-11-03 21:31:38 +02001124 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1125 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001126 def testIPv4toString(self):
1127 from socket import inet_aton as f, inet_pton, AF_INET
1128 g = lambda a: inet_pton(AF_INET, a)
1129
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001130 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001131 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001132 )
1133
Ezio Melottib3aedd42010-11-20 19:04:17 +00001134 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1135 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1136 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1137 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1138 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001139 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001140 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001141 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001142 assertInvalid(f, '300.0.0.0')
1143 assertInvalid(f, 'a.0.0.0')
1144 assertInvalid(f, '1.2.3.4.5')
1145 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001146
Ezio Melottib3aedd42010-11-20 19:04:17 +00001147 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1148 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1149 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1150 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001151 assertInvalid(g, '0.0.0.')
1152 assertInvalid(g, '300.0.0.0')
1153 assertInvalid(g, 'a.0.0.0')
1154 assertInvalid(g, '1.2.3.4.5')
1155 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001156
Serhiy Storchaka43767632013-11-03 21:31:38 +02001157 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1158 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001159 def testIPv6toString(self):
1160 try:
1161 from socket import inet_pton, AF_INET6, has_ipv6
1162 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001163 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001164 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001165 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001166
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001167 if sys.platform == "win32":
1168 try:
1169 inet_pton(AF_INET6, '::')
1170 except OSError as e:
1171 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001172 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001173
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001174 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001175 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001176 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001177 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001178
Ezio Melottib3aedd42010-11-20 19:04:17 +00001179 self.assertEqual(b'\x00' * 16, f('::'))
1180 self.assertEqual(b'\x00' * 16, f('0::0'))
1181 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1182 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001183 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001184 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1185 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001186 self.assertEqual(
1187 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1188 f('ad42:abc::127:0:254:2')
1189 )
1190 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1191 assertInvalid('0x20::')
1192 assertInvalid(':::')
1193 assertInvalid('::0::')
1194 assertInvalid('1::abc::')
1195 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001196 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001197 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001198 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001199 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001200 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001201 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001202
1203 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1204 f('::254.42.23.64')
1205 )
1206 self.assertEqual(
1207 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1208 f('42::a29b:254.42.23.64')
1209 )
1210 self.assertEqual(
1211 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1212 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1213 )
1214 assertInvalid('255.254.253.252')
1215 assertInvalid('1::260.2.3.0')
1216 assertInvalid('1::0.be.e.0')
1217 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1218 assertInvalid('::1.2.3.4:0')
1219 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001220
Serhiy Storchaka43767632013-11-03 21:31:38 +02001221 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1222 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001223 def testStringToIPv4(self):
1224 from socket import inet_ntoa as f, inet_ntop, AF_INET
1225 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001226 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001227 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001228 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001229
Ezio Melottib3aedd42010-11-20 19:04:17 +00001230 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1231 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1232 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1233 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001234 assertInvalid(f, b'\x00' * 3)
1235 assertInvalid(f, b'\x00' * 5)
1236 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001237 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001238
Ezio Melottib3aedd42010-11-20 19:04:17 +00001239 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1240 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1241 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001242 assertInvalid(g, b'\x00' * 3)
1243 assertInvalid(g, b'\x00' * 5)
1244 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001245 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001246
Serhiy Storchaka43767632013-11-03 21:31:38 +02001247 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1248 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001249 def testStringToIPv6(self):
1250 try:
1251 from socket import inet_ntop, AF_INET6, has_ipv6
1252 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001253 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001254 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001255 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001256
1257 if sys.platform == "win32":
1258 try:
1259 inet_ntop(AF_INET6, b'\x00' * 16)
1260 except OSError as e:
1261 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001262 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001263
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001264 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001265 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001266 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001267 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001268
Ezio Melottib3aedd42010-11-20 19:04:17 +00001269 self.assertEqual('::', f(b'\x00' * 16))
1270 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1271 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001272 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001273 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001274 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001275 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001276
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001277 assertInvalid(b'\x12' * 15)
1278 assertInvalid(b'\x12' * 17)
1279 assertInvalid(b'\x12' * 4)
1280
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001281 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001282
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001283 def testSockName(self):
1284 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001285 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001286 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001287 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001288 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001289 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001290 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1291 # it reasonable to get the host's addr in addition to 0.0.0.0.
1292 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001293 try:
1294 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001295 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001296 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001297 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001298 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001299 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001300
1301 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001302 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001303 # We know a socket should start without reuse==0
1304 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001305 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001306 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001307 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001308
1309 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001310 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001311 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001312 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001313 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1314 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001315 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001316
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001317 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001318 # testing send() after close() with timeout
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001319 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1320 sock.settimeout(1)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001321 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001322
Martin Panter50ab1a32016-04-11 00:38:12 +00001323 def testCloseException(self):
1324 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001325 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001326 socket.socket(fileno=sock.fileno()).close()
1327 try:
1328 sock.close()
1329 except OSError as err:
1330 # Winsock apparently raises ENOTSOCK
1331 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1332 else:
1333 self.fail("close() should raise EBADF/ENOTSOCK")
1334
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001335 def testNewAttributes(self):
1336 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001337
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001338 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1339 self.assertEqual(sock.family, socket.AF_INET)
1340 if hasattr(socket, 'SOCK_CLOEXEC'):
1341 self.assertIn(sock.type,
1342 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1343 socket.SOCK_STREAM))
1344 else:
1345 self.assertEqual(sock.type, socket.SOCK_STREAM)
1346 self.assertEqual(sock.proto, 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001347
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001348 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001349 sock = socket.socket()
1350 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001351 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001352 big_port = port + 65536
1353 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001354 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1355 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1356 # Since find_unused_port() is inherently subject to race conditions, we
1357 # call it a couple times if necessary.
1358 for i in itertools.count():
1359 port = support.find_unused_port()
1360 try:
1361 sock.bind((HOST, port))
1362 except OSError as e:
1363 if e.errno != errno.EADDRINUSE or i == 5:
1364 raise
1365 else:
1366 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001367
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001368 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001369 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001370 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1371 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1372 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1373 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001374 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1375 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001376 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001377 self.assertRaises(ValueError, s.ioctl, -1, None)
1378 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001379
Steve Dowerea93ac02016-06-17 12:52:18 -07001380 @unittest.skipUnless(os.name == "nt", "Windows specific")
1381 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1382 'Loopback fast path support required for this test')
1383 def test_sio_loopback_fast_path(self):
1384 s = socket.socket()
1385 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001386 try:
1387 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1388 except OSError as exc:
1389 WSAEOPNOTSUPP = 10045
1390 if exc.winerror == WSAEOPNOTSUPP:
1391 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1392 "doesn't implemented in this Windows version")
1393 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001394 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1395
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001396 def testGetaddrinfo(self):
1397 try:
1398 socket.getaddrinfo('localhost', 80)
1399 except socket.gaierror as err:
1400 if err.errno == socket.EAI_SERVICE:
1401 # see http://bugs.python.org/issue1282647
1402 self.skipTest("buggy libc version")
1403 raise
1404 # len of every sequence is supposed to be == 5
1405 for info in socket.getaddrinfo(HOST, None):
1406 self.assertEqual(len(info), 5)
1407 # host can be a domain name, a string representation of an
1408 # IPv4/v6 address or None
1409 socket.getaddrinfo('localhost', 80)
1410 socket.getaddrinfo('127.0.0.1', 80)
1411 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001412 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001413 socket.getaddrinfo('::1', 80)
1414 # port can be a string service name such as "http", a numeric
1415 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001416 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1417 if (not hasattr(sys, 'getandroidapilevel') or
1418 sys.getandroidapilevel() >= 23):
1419 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001420 socket.getaddrinfo(HOST, 80)
1421 socket.getaddrinfo(HOST, None)
1422 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001423 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1424 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001425 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001426 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1427 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001428 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001429 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1430 for _, socktype, _, _, _ in infos:
1431 self.assertEqual(socktype, socket.SOCK_STREAM)
1432 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001433 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001434 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1435 # a server willing to support both IPv4 and IPv6 will
1436 # usually do this
1437 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1438 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001439 # test keyword arguments
1440 a = socket.getaddrinfo(HOST, None)
1441 b = socket.getaddrinfo(host=HOST, port=None)
1442 self.assertEqual(a, b)
1443 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1444 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1445 self.assertEqual(a, b)
1446 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1447 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1448 self.assertEqual(a, b)
1449 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1450 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1451 self.assertEqual(a, b)
1452 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1453 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1454 self.assertEqual(a, b)
1455 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1456 socket.AI_PASSIVE)
1457 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1458 type=socket.SOCK_STREAM, proto=0,
1459 flags=socket.AI_PASSIVE)
1460 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001461 # Issue #6697.
1462 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001463
Ned Deilyb24f4812014-02-13 22:50:42 -08001464 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001465 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001466 try:
1467 # The arguments here are undefined and the call may succeed
1468 # or fail. All we care here is that it doesn't segfault.
1469 socket.getaddrinfo("localhost", None, 0, 0, 0,
1470 socket.AI_NUMERICSERV)
1471 except socket.gaierror:
1472 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001473
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001474 def test_getnameinfo(self):
1475 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001476 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001477
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001478 @unittest.skipUnless(support.is_resource_enabled('network'),
1479 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001480 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001481 # Check for internet access before running test
1482 # (issue #12804, issue #25138).
1483 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001484 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001485
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001486 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001487 domain = 'испытание.pythontest.net'
1488 socket.gethostbyname(domain)
1489 socket.gethostbyname_ex(domain)
1490 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001491 # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001492 # have a reverse entry yet
1493 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001494
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001495 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001496 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001497 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1498 self.skipTest("signal.alarm and socket.socketpair required for this test")
1499 # Our signal handlers clobber the C errno by calling a math function
1500 # with an invalid domain value.
1501 def ok_handler(*args):
1502 self.assertRaises(ValueError, math.acosh, 0)
1503 def raising_handler(*args):
1504 self.assertRaises(ValueError, math.acosh, 0)
1505 1 // 0
1506 c, s = socket.socketpair()
1507 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1508 try:
1509 if with_timeout:
1510 # Just above the one second minimum for signal.alarm
1511 c.settimeout(1.5)
1512 with self.assertRaises(ZeroDivisionError):
1513 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001514 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001515 if with_timeout:
1516 signal.signal(signal.SIGALRM, ok_handler)
1517 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001518 self.assertRaises(socket.timeout, c.sendall,
1519 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001520 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001521 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001522 signal.signal(signal.SIGALRM, old_alarm)
1523 c.close()
1524 s.close()
1525
1526 def test_sendall_interrupted(self):
1527 self.check_sendall_interrupted(False)
1528
1529 def test_sendall_interrupted_with_timeout(self):
1530 self.check_sendall_interrupted(True)
1531
Antoine Pitroue033e062010-10-29 10:38:18 +00001532 def test_dealloc_warn(self):
1533 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1534 r = repr(sock)
1535 with self.assertWarns(ResourceWarning) as cm:
1536 sock = None
1537 support.gc_collect()
1538 self.assertIn(r, str(cm.warning.args[0]))
1539 # An open socket file object gets dereferenced after the socket
1540 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1541 f = sock.makefile('rb')
1542 r = repr(sock)
1543 sock = None
1544 support.gc_collect()
1545 with self.assertWarns(ResourceWarning):
1546 f = None
1547 support.gc_collect()
1548
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001549 def test_name_closed_socketio(self):
1550 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1551 fp = sock.makefile("rb")
1552 fp.close()
1553 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1554
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001555 def test_unusable_closed_socketio(self):
1556 with socket.socket() as sock:
1557 fp = sock.makefile("rb", buffering=0)
1558 self.assertTrue(fp.readable())
1559 self.assertFalse(fp.writable())
1560 self.assertFalse(fp.seekable())
1561 fp.close()
1562 self.assertRaises(ValueError, fp.readable)
1563 self.assertRaises(ValueError, fp.writable)
1564 self.assertRaises(ValueError, fp.seekable)
1565
Christian Heimesd0e31b92018-01-27 09:54:13 +01001566 def test_socket_close(self):
1567 sock = socket.socket()
1568 try:
1569 sock.bind((HOST, 0))
1570 socket.close(sock.fileno())
1571 with self.assertRaises(OSError):
1572 sock.listen(1)
1573 finally:
1574 with self.assertRaises(OSError):
1575 # sock.close() fails with EBADF
1576 sock.close()
1577 with self.assertRaises(TypeError):
1578 socket.close(None)
1579 with self.assertRaises(OSError):
1580 socket.close(-1)
1581
Berker Peksag3fe64d02016-02-18 17:34:00 +02001582 def test_makefile_mode(self):
1583 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1584 with self.subTest(mode=mode):
1585 with socket.socket() as sock:
1586 with sock.makefile(mode) as fp:
1587 self.assertEqual(fp.mode, mode)
1588
1589 def test_makefile_invalid_mode(self):
1590 for mode in 'rt', 'x', '+', 'a':
1591 with self.subTest(mode=mode):
1592 with socket.socket() as sock:
1593 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1594 sock.makefile(mode)
1595
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001596 def test_pickle(self):
1597 sock = socket.socket()
1598 with sock:
1599 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1600 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001601 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1602 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1603 self.assertEqual(family, socket.AF_INET)
1604 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1605 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001606
Serhiy Storchaka78980432013-01-15 01:12:17 +02001607 def test_listen_backlog(self):
1608 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001609 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1610 srv.bind((HOST, 0))
1611 srv.listen(backlog)
1612
1613 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001614 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001615 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001616
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001617 @support.cpython_only
1618 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001619 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001620 import _testcapi
Serhiy Storchaka9e4861f2019-03-05 10:05:57 +02001621 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1622 srv.bind((HOST, 0))
1623 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001624
Charles-François Natali42663332012-01-02 15:57:30 +01001625 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001626 def test_flowinfo(self):
1627 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001628 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001629 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001630 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001631
Коренберг Марк7766b962018-02-13 00:47:42 +05001632 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1633 def test_getaddrinfo_ipv6_basic(self):
1634 ((*_, sockaddr),) = socket.getaddrinfo(
1635 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1636 1234, socket.AF_INET6,
1637 socket.SOCK_DGRAM,
1638 socket.IPPROTO_UDP
1639 )
1640 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1641
1642 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001643 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001644 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001645 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1646 # Just pick up any network interface (Linux, Mac OS X)
1647 (ifindex, test_interface) = socket.if_nameindex()[0]
1648 ((*_, sockaddr),) = socket.getaddrinfo(
1649 'ff02::1de:c0:face:8D%' + test_interface,
1650 1234, socket.AF_INET6,
1651 socket.SOCK_DGRAM,
1652 socket.IPPROTO_UDP
1653 )
1654 # Note missing interface name part in IPv6 address
1655 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1656
1657 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1658 @unittest.skipUnless(
1659 sys.platform == 'win32',
1660 'Numeric scope id does not work or undocumented')
1661 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1662 # Also works on Linux and Mac OS X, but is not documented (?)
1663 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1664 ifindex = 42
1665 ((*_, sockaddr),) = socket.getaddrinfo(
1666 'ff02::1de:c0:face:8D%' + str(ifindex),
1667 1234, socket.AF_INET6,
1668 socket.SOCK_DGRAM,
1669 socket.IPPROTO_UDP
1670 )
1671 # Note missing interface name part in IPv6 address
1672 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1673
1674 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06001675 @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
Michael Felt56614592018-12-26 04:34:37 +01001676 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001677 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1678 # Just pick up any network interface.
1679 (ifindex, test_interface) = socket.if_nameindex()[0]
1680 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1681 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1682 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1683
1684 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001685 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001686 'Numeric scope id does not work or undocumented')
1687 def test_getnameinfo_ipv6_scopeid_numeric(self):
1688 # Also works on Linux (undocumented), but does not work on Mac OS X
1689 # Windows and Linux allow nonexistent interface numbers here.
1690 ifindex = 42
1691 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1692 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1693 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1694
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001695 def test_str_for_enums(self):
1696 # Make sure that the AF_* and SOCK_* constants have enum-like string
1697 # reprs.
1698 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1699 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001700 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001701
Yury Selivanov98181422017-12-18 20:02:54 -05001702 def test_socket_consistent_sock_type(self):
1703 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1704 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1705 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1706
1707 with socket.socket(socket.AF_INET, sock_type) as s:
1708 self.assertEqual(s.type, socket.SOCK_STREAM)
1709 s.settimeout(1)
1710 self.assertEqual(s.type, socket.SOCK_STREAM)
1711 s.settimeout(0)
1712 self.assertEqual(s.type, socket.SOCK_STREAM)
1713 s.setblocking(True)
1714 self.assertEqual(s.type, socket.SOCK_STREAM)
1715 s.setblocking(False)
1716 self.assertEqual(s.type, socket.SOCK_STREAM)
1717
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001718 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001719 # Test that when created with a family that's not one of the known
1720 # AF_*/SOCK_* constants, socket.family just returns the number.
1721 #
1722 # To do this we fool socket.socket into believing it already has an
1723 # open fd because on this path it doesn't actually verify the family and
1724 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001725 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1726 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001727 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1728
1729 unknown_type = max(
1730 kind
1731 for name, kind in socket.SocketKind.__members__.items()
1732 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1733 ) + 1
1734
1735 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001736 family=unknown_family, type=unknown_type, proto=23,
1737 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001738 self.assertEqual(s.family, unknown_family)
1739 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001740 # some OS like macOS ignore proto
1741 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001742
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001743 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1744 def test__sendfile_use_sendfile(self):
1745 class File:
1746 def __init__(self, fd):
1747 self.fd = fd
1748
1749 def fileno(self):
1750 return self.fd
1751 with socket.socket() as sock:
1752 fd = os.open(os.curdir, os.O_RDONLY)
1753 os.close(fd)
1754 with self.assertRaises(socket._GiveupOnSendfile):
1755 sock._sendfile_use_sendfile(File(fd))
1756 with self.assertRaises(OverflowError):
1757 sock._sendfile_use_sendfile(File(2**1000))
1758 with self.assertRaises(TypeError):
1759 sock._sendfile_use_sendfile(File(None))
1760
Christian Heimesb6e43af2018-01-29 22:37:58 +01001761 def _test_socket_fileno(self, s, family, stype):
1762 self.assertEqual(s.family, family)
1763 self.assertEqual(s.type, stype)
1764
1765 fd = s.fileno()
1766 s2 = socket.socket(fileno=fd)
1767 self.addCleanup(s2.close)
1768 # detach old fd to avoid double close
1769 s.detach()
1770 self.assertEqual(s2.family, family)
1771 self.assertEqual(s2.type, stype)
1772 self.assertEqual(s2.fileno(), fd)
1773
1774 def test_socket_fileno(self):
1775 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1776 self.addCleanup(s.close)
1777 s.bind((support.HOST, 0))
1778 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1779
1780 if hasattr(socket, "SOCK_DGRAM"):
1781 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1782 self.addCleanup(s.close)
1783 s.bind((support.HOST, 0))
1784 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1785
1786 if support.IPV6_ENABLED:
1787 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1788 self.addCleanup(s.close)
1789 s.bind((support.HOSTv6, 0, 0, 0))
1790 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1791
1792 if hasattr(socket, "AF_UNIX"):
1793 tmpdir = tempfile.mkdtemp()
1794 self.addCleanup(shutil.rmtree, tmpdir)
1795 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1796 self.addCleanup(s.close)
xdegaye4461d702019-05-03 17:09:17 +02001797 try:
1798 s.bind(os.path.join(tmpdir, 'socket'))
1799 except PermissionError:
1800 pass
1801 else:
1802 self._test_socket_fileno(s, socket.AF_UNIX,
1803 socket.SOCK_STREAM)
Christian Heimesb6e43af2018-01-29 22:37:58 +01001804
Dima Tisneke9912702018-12-17 22:07:55 +09001805 def test_socket_fileno_rejects_float(self):
1806 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1807 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1808
1809 def test_socket_fileno_rejects_other_types(self):
1810 with self.assertRaisesRegex(TypeError, "integer is required"):
1811 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1812
1813 def test_socket_fileno_rejects_invalid_socket(self):
1814 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1815 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1816
1817 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1818 def test_socket_fileno_rejects_negative(self):
1819 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1820 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1821
1822 def test_socket_fileno_requires_valid_fd(self):
1823 WSAENOTSOCK = 10038
1824 with self.assertRaises(OSError) as cm:
1825 socket.socket(fileno=support.make_bad_fd())
1826 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1827
1828 with self.assertRaises(OSError) as cm:
1829 socket.socket(
1830 socket.AF_INET,
1831 socket.SOCK_STREAM,
1832 fileno=support.make_bad_fd())
1833 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1834
1835 def test_socket_fileno_requires_socket_fd(self):
1836 with tempfile.NamedTemporaryFile() as afile:
1837 with self.assertRaises(OSError):
1838 socket.socket(fileno=afile.fileno())
1839
1840 with self.assertRaises(OSError) as cm:
1841 socket.socket(
1842 socket.AF_INET,
1843 socket.SOCK_STREAM,
1844 fileno=afile.fileno())
1845 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1846
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001847
Charles-François Natali47413c12011-10-06 19:47:44 +02001848@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1849class BasicCANTest(unittest.TestCase):
1850
1851 def testCrucialConstants(self):
1852 socket.AF_CAN
1853 socket.PF_CAN
1854 socket.CAN_RAW
1855
Charles-François Natali773e42d2013-02-05 19:42:01 +01001856 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1857 'socket.CAN_BCM required for this test.')
1858 def testBCMConstants(self):
1859 socket.CAN_BCM
1860
1861 # opcodes
1862 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1863 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1864 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1865 socket.CAN_BCM_TX_SEND # send one CAN frame
1866 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1867 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1868 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1869 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1870 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1871 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1872 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1873 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1874
Charles-François Natali47413c12011-10-06 19:47:44 +02001875 def testCreateSocket(self):
1876 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1877 pass
1878
Charles-François Natali773e42d2013-02-05 19:42:01 +01001879 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1880 'socket.CAN_BCM required for this test.')
1881 def testCreateBCMSocket(self):
1882 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1883 pass
1884
Charles-François Natali47413c12011-10-06 19:47:44 +02001885 def testBindAny(self):
1886 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1887 s.bind(('', ))
1888
1889 def testTooLongInterfaceName(self):
1890 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1891 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001892 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001893 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001894
1895 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1896 'socket.CAN_RAW_LOOPBACK required for this test.')
1897 def testLoopback(self):
1898 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1899 for loopback in (0, 1):
1900 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1901 loopback)
1902 self.assertEqual(loopback,
1903 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1904
1905 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1906 'socket.CAN_RAW_FILTER required for this test.')
1907 def testFilter(self):
1908 can_id, can_mask = 0x200, 0x700
1909 can_filter = struct.pack("=II", can_id, can_mask)
1910 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1911 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1912 self.assertEqual(can_filter,
1913 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001914 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001915
1916
1917@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001918class CANTest(ThreadedCANSocketTest):
1919
Charles-François Natali47413c12011-10-06 19:47:44 +02001920 def __init__(self, methodName='runTest'):
1921 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1922
1923 @classmethod
1924 def build_can_frame(cls, can_id, data):
1925 """Build a CAN frame."""
1926 can_dlc = len(data)
1927 data = data.ljust(8, b'\x00')
1928 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1929
1930 @classmethod
1931 def dissect_can_frame(cls, frame):
1932 """Dissect a CAN frame."""
1933 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1934 return (can_id, can_dlc, data[:can_dlc])
1935
1936 def testSendFrame(self):
1937 cf, addr = self.s.recvfrom(self.bufsize)
1938 self.assertEqual(self.cf, cf)
1939 self.assertEqual(addr[0], self.interface)
1940 self.assertEqual(addr[1], socket.AF_CAN)
1941
1942 def _testSendFrame(self):
1943 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1944 self.cli.send(self.cf)
1945
1946 def testSendMaxFrame(self):
1947 cf, addr = self.s.recvfrom(self.bufsize)
1948 self.assertEqual(self.cf, cf)
1949
1950 def _testSendMaxFrame(self):
1951 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1952 self.cli.send(self.cf)
1953
1954 def testSendMultiFrames(self):
1955 cf, addr = self.s.recvfrom(self.bufsize)
1956 self.assertEqual(self.cf1, cf)
1957
1958 cf, addr = self.s.recvfrom(self.bufsize)
1959 self.assertEqual(self.cf2, cf)
1960
1961 def _testSendMultiFrames(self):
1962 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1963 self.cli.send(self.cf1)
1964
1965 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1966 self.cli.send(self.cf2)
1967
Charles-François Natali773e42d2013-02-05 19:42:01 +01001968 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1969 'socket.CAN_BCM required for this test.')
1970 def _testBCM(self):
1971 cf, addr = self.cli.recvfrom(self.bufsize)
1972 self.assertEqual(self.cf, cf)
1973 can_id, can_dlc, data = self.dissect_can_frame(cf)
1974 self.assertEqual(self.can_id, can_id)
1975 self.assertEqual(self.data, data)
1976
1977 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1978 'socket.CAN_BCM required for this test.')
1979 def testBCM(self):
1980 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1981 self.addCleanup(bcm.close)
1982 bcm.connect((self.interface,))
1983 self.can_id = 0x123
1984 self.data = bytes([0xc0, 0xff, 0xee])
1985 self.cf = self.build_can_frame(self.can_id, self.data)
1986 opcode = socket.CAN_BCM_TX_SEND
1987 flags = 0
1988 count = 0
1989 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1990 bcm_can_id = 0x0222
1991 nframes = 1
1992 assert len(self.cf) == 16
1993 header = struct.pack(self.bcm_cmd_msg_fmt,
1994 opcode,
1995 flags,
1996 count,
1997 ival1_seconds,
1998 ival1_usec,
1999 ival2_seconds,
2000 ival2_usec,
2001 bcm_can_id,
2002 nframes,
2003 )
2004 header_plus_frame = header + self.cf
2005 bytes_sent = bcm.send(header_plus_frame)
2006 self.assertEqual(bytes_sent, len(header_plus_frame))
2007
Charles-François Natali47413c12011-10-06 19:47:44 +02002008
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002009@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
2010class ISOTPTest(unittest.TestCase):
2011
2012 def __init__(self, *args, **kwargs):
2013 super().__init__(*args, **kwargs)
2014 self.interface = "vcan0"
2015
2016 def testCrucialConstants(self):
2017 socket.AF_CAN
2018 socket.PF_CAN
2019 socket.CAN_ISOTP
2020 socket.SOCK_DGRAM
2021
2022 def testCreateSocket(self):
2023 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2024 pass
2025
2026 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2027 'socket.CAN_ISOTP required for this test.')
2028 def testCreateISOTPSocket(self):
2029 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2030 pass
2031
2032 def testTooLongInterfaceName(self):
2033 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2034 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2035 with self.assertRaisesRegex(OSError, 'interface name too long'):
2036 s.bind(('x' * 1024, 1, 2))
2037
2038 def testBind(self):
2039 try:
2040 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2041 addr = self.interface, 0x123, 0x456
2042 s.bind(addr)
2043 self.assertEqual(s.getsockname(), addr)
2044 except OSError as e:
2045 if e.errno == errno.ENODEV:
2046 self.skipTest('network interface `%s` does not exist' %
2047 self.interface)
2048 else:
2049 raise
2050
2051
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002052@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2053class BasicRDSTest(unittest.TestCase):
2054
2055 def testCrucialConstants(self):
2056 socket.AF_RDS
2057 socket.PF_RDS
2058
2059 def testCreateSocket(self):
2060 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2061 pass
2062
2063 def testSocketBufferSize(self):
2064 bufsize = 16384
2065 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2066 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2067 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2068
2069
2070@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002071class RDSTest(ThreadedRDSSocketTest):
2072
2073 def __init__(self, methodName='runTest'):
2074 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2075
Charles-François Natali240c55f2011-11-10 20:33:36 +01002076 def setUp(self):
2077 super().setUp()
2078 self.evt = threading.Event()
2079
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002080 def testSendAndRecv(self):
2081 data, addr = self.serv.recvfrom(self.bufsize)
2082 self.assertEqual(self.data, data)
2083 self.assertEqual(self.cli_addr, addr)
2084
2085 def _testSendAndRecv(self):
2086 self.data = b'spam'
2087 self.cli.sendto(self.data, 0, (HOST, self.port))
2088
2089 def testPeek(self):
2090 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2091 self.assertEqual(self.data, data)
2092 data, addr = self.serv.recvfrom(self.bufsize)
2093 self.assertEqual(self.data, data)
2094
2095 def _testPeek(self):
2096 self.data = b'spam'
2097 self.cli.sendto(self.data, 0, (HOST, self.port))
2098
2099 @requireAttrs(socket.socket, 'recvmsg')
2100 def testSendAndRecvMsg(self):
2101 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2102 self.assertEqual(self.data, data)
2103
2104 @requireAttrs(socket.socket, 'sendmsg')
2105 def _testSendAndRecvMsg(self):
2106 self.data = b'hello ' * 10
2107 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2108
2109 def testSendAndRecvMulti(self):
2110 data, addr = self.serv.recvfrom(self.bufsize)
2111 self.assertEqual(self.data1, data)
2112
2113 data, addr = self.serv.recvfrom(self.bufsize)
2114 self.assertEqual(self.data2, data)
2115
2116 def _testSendAndRecvMulti(self):
2117 self.data1 = b'bacon'
2118 self.cli.sendto(self.data1, 0, (HOST, self.port))
2119
2120 self.data2 = b'egg'
2121 self.cli.sendto(self.data2, 0, (HOST, self.port))
2122
2123 def testSelect(self):
2124 r, w, x = select.select([self.serv], [], [], 3.0)
2125 self.assertIn(self.serv, r)
2126 data, addr = self.serv.recvfrom(self.bufsize)
2127 self.assertEqual(self.data, data)
2128
2129 def _testSelect(self):
2130 self.data = b'select'
2131 self.cli.sendto(self.data, 0, (HOST, self.port))
2132
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002133@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2134 'QIPCRTR sockets required for this test.')
2135class BasicQIPCRTRTest(unittest.TestCase):
2136
2137 def testCrucialConstants(self):
2138 socket.AF_QIPCRTR
2139
2140 def testCreateSocket(self):
2141 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2142 pass
2143
2144 def testUnbound(self):
2145 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2146 self.assertEqual(s.getsockname()[1], 0)
2147
2148 def testBindSock(self):
2149 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2150 support.bind_port(s, host=s.getsockname()[0])
2151 self.assertNotEqual(s.getsockname()[1], 0)
2152
2153 def testInvalidBindSock(self):
2154 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2155 self.assertRaises(OSError, support.bind_port, s, host=-2)
2156
2157 def testAutoBindSock(self):
2158 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2159 s.connect((123, 123))
2160 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002161
caaveryeffc12f2017-09-06 18:18:10 -04002162@unittest.skipIf(fcntl is None, "need fcntl")
2163@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2164 'VSOCK sockets required for this test.')
2165class BasicVSOCKTest(unittest.TestCase):
2166
2167 def testCrucialConstants(self):
2168 socket.AF_VSOCK
2169
2170 def testVSOCKConstants(self):
2171 socket.SO_VM_SOCKETS_BUFFER_SIZE
2172 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2173 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2174 socket.VMADDR_CID_ANY
2175 socket.VMADDR_PORT_ANY
2176 socket.VMADDR_CID_HOST
2177 socket.VM_SOCKETS_INVALID_VERSION
2178 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2179
2180 def testCreateSocket(self):
2181 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2182 pass
2183
2184 def testSocketBufferSize(self):
2185 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2186 orig_max = s.getsockopt(socket.AF_VSOCK,
2187 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2188 orig = s.getsockopt(socket.AF_VSOCK,
2189 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2190 orig_min = s.getsockopt(socket.AF_VSOCK,
2191 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2192
2193 s.setsockopt(socket.AF_VSOCK,
2194 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2195 s.setsockopt(socket.AF_VSOCK,
2196 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2197 s.setsockopt(socket.AF_VSOCK,
2198 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2199
2200 self.assertEqual(orig_max * 2,
2201 s.getsockopt(socket.AF_VSOCK,
2202 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2203 self.assertEqual(orig * 2,
2204 s.getsockopt(socket.AF_VSOCK,
2205 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2206 self.assertEqual(orig_min * 2,
2207 s.getsockopt(socket.AF_VSOCK,
2208 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2209
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002210
Guido van Rossum24e4af82002-06-12 19:18:08 +00002211class BasicTCPTest(SocketConnectedTest):
2212
2213 def __init__(self, methodName='runTest'):
2214 SocketConnectedTest.__init__(self, methodName=methodName)
2215
2216 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002217 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002218 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002219 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002220
2221 def _testRecv(self):
2222 self.serv_conn.send(MSG)
2223
2224 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002225 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002226 seg1 = self.cli_conn.recv(len(MSG) - 3)
2227 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002228 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002229 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002230
2231 def _testOverFlowRecv(self):
2232 self.serv_conn.send(MSG)
2233
2234 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002235 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002236 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002237 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002238
2239 def _testRecvFrom(self):
2240 self.serv_conn.send(MSG)
2241
2242 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002243 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002244 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2245 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002246 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002247 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002248
2249 def _testOverFlowRecvFrom(self):
2250 self.serv_conn.send(MSG)
2251
2252 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002253 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002254 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002255 while 1:
2256 read = self.cli_conn.recv(1024)
2257 if not read:
2258 break
Guido van Rossume531e292002-08-08 20:28:34 +00002259 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002260 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002261
2262 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002263 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002264 self.serv_conn.sendall(big_chunk)
2265
2266 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002267 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002268 fd = self.cli_conn.fileno()
2269 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002270 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002271 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002272 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002273 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002274
2275 def _testFromFd(self):
2276 self.serv_conn.send(MSG)
2277
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002278 def testDup(self):
2279 # Testing dup()
2280 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002281 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002282 msg = sock.recv(1024)
2283 self.assertEqual(msg, MSG)
2284
2285 def _testDup(self):
2286 self.serv_conn.send(MSG)
2287
Guido van Rossum24e4af82002-06-12 19:18:08 +00002288 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002289 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002290 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002291 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002292 # wait for _testShutdown to finish: on OS X, when the server
2293 # closes the connection the client also becomes disconnected,
2294 # and the client's shutdown call will fail. (Issue #4397.)
2295 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002296
2297 def _testShutdown(self):
2298 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002299 self.serv_conn.shutdown(2)
2300
2301 testShutdown_overflow = support.cpython_only(testShutdown)
2302
2303 @support.cpython_only
2304 def _testShutdown_overflow(self):
2305 import _testcapi
2306 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002307 # Issue 15989
2308 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2309 _testcapi.INT_MAX + 1)
2310 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2311 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002312 self.serv_conn.shutdown(2)
2313
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002314 def testDetach(self):
2315 # Testing detach()
2316 fileno = self.cli_conn.fileno()
2317 f = self.cli_conn.detach()
2318 self.assertEqual(f, fileno)
2319 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002320 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002321 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002322 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002323 # ...but we can create another socket using the (still open)
2324 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002325 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002326 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002327 msg = sock.recv(1024)
2328 self.assertEqual(msg, MSG)
2329
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002330 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002331 self.serv_conn.send(MSG)
2332
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002333
Guido van Rossum24e4af82002-06-12 19:18:08 +00002334class BasicUDPTest(ThreadedUDPSocketTest):
2335
2336 def __init__(self, methodName='runTest'):
2337 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2338
2339 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002340 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002341 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002342 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002343
2344 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002345 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002346
Guido van Rossum1c938012002-06-12 21:17:20 +00002347 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002348 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002349 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002350 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002351
Guido van Rossum1c938012002-06-12 21:17:20 +00002352 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002353 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002354
Guido van Rossumd8faa362007-04-27 19:54:29 +00002355 def testRecvFromNegative(self):
2356 # Negative lengths passed to recvfrom should give ValueError.
2357 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2358
2359 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002360 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002361
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002362# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2363# same test code is used with different families and types of socket
2364# (e.g. stream, datagram), and tests using recvmsg() are repeated
2365# using recvmsg_into().
2366#
2367# The generic test classes such as SendmsgTests and
2368# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2369# supplied with sockets cli_sock and serv_sock representing the
2370# client's and the server's end of the connection respectively, and
2371# attributes cli_addr and serv_addr holding their (numeric where
2372# appropriate) addresses.
2373#
2374# The final concrete test classes combine these with subclasses of
2375# SocketTestBase which set up client and server sockets of a specific
2376# type, and with subclasses of SendrecvmsgBase such as
2377# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2378# sockets to cli_sock and serv_sock and override the methods and
2379# attributes of SendrecvmsgBase to fill in destination addresses if
2380# needed when sending, check for specific flags in msg_flags, etc.
2381#
2382# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2383# recvmsg_into().
2384
2385# XXX: like the other datagram (UDP) tests in this module, the code
2386# here assumes that datagram delivery on the local machine will be
2387# reliable.
2388
2389class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2390 # Base class for sendmsg()/recvmsg() tests.
2391
2392 # Time in seconds to wait before considering a test failed, or
2393 # None for no timeout. Not all tests actually set a timeout.
2394 fail_timeout = 3.0
2395
2396 def setUp(self):
2397 self.misc_event = threading.Event()
2398 super().setUp()
2399
2400 def sendToServer(self, msg):
2401 # Send msg to the server.
2402 return self.cli_sock.send(msg)
2403
2404 # Tuple of alternative default arguments for sendmsg() when called
2405 # via sendmsgToServer() (e.g. to include a destination address).
2406 sendmsg_to_server_defaults = ()
2407
2408 def sendmsgToServer(self, *args):
2409 # Call sendmsg() on self.cli_sock with the given arguments,
2410 # filling in any arguments which are not supplied with the
2411 # corresponding items of self.sendmsg_to_server_defaults, if
2412 # any.
2413 return self.cli_sock.sendmsg(
2414 *(args + self.sendmsg_to_server_defaults[len(args):]))
2415
2416 def doRecvmsg(self, sock, bufsize, *args):
2417 # Call recvmsg() on sock with given arguments and return its
2418 # result. Should be used for tests which can use either
2419 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2420 # this method with one which emulates it using recvmsg_into(),
2421 # thus allowing the same test to be used for both methods.
2422 result = sock.recvmsg(bufsize, *args)
2423 self.registerRecvmsgResult(result)
2424 return result
2425
2426 def registerRecvmsgResult(self, result):
2427 # Called by doRecvmsg() with the return value of recvmsg() or
2428 # recvmsg_into(). Can be overridden to arrange cleanup based
2429 # on the returned ancillary data, for instance.
2430 pass
2431
2432 def checkRecvmsgAddress(self, addr1, addr2):
2433 # Called to compare the received address with the address of
2434 # the peer.
2435 self.assertEqual(addr1, addr2)
2436
2437 # Flags that are normally unset in msg_flags
2438 msg_flags_common_unset = 0
2439 for name in ("MSG_CTRUNC", "MSG_OOB"):
2440 msg_flags_common_unset |= getattr(socket, name, 0)
2441
2442 # Flags that are normally set
2443 msg_flags_common_set = 0
2444
2445 # Flags set when a complete record has been received (e.g. MSG_EOR
2446 # for SCTP)
2447 msg_flags_eor_indicator = 0
2448
2449 # Flags set when a complete record has not been received
2450 # (e.g. MSG_TRUNC for datagram sockets)
2451 msg_flags_non_eor_indicator = 0
2452
2453 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2454 # Method to check the value of msg_flags returned by recvmsg[_into]().
2455 #
2456 # Checks that all bits in msg_flags_common_set attribute are
2457 # set in "flags" and all bits in msg_flags_common_unset are
2458 # unset.
2459 #
2460 # The "eor" argument specifies whether the flags should
2461 # indicate that a full record (or datagram) has been received.
2462 # If "eor" is None, no checks are done; otherwise, checks
2463 # that:
2464 #
2465 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2466 # set and all bits in msg_flags_non_eor_indicator are unset
2467 #
2468 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2469 # are set and all bits in msg_flags_eor_indicator are unset
2470 #
2471 # If "checkset" and/or "checkunset" are supplied, they require
2472 # the given bits to be set or unset respectively, overriding
2473 # what the attributes require for those bits.
2474 #
2475 # If any bits are set in "ignore", they will not be checked,
2476 # regardless of the other inputs.
2477 #
2478 # Will raise Exception if the inputs require a bit to be both
2479 # set and unset, and it is not ignored.
2480
2481 defaultset = self.msg_flags_common_set
2482 defaultunset = self.msg_flags_common_unset
2483
2484 if eor:
2485 defaultset |= self.msg_flags_eor_indicator
2486 defaultunset |= self.msg_flags_non_eor_indicator
2487 elif eor is not None:
2488 defaultset |= self.msg_flags_non_eor_indicator
2489 defaultunset |= self.msg_flags_eor_indicator
2490
2491 # Function arguments override defaults
2492 defaultset &= ~checkunset
2493 defaultunset &= ~checkset
2494
2495 # Merge arguments with remaining defaults, and check for conflicts
2496 checkset |= defaultset
2497 checkunset |= defaultunset
2498 inboth = checkset & checkunset & ~ignore
2499 if inboth:
2500 raise Exception("contradictory set, unset requirements for flags "
2501 "{0:#x}".format(inboth))
2502
2503 # Compare with given msg_flags value
2504 mask = (checkset | checkunset) & ~ignore
2505 self.assertEqual(flags & mask, checkset & mask)
2506
2507
2508class RecvmsgIntoMixin(SendrecvmsgBase):
2509 # Mixin to implement doRecvmsg() using recvmsg_into().
2510
2511 def doRecvmsg(self, sock, bufsize, *args):
2512 buf = bytearray(bufsize)
2513 result = sock.recvmsg_into([buf], *args)
2514 self.registerRecvmsgResult(result)
2515 self.assertGreaterEqual(result[0], 0)
2516 self.assertLessEqual(result[0], bufsize)
2517 return (bytes(buf[:result[0]]),) + result[1:]
2518
2519
2520class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2521 # Defines flags to be checked in msg_flags for datagram sockets.
2522
2523 @property
2524 def msg_flags_non_eor_indicator(self):
2525 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2526
2527
2528class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2529 # Defines flags to be checked in msg_flags for SCTP sockets.
2530
2531 @property
2532 def msg_flags_eor_indicator(self):
2533 return super().msg_flags_eor_indicator | socket.MSG_EOR
2534
2535
2536class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2537 # Base class for tests on connectionless-mode sockets. Users must
2538 # supply sockets on attributes cli and serv to be mapped to
2539 # cli_sock and serv_sock respectively.
2540
2541 @property
2542 def serv_sock(self):
2543 return self.serv
2544
2545 @property
2546 def cli_sock(self):
2547 return self.cli
2548
2549 @property
2550 def sendmsg_to_server_defaults(self):
2551 return ([], [], 0, self.serv_addr)
2552
2553 def sendToServer(self, msg):
2554 return self.cli_sock.sendto(msg, self.serv_addr)
2555
2556
2557class SendrecvmsgConnectedBase(SendrecvmsgBase):
2558 # Base class for tests on connected sockets. Users must supply
2559 # sockets on attributes serv_conn and cli_conn (representing the
2560 # connections *to* the server and the client), to be mapped to
2561 # cli_sock and serv_sock respectively.
2562
2563 @property
2564 def serv_sock(self):
2565 return self.cli_conn
2566
2567 @property
2568 def cli_sock(self):
2569 return self.serv_conn
2570
2571 def checkRecvmsgAddress(self, addr1, addr2):
2572 # Address is currently "unspecified" for a connected socket,
2573 # so we don't examine it
2574 pass
2575
2576
2577class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2578 # Base class to set a timeout on server's socket.
2579
2580 def setUp(self):
2581 super().setUp()
2582 self.serv_sock.settimeout(self.fail_timeout)
2583
2584
2585class SendmsgTests(SendrecvmsgServerTimeoutBase):
2586 # Tests for sendmsg() which can use any socket type and do not
2587 # involve recvmsg() or recvmsg_into().
2588
2589 def testSendmsg(self):
2590 # Send a simple message with sendmsg().
2591 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2592
2593 def _testSendmsg(self):
2594 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2595
2596 def testSendmsgDataGenerator(self):
2597 # Send from buffer obtained from a generator (not a sequence).
2598 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2599
2600 def _testSendmsgDataGenerator(self):
2601 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2602 len(MSG))
2603
2604 def testSendmsgAncillaryGenerator(self):
2605 # Gather (empty) ancillary data from a generator.
2606 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2607
2608 def _testSendmsgAncillaryGenerator(self):
2609 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2610 len(MSG))
2611
2612 def testSendmsgArray(self):
2613 # Send data from an array instead of the usual bytes object.
2614 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2615
2616 def _testSendmsgArray(self):
2617 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2618 len(MSG))
2619
2620 def testSendmsgGather(self):
2621 # Send message data from more than one buffer (gather write).
2622 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2623
2624 def _testSendmsgGather(self):
2625 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2626
2627 def testSendmsgBadArgs(self):
2628 # Check that sendmsg() rejects invalid arguments.
2629 self.assertEqual(self.serv_sock.recv(1000), b"done")
2630
2631 def _testSendmsgBadArgs(self):
2632 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2633 self.assertRaises(TypeError, self.sendmsgToServer,
2634 b"not in an iterable")
2635 self.assertRaises(TypeError, self.sendmsgToServer,
2636 object())
2637 self.assertRaises(TypeError, self.sendmsgToServer,
2638 [object()])
2639 self.assertRaises(TypeError, self.sendmsgToServer,
2640 [MSG, 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], [], 0, object())
2647 self.sendToServer(b"done")
2648
2649 def testSendmsgBadCmsg(self):
2650 # Check that invalid ancillary data items are rejected.
2651 self.assertEqual(self.serv_sock.recv(1000), b"done")
2652
2653 def _testSendmsgBadCmsg(self):
2654 self.assertRaises(TypeError, self.sendmsgToServer,
2655 [MSG], [object()])
2656 self.assertRaises(TypeError, self.sendmsgToServer,
2657 [MSG], [(object(), 0, b"data")])
2658 self.assertRaises(TypeError, self.sendmsgToServer,
2659 [MSG], [(0, object(), b"data")])
2660 self.assertRaises(TypeError, self.sendmsgToServer,
2661 [MSG], [(0, 0, object())])
2662 self.assertRaises(TypeError, self.sendmsgToServer,
2663 [MSG], [(0, 0)])
2664 self.assertRaises(TypeError, self.sendmsgToServer,
2665 [MSG], [(0, 0, b"data", 42)])
2666 self.sendToServer(b"done")
2667
2668 @requireAttrs(socket, "CMSG_SPACE")
2669 def testSendmsgBadMultiCmsg(self):
2670 # Check that invalid ancillary data items are rejected when
2671 # more than one item is present.
2672 self.assertEqual(self.serv_sock.recv(1000), b"done")
2673
2674 @testSendmsgBadMultiCmsg.client_skip
2675 def _testSendmsgBadMultiCmsg(self):
2676 self.assertRaises(TypeError, self.sendmsgToServer,
2677 [MSG], [0, 0, b""])
2678 self.assertRaises(TypeError, self.sendmsgToServer,
2679 [MSG], [(0, 0, b""), object()])
2680 self.sendToServer(b"done")
2681
2682 def testSendmsgExcessCmsgReject(self):
2683 # Check that sendmsg() rejects excess ancillary data items
2684 # when the number that can be sent is limited.
2685 self.assertEqual(self.serv_sock.recv(1000), b"done")
2686
2687 def _testSendmsgExcessCmsgReject(self):
2688 if not hasattr(socket, "CMSG_SPACE"):
2689 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002690 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002691 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2692 self.assertIsNone(cm.exception.errno)
2693 self.sendToServer(b"done")
2694
2695 def testSendmsgAfterClose(self):
2696 # Check that sendmsg() fails on a closed socket.
2697 pass
2698
2699 def _testSendmsgAfterClose(self):
2700 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002701 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002702
2703
2704class SendmsgStreamTests(SendmsgTests):
2705 # Tests for sendmsg() which require a stream socket and do not
2706 # involve recvmsg() or recvmsg_into().
2707
2708 def testSendmsgExplicitNoneAddr(self):
2709 # Check that peer address can be specified as None.
2710 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2711
2712 def _testSendmsgExplicitNoneAddr(self):
2713 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2714
2715 def testSendmsgTimeout(self):
2716 # Check that timeout works with sendmsg().
2717 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2718 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2719
2720 def _testSendmsgTimeout(self):
2721 try:
2722 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002723 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002724 while True:
2725 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002726 except socket.timeout:
2727 pass
2728 except OSError as exc:
2729 if exc.errno != errno.ENOMEM:
2730 raise
2731 # bpo-33937 the test randomly fails on Travis CI with
2732 # "OSError: [Errno 12] Cannot allocate memory"
2733 else:
2734 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002735 finally:
2736 self.misc_event.set()
2737
2738 # XXX: would be nice to have more tests for sendmsg flags argument.
2739
2740 # Linux supports MSG_DONTWAIT when sending, but in general, it
2741 # only works when receiving. Could add other platforms if they
2742 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002743 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002744 "MSG_DONTWAIT not known to work on this platform when "
2745 "sending")
2746 def testSendmsgDontWait(self):
2747 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2748 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2749 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2750
2751 @testSendmsgDontWait.client_skip
2752 def _testSendmsgDontWait(self):
2753 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002754 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002755 while True:
2756 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002757 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2758 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002759 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002760 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002761 finally:
2762 self.misc_event.set()
2763
2764
2765class SendmsgConnectionlessTests(SendmsgTests):
2766 # Tests for sendmsg() which require a connectionless-mode
2767 # (e.g. datagram) socket, and do not involve recvmsg() or
2768 # recvmsg_into().
2769
2770 def testSendmsgNoDestAddr(self):
2771 # Check that sendmsg() fails when no destination address is
2772 # given for unconnected socket.
2773 pass
2774
2775 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002776 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002777 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002778 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002779 [MSG], [], 0, None)
2780
2781
2782class RecvmsgGenericTests(SendrecvmsgBase):
2783 # Tests for recvmsg() which can also be emulated using
2784 # recvmsg_into(), and can use any socket type.
2785
2786 def testRecvmsg(self):
2787 # Receive a simple message with recvmsg[_into]().
2788 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2789 self.assertEqual(msg, MSG)
2790 self.checkRecvmsgAddress(addr, self.cli_addr)
2791 self.assertEqual(ancdata, [])
2792 self.checkFlags(flags, eor=True)
2793
2794 def _testRecvmsg(self):
2795 self.sendToServer(MSG)
2796
2797 def testRecvmsgExplicitDefaults(self):
2798 # Test recvmsg[_into]() with default arguments provided explicitly.
2799 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2800 len(MSG), 0, 0)
2801 self.assertEqual(msg, MSG)
2802 self.checkRecvmsgAddress(addr, self.cli_addr)
2803 self.assertEqual(ancdata, [])
2804 self.checkFlags(flags, eor=True)
2805
2806 def _testRecvmsgExplicitDefaults(self):
2807 self.sendToServer(MSG)
2808
2809 def testRecvmsgShorter(self):
2810 # Receive a message smaller than buffer.
2811 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2812 len(MSG) + 42)
2813 self.assertEqual(msg, MSG)
2814 self.checkRecvmsgAddress(addr, self.cli_addr)
2815 self.assertEqual(ancdata, [])
2816 self.checkFlags(flags, eor=True)
2817
2818 def _testRecvmsgShorter(self):
2819 self.sendToServer(MSG)
2820
2821 def testRecvmsgTrunc(self):
2822 # Receive part of message, check for truncation indicators.
2823 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2824 len(MSG) - 3)
2825 self.assertEqual(msg, MSG[:-3])
2826 self.checkRecvmsgAddress(addr, self.cli_addr)
2827 self.assertEqual(ancdata, [])
2828 self.checkFlags(flags, eor=False)
2829
2830 def _testRecvmsgTrunc(self):
2831 self.sendToServer(MSG)
2832
2833 def testRecvmsgShortAncillaryBuf(self):
2834 # Test ancillary data buffer too small to hold any ancillary data.
2835 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2836 len(MSG), 1)
2837 self.assertEqual(msg, MSG)
2838 self.checkRecvmsgAddress(addr, self.cli_addr)
2839 self.assertEqual(ancdata, [])
2840 self.checkFlags(flags, eor=True)
2841
2842 def _testRecvmsgShortAncillaryBuf(self):
2843 self.sendToServer(MSG)
2844
2845 def testRecvmsgLongAncillaryBuf(self):
2846 # Test large ancillary data buffer.
2847 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2848 len(MSG), 10240)
2849 self.assertEqual(msg, MSG)
2850 self.checkRecvmsgAddress(addr, self.cli_addr)
2851 self.assertEqual(ancdata, [])
2852 self.checkFlags(flags, eor=True)
2853
2854 def _testRecvmsgLongAncillaryBuf(self):
2855 self.sendToServer(MSG)
2856
2857 def testRecvmsgAfterClose(self):
2858 # Check that recvmsg[_into]() fails on a closed socket.
2859 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002860 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002861
2862 def _testRecvmsgAfterClose(self):
2863 pass
2864
2865 def testRecvmsgTimeout(self):
2866 # Check that timeout works.
2867 try:
2868 self.serv_sock.settimeout(0.03)
2869 self.assertRaises(socket.timeout,
2870 self.doRecvmsg, self.serv_sock, len(MSG))
2871 finally:
2872 self.misc_event.set()
2873
2874 def _testRecvmsgTimeout(self):
2875 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2876
2877 @requireAttrs(socket, "MSG_PEEK")
2878 def testRecvmsgPeek(self):
2879 # Check that MSG_PEEK in flags enables examination of pending
2880 # data without consuming it.
2881
2882 # Receive part of data with MSG_PEEK.
2883 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2884 len(MSG) - 3, 0,
2885 socket.MSG_PEEK)
2886 self.assertEqual(msg, MSG[:-3])
2887 self.checkRecvmsgAddress(addr, self.cli_addr)
2888 self.assertEqual(ancdata, [])
2889 # Ignoring MSG_TRUNC here (so this test is the same for stream
2890 # and datagram sockets). Some wording in POSIX seems to
2891 # suggest that it needn't be set when peeking, but that may
2892 # just be a slip.
2893 self.checkFlags(flags, eor=False,
2894 ignore=getattr(socket, "MSG_TRUNC", 0))
2895
2896 # Receive all data with MSG_PEEK.
2897 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2898 len(MSG), 0,
2899 socket.MSG_PEEK)
2900 self.assertEqual(msg, MSG)
2901 self.checkRecvmsgAddress(addr, self.cli_addr)
2902 self.assertEqual(ancdata, [])
2903 self.checkFlags(flags, eor=True)
2904
2905 # Check that the same data can still be received normally.
2906 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2907 self.assertEqual(msg, MSG)
2908 self.checkRecvmsgAddress(addr, self.cli_addr)
2909 self.assertEqual(ancdata, [])
2910 self.checkFlags(flags, eor=True)
2911
2912 @testRecvmsgPeek.client_skip
2913 def _testRecvmsgPeek(self):
2914 self.sendToServer(MSG)
2915
2916 @requireAttrs(socket.socket, "sendmsg")
2917 def testRecvmsgFromSendmsg(self):
2918 # Test receiving with recvmsg[_into]() when message is sent
2919 # using sendmsg().
2920 self.serv_sock.settimeout(self.fail_timeout)
2921 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2922 self.assertEqual(msg, MSG)
2923 self.checkRecvmsgAddress(addr, self.cli_addr)
2924 self.assertEqual(ancdata, [])
2925 self.checkFlags(flags, eor=True)
2926
2927 @testRecvmsgFromSendmsg.client_skip
2928 def _testRecvmsgFromSendmsg(self):
2929 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2930
2931
2932class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2933 # Tests which require a stream socket and can use either recvmsg()
2934 # or recvmsg_into().
2935
2936 def testRecvmsgEOF(self):
2937 # Receive end-of-stream indicator (b"", peer socket closed).
2938 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2939 self.assertEqual(msg, b"")
2940 self.checkRecvmsgAddress(addr, self.cli_addr)
2941 self.assertEqual(ancdata, [])
2942 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2943
2944 def _testRecvmsgEOF(self):
2945 self.cli_sock.close()
2946
2947 def testRecvmsgOverflow(self):
2948 # Receive a message in more than one chunk.
2949 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2950 len(MSG) - 3)
2951 self.checkRecvmsgAddress(addr, self.cli_addr)
2952 self.assertEqual(ancdata, [])
2953 self.checkFlags(flags, eor=False)
2954
2955 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2956 self.checkRecvmsgAddress(addr, self.cli_addr)
2957 self.assertEqual(ancdata, [])
2958 self.checkFlags(flags, eor=True)
2959
2960 msg = seg1 + seg2
2961 self.assertEqual(msg, MSG)
2962
2963 def _testRecvmsgOverflow(self):
2964 self.sendToServer(MSG)
2965
2966
2967class RecvmsgTests(RecvmsgGenericTests):
2968 # Tests for recvmsg() which can use any socket type.
2969
2970 def testRecvmsgBadArgs(self):
2971 # Check that recvmsg() rejects invalid arguments.
2972 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2973 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2974 -1, 0, 0)
2975 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2976 len(MSG), -1, 0)
2977 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2978 [bytearray(10)], 0, 0)
2979 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2980 object(), 0, 0)
2981 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2982 len(MSG), object(), 0)
2983 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2984 len(MSG), 0, object())
2985
2986 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2987 self.assertEqual(msg, MSG)
2988 self.checkRecvmsgAddress(addr, self.cli_addr)
2989 self.assertEqual(ancdata, [])
2990 self.checkFlags(flags, eor=True)
2991
2992 def _testRecvmsgBadArgs(self):
2993 self.sendToServer(MSG)
2994
2995
2996class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2997 # Tests for recvmsg_into() which can use any socket type.
2998
2999 def testRecvmsgIntoBadArgs(self):
3000 # Check that recvmsg_into() rejects invalid arguments.
3001 buf = bytearray(len(MSG))
3002 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
3003 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3004 len(MSG), 0, 0)
3005 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3006 buf, 0, 0)
3007 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3008 [object()], 0, 0)
3009 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3010 [b"I'm not writable"], 0, 0)
3011 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3012 [buf, object()], 0, 0)
3013 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
3014 [buf], -1, 0)
3015 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3016 [buf], object(), 0)
3017 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3018 [buf], 0, object())
3019
3020 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3021 self.assertEqual(nbytes, len(MSG))
3022 self.assertEqual(buf, bytearray(MSG))
3023 self.checkRecvmsgAddress(addr, self.cli_addr)
3024 self.assertEqual(ancdata, [])
3025 self.checkFlags(flags, eor=True)
3026
3027 def _testRecvmsgIntoBadArgs(self):
3028 self.sendToServer(MSG)
3029
3030 def testRecvmsgIntoGenerator(self):
3031 # Receive into buffer obtained from a generator (not a sequence).
3032 buf = bytearray(len(MSG))
3033 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3034 (o for o in [buf]))
3035 self.assertEqual(nbytes, len(MSG))
3036 self.assertEqual(buf, bytearray(MSG))
3037 self.checkRecvmsgAddress(addr, self.cli_addr)
3038 self.assertEqual(ancdata, [])
3039 self.checkFlags(flags, eor=True)
3040
3041 def _testRecvmsgIntoGenerator(self):
3042 self.sendToServer(MSG)
3043
3044 def testRecvmsgIntoArray(self):
3045 # Receive into an array rather than the usual bytearray.
3046 buf = array.array("B", [0] * len(MSG))
3047 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3048 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003049 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003050 self.checkRecvmsgAddress(addr, self.cli_addr)
3051 self.assertEqual(ancdata, [])
3052 self.checkFlags(flags, eor=True)
3053
3054 def _testRecvmsgIntoArray(self):
3055 self.sendToServer(MSG)
3056
3057 def testRecvmsgIntoScatter(self):
3058 # Receive into multiple buffers (scatter write).
3059 b1 = bytearray(b"----")
3060 b2 = bytearray(b"0123456789")
3061 b3 = bytearray(b"--------------")
3062 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3063 [b1, memoryview(b2)[2:9], b3])
3064 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3065 self.assertEqual(b1, bytearray(b"Mary"))
3066 self.assertEqual(b2, bytearray(b"01 had a 9"))
3067 self.assertEqual(b3, bytearray(b"little lamb---"))
3068 self.checkRecvmsgAddress(addr, self.cli_addr)
3069 self.assertEqual(ancdata, [])
3070 self.checkFlags(flags, eor=True)
3071
3072 def _testRecvmsgIntoScatter(self):
3073 self.sendToServer(b"Mary had a little lamb")
3074
3075
3076class CmsgMacroTests(unittest.TestCase):
3077 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3078 # assumptions used by sendmsg() and recvmsg[_into](), which share
3079 # code with these functions.
3080
3081 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003082 try:
3083 import _testcapi
3084 except ImportError:
3085 socklen_t_limit = 0x7fffffff
3086 else:
3087 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003088
3089 @requireAttrs(socket, "CMSG_LEN")
3090 def testCMSG_LEN(self):
3091 # Test CMSG_LEN() with various valid and invalid values,
3092 # checking the assumptions used by recvmsg() and sendmsg().
3093 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3094 values = list(range(257)) + list(range(toobig - 257, toobig))
3095
3096 # struct cmsghdr has at least three members, two of which are ints
3097 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3098 for n in values:
3099 ret = socket.CMSG_LEN(n)
3100 # This is how recvmsg() calculates the data size
3101 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3102 self.assertLessEqual(ret, self.socklen_t_limit)
3103
3104 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3105 # sendmsg() shares code with these functions, and requires
3106 # that it reject values over the limit.
3107 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3108 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3109
3110 @requireAttrs(socket, "CMSG_SPACE")
3111 def testCMSG_SPACE(self):
3112 # Test CMSG_SPACE() with various valid and invalid values,
3113 # checking the assumptions used by sendmsg().
3114 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3115 values = list(range(257)) + list(range(toobig - 257, toobig))
3116
3117 last = socket.CMSG_SPACE(0)
3118 # struct cmsghdr has at least three members, two of which are ints
3119 self.assertGreater(last, array.array("i").itemsize * 2)
3120 for n in values:
3121 ret = socket.CMSG_SPACE(n)
3122 self.assertGreaterEqual(ret, last)
3123 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3124 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3125 self.assertLessEqual(ret, self.socklen_t_limit)
3126 last = ret
3127
3128 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3129 # sendmsg() shares code with these functions, and requires
3130 # that it reject values over the limit.
3131 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3132 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3133
3134
3135class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3136 # Tests for file descriptor passing on Unix-domain sockets.
3137
3138 # Invalid file descriptor value that's unlikely to evaluate to a
3139 # real FD even if one of its bytes is replaced with a different
3140 # value (which shouldn't actually happen).
3141 badfd = -0x5555
3142
3143 def newFDs(self, n):
3144 # Return a list of n file descriptors for newly-created files
3145 # containing their list indices as ASCII numbers.
3146 fds = []
3147 for i in range(n):
3148 fd, path = tempfile.mkstemp()
3149 self.addCleanup(os.unlink, path)
3150 self.addCleanup(os.close, fd)
3151 os.write(fd, str(i).encode())
3152 fds.append(fd)
3153 return fds
3154
3155 def checkFDs(self, fds):
3156 # Check that the file descriptors in the given list contain
3157 # their correct list indices as ASCII numbers.
3158 for n, fd in enumerate(fds):
3159 os.lseek(fd, 0, os.SEEK_SET)
3160 self.assertEqual(os.read(fd, 1024), str(n).encode())
3161
3162 def registerRecvmsgResult(self, result):
3163 self.addCleanup(self.closeRecvmsgFDs, result)
3164
3165 def closeRecvmsgFDs(self, recvmsg_result):
3166 # Close all file descriptors specified in the ancillary data
3167 # of the given return value from recvmsg() or recvmsg_into().
3168 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3169 if (cmsg_level == socket.SOL_SOCKET and
3170 cmsg_type == socket.SCM_RIGHTS):
3171 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003172 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003173 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3174 for fd in fds:
3175 os.close(fd)
3176
3177 def createAndSendFDs(self, n):
3178 # Send n new file descriptors created by newFDs() to the
3179 # server, with the constant MSG as the non-ancillary data.
3180 self.assertEqual(
3181 self.sendmsgToServer([MSG],
3182 [(socket.SOL_SOCKET,
3183 socket.SCM_RIGHTS,
3184 array.array("i", self.newFDs(n)))]),
3185 len(MSG))
3186
3187 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3188 # Check that constant MSG was received with numfds file
3189 # descriptors in a maximum of maxcmsgs control messages (which
3190 # must contain only complete integers). By default, check
3191 # that MSG_CTRUNC is unset, but ignore any flags in
3192 # ignoreflags.
3193 msg, ancdata, flags, addr = result
3194 self.assertEqual(msg, MSG)
3195 self.checkRecvmsgAddress(addr, self.cli_addr)
3196 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3197 ignore=ignoreflags)
3198
3199 self.assertIsInstance(ancdata, list)
3200 self.assertLessEqual(len(ancdata), maxcmsgs)
3201 fds = array.array("i")
3202 for item in ancdata:
3203 self.assertIsInstance(item, tuple)
3204 cmsg_level, cmsg_type, cmsg_data = item
3205 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3206 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3207 self.assertIsInstance(cmsg_data, bytes)
3208 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003209 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003210
3211 self.assertEqual(len(fds), numfds)
3212 self.checkFDs(fds)
3213
3214 def testFDPassSimple(self):
3215 # Pass a single FD (array read from bytes object).
3216 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3217 len(MSG), 10240))
3218
3219 def _testFDPassSimple(self):
3220 self.assertEqual(
3221 self.sendmsgToServer(
3222 [MSG],
3223 [(socket.SOL_SOCKET,
3224 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003225 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003226 len(MSG))
3227
3228 def testMultipleFDPass(self):
3229 # Pass multiple FDs in a single array.
3230 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3231 len(MSG), 10240))
3232
3233 def _testMultipleFDPass(self):
3234 self.createAndSendFDs(4)
3235
3236 @requireAttrs(socket, "CMSG_SPACE")
3237 def testFDPassCMSG_SPACE(self):
3238 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3239 self.checkRecvmsgFDs(
3240 4, self.doRecvmsg(self.serv_sock, len(MSG),
3241 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3242
3243 @testFDPassCMSG_SPACE.client_skip
3244 def _testFDPassCMSG_SPACE(self):
3245 self.createAndSendFDs(4)
3246
3247 def testFDPassCMSG_LEN(self):
3248 # Test using CMSG_LEN() to calculate ancillary buffer size.
3249 self.checkRecvmsgFDs(1,
3250 self.doRecvmsg(self.serv_sock, len(MSG),
3251 socket.CMSG_LEN(4 * SIZEOF_INT)),
3252 # RFC 3542 says implementations may set
3253 # MSG_CTRUNC if there isn't enough space
3254 # for trailing padding.
3255 ignoreflags=socket.MSG_CTRUNC)
3256
3257 def _testFDPassCMSG_LEN(self):
3258 self.createAndSendFDs(1)
3259
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003260 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003261 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003262 @requireAttrs(socket, "CMSG_SPACE")
3263 def testFDPassSeparate(self):
3264 # Pass two FDs in two separate arrays. Arrays may be combined
3265 # into a single control message by the OS.
3266 self.checkRecvmsgFDs(2,
3267 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3268 maxcmsgs=2)
3269
3270 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003271 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003272 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003273 def _testFDPassSeparate(self):
3274 fd0, fd1 = self.newFDs(2)
3275 self.assertEqual(
3276 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3277 socket.SCM_RIGHTS,
3278 array.array("i", [fd0])),
3279 (socket.SOL_SOCKET,
3280 socket.SCM_RIGHTS,
3281 array.array("i", [fd1]))]),
3282 len(MSG))
3283
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003284 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003285 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003286 @requireAttrs(socket, "CMSG_SPACE")
3287 def testFDPassSeparateMinSpace(self):
3288 # Pass two FDs in two separate arrays, receiving them into the
3289 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003290 num_fds = 2
3291 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003292 self.doRecvmsg(self.serv_sock, len(MSG),
3293 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003294 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003295 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3296
3297 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003298 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003299 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003300 def _testFDPassSeparateMinSpace(self):
3301 fd0, fd1 = self.newFDs(2)
3302 self.assertEqual(
3303 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3304 socket.SCM_RIGHTS,
3305 array.array("i", [fd0])),
3306 (socket.SOL_SOCKET,
3307 socket.SCM_RIGHTS,
3308 array.array("i", [fd1]))]),
3309 len(MSG))
3310
3311 def sendAncillaryIfPossible(self, msg, ancdata):
3312 # Try to send msg and ancdata to server, but if the system
3313 # call fails, just send msg with no ancillary data.
3314 try:
3315 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003316 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003317 # Check that it was the system call that failed
3318 self.assertIsInstance(e.errno, int)
3319 nbytes = self.sendmsgToServer([msg])
3320 self.assertEqual(nbytes, len(msg))
3321
Brett Cannon3bbad122015-12-28 17:21:44 -08003322 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003323 def testFDPassEmpty(self):
3324 # Try to pass an empty FD array. Can receive either no array
3325 # or an empty array.
3326 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3327 len(MSG), 10240),
3328 ignoreflags=socket.MSG_CTRUNC)
3329
3330 def _testFDPassEmpty(self):
3331 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3332 socket.SCM_RIGHTS,
3333 b"")])
3334
3335 def testFDPassPartialInt(self):
3336 # Try to pass a truncated FD array.
3337 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3338 len(MSG), 10240)
3339 self.assertEqual(msg, MSG)
3340 self.checkRecvmsgAddress(addr, self.cli_addr)
3341 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3342 self.assertLessEqual(len(ancdata), 1)
3343 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3344 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3345 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3346 self.assertLess(len(cmsg_data), SIZEOF_INT)
3347
3348 def _testFDPassPartialInt(self):
3349 self.sendAncillaryIfPossible(
3350 MSG,
3351 [(socket.SOL_SOCKET,
3352 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003353 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003354
3355 @requireAttrs(socket, "CMSG_SPACE")
3356 def testFDPassPartialIntInMiddle(self):
3357 # Try to pass two FD arrays, the first of which is truncated.
3358 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3359 len(MSG), 10240)
3360 self.assertEqual(msg, MSG)
3361 self.checkRecvmsgAddress(addr, self.cli_addr)
3362 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3363 self.assertLessEqual(len(ancdata), 2)
3364 fds = array.array("i")
3365 # Arrays may have been combined in a single control message
3366 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3367 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3368 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003369 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003370 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3371 self.assertLessEqual(len(fds), 2)
3372 self.checkFDs(fds)
3373
3374 @testFDPassPartialIntInMiddle.client_skip
3375 def _testFDPassPartialIntInMiddle(self):
3376 fd0, fd1 = self.newFDs(2)
3377 self.sendAncillaryIfPossible(
3378 MSG,
3379 [(socket.SOL_SOCKET,
3380 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003381 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003382 (socket.SOL_SOCKET,
3383 socket.SCM_RIGHTS,
3384 array.array("i", [fd1]))])
3385
3386 def checkTruncatedHeader(self, result, ignoreflags=0):
3387 # Check that no ancillary data items are returned when data is
3388 # truncated inside the cmsghdr structure.
3389 msg, ancdata, flags, addr = result
3390 self.assertEqual(msg, MSG)
3391 self.checkRecvmsgAddress(addr, self.cli_addr)
3392 self.assertEqual(ancdata, [])
3393 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3394 ignore=ignoreflags)
3395
3396 def testCmsgTruncNoBufSize(self):
3397 # Check that no ancillary data is received when no buffer size
3398 # is specified.
3399 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3400 # BSD seems to set MSG_CTRUNC only
3401 # if an item has been partially
3402 # received.
3403 ignoreflags=socket.MSG_CTRUNC)
3404
3405 def _testCmsgTruncNoBufSize(self):
3406 self.createAndSendFDs(1)
3407
3408 def testCmsgTrunc0(self):
3409 # Check that no ancillary data is received when buffer size is 0.
3410 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3411 ignoreflags=socket.MSG_CTRUNC)
3412
3413 def _testCmsgTrunc0(self):
3414 self.createAndSendFDs(1)
3415
3416 # Check that no ancillary data is returned for various non-zero
3417 # (but still too small) buffer sizes.
3418
3419 def testCmsgTrunc1(self):
3420 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3421
3422 def _testCmsgTrunc1(self):
3423 self.createAndSendFDs(1)
3424
3425 def testCmsgTrunc2Int(self):
3426 # The cmsghdr structure has at least three members, two of
3427 # which are ints, so we still shouldn't see any ancillary
3428 # data.
3429 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3430 SIZEOF_INT * 2))
3431
3432 def _testCmsgTrunc2Int(self):
3433 self.createAndSendFDs(1)
3434
3435 def testCmsgTruncLen0Minus1(self):
3436 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3437 socket.CMSG_LEN(0) - 1))
3438
3439 def _testCmsgTruncLen0Minus1(self):
3440 self.createAndSendFDs(1)
3441
3442 # The following tests try to truncate the control message in the
3443 # middle of the FD array.
3444
3445 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3446 # Check that file descriptor data is truncated to between
3447 # mindata and maxdata bytes when received with buffer size
3448 # ancbuf, and that any complete file descriptor numbers are
3449 # valid.
3450 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3451 len(MSG), ancbuf)
3452 self.assertEqual(msg, MSG)
3453 self.checkRecvmsgAddress(addr, self.cli_addr)
3454 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3455
3456 if mindata == 0 and ancdata == []:
3457 return
3458 self.assertEqual(len(ancdata), 1)
3459 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3460 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3461 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3462 self.assertGreaterEqual(len(cmsg_data), mindata)
3463 self.assertLessEqual(len(cmsg_data), maxdata)
3464 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003465 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003466 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3467 self.checkFDs(fds)
3468
3469 def testCmsgTruncLen0(self):
3470 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3471
3472 def _testCmsgTruncLen0(self):
3473 self.createAndSendFDs(1)
3474
3475 def testCmsgTruncLen0Plus1(self):
3476 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3477
3478 def _testCmsgTruncLen0Plus1(self):
3479 self.createAndSendFDs(2)
3480
3481 def testCmsgTruncLen1(self):
3482 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3483 maxdata=SIZEOF_INT)
3484
3485 def _testCmsgTruncLen1(self):
3486 self.createAndSendFDs(2)
3487
3488 def testCmsgTruncLen2Minus1(self):
3489 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3490 maxdata=(2 * SIZEOF_INT) - 1)
3491
3492 def _testCmsgTruncLen2Minus1(self):
3493 self.createAndSendFDs(2)
3494
3495
3496class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3497 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3498 # features of the RFC 3542 Advanced Sockets API for IPv6.
3499 # Currently we can only handle certain data items (e.g. traffic
3500 # class, hop limit, MTU discovery and fragmentation settings)
3501 # without resorting to unportable means such as the struct module,
3502 # but the tests here are aimed at testing the ancillary data
3503 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3504 # itself.
3505
3506 # Test value to use when setting hop limit of packet
3507 hop_limit = 2
3508
3509 # Test value to use when setting traffic class of packet.
3510 # -1 means "use kernel default".
3511 traffic_class = -1
3512
3513 def ancillaryMapping(self, ancdata):
3514 # Given ancillary data list ancdata, return a mapping from
3515 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3516 # Check that no (level, type) pair appears more than once.
3517 d = {}
3518 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3519 self.assertNotIn((cmsg_level, cmsg_type), d)
3520 d[(cmsg_level, cmsg_type)] = cmsg_data
3521 return d
3522
3523 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3524 # Receive hop limit into ancbufsize bytes of ancillary data
3525 # space. Check that data is MSG, ancillary data is not
3526 # truncated (but ignore any flags in ignoreflags), and hop
3527 # limit is between 0 and maxhop inclusive.
3528 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3529 socket.IPV6_RECVHOPLIMIT, 1)
3530 self.misc_event.set()
3531 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3532 len(MSG), ancbufsize)
3533
3534 self.assertEqual(msg, MSG)
3535 self.checkRecvmsgAddress(addr, self.cli_addr)
3536 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3537 ignore=ignoreflags)
3538
3539 self.assertEqual(len(ancdata), 1)
3540 self.assertIsInstance(ancdata[0], tuple)
3541 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3542 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3543 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3544 self.assertIsInstance(cmsg_data, bytes)
3545 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3546 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003547 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003548 self.assertGreaterEqual(a[0], 0)
3549 self.assertLessEqual(a[0], maxhop)
3550
3551 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3552 def testRecvHopLimit(self):
3553 # Test receiving the packet hop limit as ancillary data.
3554 self.checkHopLimit(ancbufsize=10240)
3555
3556 @testRecvHopLimit.client_skip
3557 def _testRecvHopLimit(self):
3558 # Need to wait until server has asked to receive ancillary
3559 # data, as implementations are not required to buffer it
3560 # otherwise.
3561 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3562 self.sendToServer(MSG)
3563
3564 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3565 def testRecvHopLimitCMSG_SPACE(self):
3566 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3567 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3568
3569 @testRecvHopLimitCMSG_SPACE.client_skip
3570 def _testRecvHopLimitCMSG_SPACE(self):
3571 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3572 self.sendToServer(MSG)
3573
3574 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3575 # 3542 says portable applications must provide space for trailing
3576 # padding. Implementations may set MSG_CTRUNC if there isn't
3577 # enough space for the padding.
3578
3579 @requireAttrs(socket.socket, "sendmsg")
3580 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3581 def testSetHopLimit(self):
3582 # Test setting hop limit on outgoing packet and receiving it
3583 # at the other end.
3584 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3585
3586 @testSetHopLimit.client_skip
3587 def _testSetHopLimit(self):
3588 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3589 self.assertEqual(
3590 self.sendmsgToServer([MSG],
3591 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3592 array.array("i", [self.hop_limit]))]),
3593 len(MSG))
3594
3595 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3596 ignoreflags=0):
3597 # Receive traffic class and hop limit into ancbufsize bytes of
3598 # ancillary data space. Check that data is MSG, ancillary
3599 # data is not truncated (but ignore any flags in ignoreflags),
3600 # and traffic class and hop limit are in range (hop limit no
3601 # more than maxhop).
3602 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3603 socket.IPV6_RECVHOPLIMIT, 1)
3604 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3605 socket.IPV6_RECVTCLASS, 1)
3606 self.misc_event.set()
3607 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3608 len(MSG), ancbufsize)
3609
3610 self.assertEqual(msg, MSG)
3611 self.checkRecvmsgAddress(addr, self.cli_addr)
3612 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3613 ignore=ignoreflags)
3614 self.assertEqual(len(ancdata), 2)
3615 ancmap = self.ancillaryMapping(ancdata)
3616
3617 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3618 self.assertEqual(len(tcdata), SIZEOF_INT)
3619 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003620 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003621 self.assertGreaterEqual(a[0], 0)
3622 self.assertLessEqual(a[0], 255)
3623
3624 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3625 self.assertEqual(len(hldata), SIZEOF_INT)
3626 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003627 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003628 self.assertGreaterEqual(a[0], 0)
3629 self.assertLessEqual(a[0], maxhop)
3630
3631 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3632 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3633 def testRecvTrafficClassAndHopLimit(self):
3634 # Test receiving traffic class and hop limit as ancillary data.
3635 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3636
3637 @testRecvTrafficClassAndHopLimit.client_skip
3638 def _testRecvTrafficClassAndHopLimit(self):
3639 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3640 self.sendToServer(MSG)
3641
3642 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3643 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3644 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3645 # Test receiving traffic class and hop limit, using
3646 # CMSG_SPACE() to calculate buffer size.
3647 self.checkTrafficClassAndHopLimit(
3648 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3649
3650 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3651 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3652 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3653 self.sendToServer(MSG)
3654
3655 @requireAttrs(socket.socket, "sendmsg")
3656 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3657 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3658 def testSetTrafficClassAndHopLimit(self):
3659 # Test setting traffic class and hop limit on outgoing packet,
3660 # and receiving them at the other end.
3661 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3662 maxhop=self.hop_limit)
3663
3664 @testSetTrafficClassAndHopLimit.client_skip
3665 def _testSetTrafficClassAndHopLimit(self):
3666 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3667 self.assertEqual(
3668 self.sendmsgToServer([MSG],
3669 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3670 array.array("i", [self.traffic_class])),
3671 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3672 array.array("i", [self.hop_limit]))]),
3673 len(MSG))
3674
3675 @requireAttrs(socket.socket, "sendmsg")
3676 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3677 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3678 def testOddCmsgSize(self):
3679 # Try to send ancillary data with first item one byte too
3680 # long. Fall back to sending with correct size if this fails,
3681 # and check that second item was handled correctly.
3682 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3683 maxhop=self.hop_limit)
3684
3685 @testOddCmsgSize.client_skip
3686 def _testOddCmsgSize(self):
3687 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3688 try:
3689 nbytes = self.sendmsgToServer(
3690 [MSG],
3691 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003692 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003693 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3694 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003695 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003696 self.assertIsInstance(e.errno, int)
3697 nbytes = self.sendmsgToServer(
3698 [MSG],
3699 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3700 array.array("i", [self.traffic_class])),
3701 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3702 array.array("i", [self.hop_limit]))])
3703 self.assertEqual(nbytes, len(MSG))
3704
3705 # Tests for proper handling of truncated ancillary data
3706
3707 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3708 # Receive hop limit into ancbufsize bytes of ancillary data
3709 # space, which should be too small to contain the ancillary
3710 # data header (if ancbufsize is None, pass no second argument
3711 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3712 # (unless included in ignoreflags), and no ancillary data is
3713 # returned.
3714 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3715 socket.IPV6_RECVHOPLIMIT, 1)
3716 self.misc_event.set()
3717 args = () if ancbufsize is None else (ancbufsize,)
3718 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3719 len(MSG), *args)
3720
3721 self.assertEqual(msg, MSG)
3722 self.checkRecvmsgAddress(addr, self.cli_addr)
3723 self.assertEqual(ancdata, [])
3724 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3725 ignore=ignoreflags)
3726
3727 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3728 def testCmsgTruncNoBufSize(self):
3729 # Check that no ancillary data is received when no ancillary
3730 # buffer size is provided.
3731 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3732 # BSD seems to set
3733 # MSG_CTRUNC only if an item
3734 # has been partially
3735 # received.
3736 ignoreflags=socket.MSG_CTRUNC)
3737
3738 @testCmsgTruncNoBufSize.client_skip
3739 def _testCmsgTruncNoBufSize(self):
3740 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3741 self.sendToServer(MSG)
3742
3743 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3744 def testSingleCmsgTrunc0(self):
3745 # Check that no ancillary data is received when ancillary
3746 # buffer size is zero.
3747 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3748 ignoreflags=socket.MSG_CTRUNC)
3749
3750 @testSingleCmsgTrunc0.client_skip
3751 def _testSingleCmsgTrunc0(self):
3752 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3753 self.sendToServer(MSG)
3754
3755 # Check that no ancillary data is returned for various non-zero
3756 # (but still too small) buffer sizes.
3757
3758 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3759 def testSingleCmsgTrunc1(self):
3760 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3761
3762 @testSingleCmsgTrunc1.client_skip
3763 def _testSingleCmsgTrunc1(self):
3764 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3765 self.sendToServer(MSG)
3766
3767 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3768 def testSingleCmsgTrunc2Int(self):
3769 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3770
3771 @testSingleCmsgTrunc2Int.client_skip
3772 def _testSingleCmsgTrunc2Int(self):
3773 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3774 self.sendToServer(MSG)
3775
3776 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3777 def testSingleCmsgTruncLen0Minus1(self):
3778 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3779
3780 @testSingleCmsgTruncLen0Minus1.client_skip
3781 def _testSingleCmsgTruncLen0Minus1(self):
3782 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3783 self.sendToServer(MSG)
3784
3785 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3786 def testSingleCmsgTruncInData(self):
3787 # Test truncation of a control message inside its associated
3788 # data. The message may be returned with its data truncated,
3789 # or not returned at all.
3790 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3791 socket.IPV6_RECVHOPLIMIT, 1)
3792 self.misc_event.set()
3793 msg, ancdata, flags, addr = self.doRecvmsg(
3794 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3795
3796 self.assertEqual(msg, MSG)
3797 self.checkRecvmsgAddress(addr, self.cli_addr)
3798 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3799
3800 self.assertLessEqual(len(ancdata), 1)
3801 if ancdata:
3802 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3803 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3804 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3805 self.assertLess(len(cmsg_data), SIZEOF_INT)
3806
3807 @testSingleCmsgTruncInData.client_skip
3808 def _testSingleCmsgTruncInData(self):
3809 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3810 self.sendToServer(MSG)
3811
3812 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3813 # Receive traffic class and hop limit into ancbufsize bytes of
3814 # ancillary data space, which should be large enough to
3815 # contain the first item, but too small to contain the header
3816 # of the second. Check that data is MSG, MSG_CTRUNC is set
3817 # (unless included in ignoreflags), and only one ancillary
3818 # data item is returned.
3819 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3820 socket.IPV6_RECVHOPLIMIT, 1)
3821 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3822 socket.IPV6_RECVTCLASS, 1)
3823 self.misc_event.set()
3824 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3825 len(MSG), ancbufsize)
3826
3827 self.assertEqual(msg, MSG)
3828 self.checkRecvmsgAddress(addr, self.cli_addr)
3829 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3830 ignore=ignoreflags)
3831
3832 self.assertEqual(len(ancdata), 1)
3833 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3834 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3835 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3836 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3837 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003838 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003839 self.assertGreaterEqual(a[0], 0)
3840 self.assertLessEqual(a[0], 255)
3841
3842 # Try the above test with various buffer sizes.
3843
3844 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3845 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3846 def testSecondCmsgTrunc0(self):
3847 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3848 ignoreflags=socket.MSG_CTRUNC)
3849
3850 @testSecondCmsgTrunc0.client_skip
3851 def _testSecondCmsgTrunc0(self):
3852 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3853 self.sendToServer(MSG)
3854
3855 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3856 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3857 def testSecondCmsgTrunc1(self):
3858 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3859
3860 @testSecondCmsgTrunc1.client_skip
3861 def _testSecondCmsgTrunc1(self):
3862 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3863 self.sendToServer(MSG)
3864
3865 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3866 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3867 def testSecondCmsgTrunc2Int(self):
3868 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3869 2 * SIZEOF_INT)
3870
3871 @testSecondCmsgTrunc2Int.client_skip
3872 def _testSecondCmsgTrunc2Int(self):
3873 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3874 self.sendToServer(MSG)
3875
3876 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3877 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3878 def testSecondCmsgTruncLen0Minus1(self):
3879 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3880 socket.CMSG_LEN(0) - 1)
3881
3882 @testSecondCmsgTruncLen0Minus1.client_skip
3883 def _testSecondCmsgTruncLen0Minus1(self):
3884 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3885 self.sendToServer(MSG)
3886
3887 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3888 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3889 def testSecomdCmsgTruncInData(self):
3890 # Test truncation of the second of two control messages inside
3891 # its associated data.
3892 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3893 socket.IPV6_RECVHOPLIMIT, 1)
3894 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3895 socket.IPV6_RECVTCLASS, 1)
3896 self.misc_event.set()
3897 msg, ancdata, flags, addr = self.doRecvmsg(
3898 self.serv_sock, len(MSG),
3899 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3900
3901 self.assertEqual(msg, MSG)
3902 self.checkRecvmsgAddress(addr, self.cli_addr)
3903 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3904
3905 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3906
3907 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3908 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3909 cmsg_types.remove(cmsg_type)
3910 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3911 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003912 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003913 self.assertGreaterEqual(a[0], 0)
3914 self.assertLessEqual(a[0], 255)
3915
3916 if ancdata:
3917 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3918 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3919 cmsg_types.remove(cmsg_type)
3920 self.assertLess(len(cmsg_data), SIZEOF_INT)
3921
3922 self.assertEqual(ancdata, [])
3923
3924 @testSecomdCmsgTruncInData.client_skip
3925 def _testSecomdCmsgTruncInData(self):
3926 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3927 self.sendToServer(MSG)
3928
3929
3930# Derive concrete test classes for different socket types.
3931
3932class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3933 SendrecvmsgConnectionlessBase,
3934 ThreadedSocketTestMixin, UDPTestBase):
3935 pass
3936
3937@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003938class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3939 pass
3940
3941@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003942class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3943 pass
3944
3945@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003946class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3947 pass
3948
3949
3950class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3951 SendrecvmsgConnectionlessBase,
3952 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003953
3954 def checkRecvmsgAddress(self, addr1, addr2):
3955 # Called to compare the received address with the address of
3956 # the peer, ignoring scope ID
3957 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003958
3959@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003960@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003961@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003962class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3963 pass
3964
3965@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003966@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003967@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003968class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3969 pass
3970
3971@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003972@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003973@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3975 pass
3976
3977@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003978@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003979@requireAttrs(socket, "IPPROTO_IPV6")
3980@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003981class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3982 SendrecvmsgUDP6TestBase):
3983 pass
3984
3985@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003986@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003987@requireAttrs(socket, "IPPROTO_IPV6")
3988@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003989class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3990 RFC3542AncillaryTest,
3991 SendrecvmsgUDP6TestBase):
3992 pass
3993
3994
3995class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3996 ConnectedStreamTestMixin, TCPTestBase):
3997 pass
3998
3999@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004000class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
4001 pass
4002
4003@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004004class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
4005 SendrecvmsgTCPTestBase):
4006 pass
4007
4008@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004009class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4010 SendrecvmsgTCPTestBase):
4011 pass
4012
4013
4014class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
4015 SendrecvmsgConnectedBase,
4016 ConnectedStreamTestMixin, SCTPStreamBase):
4017 pass
4018
4019@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004020@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004021@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004022class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4023 pass
4024
4025@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004026@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004027@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004028class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4029 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004030
4031 def testRecvmsgEOF(self):
4032 try:
4033 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4034 except OSError as e:
4035 if e.errno != errno.ENOTCONN:
4036 raise
4037 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004038
4039@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004040@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004041@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004042class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4043 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004044
4045 def testRecvmsgEOF(self):
4046 try:
4047 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4048 except OSError as e:
4049 if e.errno != errno.ENOTCONN:
4050 raise
4051 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004052
4053
4054class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4055 ConnectedStreamTestMixin, UnixStreamBase):
4056 pass
4057
4058@requireAttrs(socket.socket, "sendmsg")
4059@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004060class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4061 pass
4062
4063@requireAttrs(socket.socket, "recvmsg")
4064@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004065class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4066 SendrecvmsgUnixStreamTestBase):
4067 pass
4068
4069@requireAttrs(socket.socket, "recvmsg_into")
4070@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004071class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4072 SendrecvmsgUnixStreamTestBase):
4073 pass
4074
4075@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4076@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004077class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4078 pass
4079
4080@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4081@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004082class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4083 SendrecvmsgUnixStreamTestBase):
4084 pass
4085
4086
4087# Test interrupting the interruptible send/receive methods with a
4088# signal when a timeout is set. These tests avoid having multiple
4089# threads alive during the test so that the OS cannot deliver the
4090# signal to the wrong one.
4091
4092class InterruptedTimeoutBase(unittest.TestCase):
4093 # Base class for interrupted send/receive tests. Installs an
4094 # empty handler for SIGALRM and removes it on teardown, along with
4095 # any scheduled alarms.
4096
4097 def setUp(self):
4098 super().setUp()
4099 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004100 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004101 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102
4103 # Timeout for socket operations
4104 timeout = 4.0
4105
4106 # Provide setAlarm() method to schedule delivery of SIGALRM after
4107 # given number of seconds, or cancel it if zero, and an
4108 # appropriate time value to use. Use setitimer() if available.
4109 if hasattr(signal, "setitimer"):
4110 alarm_time = 0.05
4111
4112 def setAlarm(self, seconds):
4113 signal.setitimer(signal.ITIMER_REAL, seconds)
4114 else:
4115 # Old systems may deliver the alarm up to one second early
4116 alarm_time = 2
4117
4118 def setAlarm(self, seconds):
4119 signal.alarm(seconds)
4120
4121
4122# Require siginterrupt() in order to ensure that system calls are
4123# interrupted by default.
4124@requireAttrs(signal, "siginterrupt")
4125@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4126 "Don't have signal.alarm or signal.setitimer")
4127class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4128 # Test interrupting the recv*() methods with signals when a
4129 # timeout is set.
4130
4131 def setUp(self):
4132 super().setUp()
4133 self.serv.settimeout(self.timeout)
4134
4135 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004136 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004137 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004138 try:
4139 self.setAlarm(self.alarm_time)
4140 with self.assertRaises(ZeroDivisionError) as cm:
4141 func(*args, **kwargs)
4142 finally:
4143 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004144
4145 def testInterruptedRecvTimeout(self):
4146 self.checkInterruptedRecv(self.serv.recv, 1024)
4147
4148 def testInterruptedRecvIntoTimeout(self):
4149 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4150
4151 def testInterruptedRecvfromTimeout(self):
4152 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4153
4154 def testInterruptedRecvfromIntoTimeout(self):
4155 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4156
4157 @requireAttrs(socket.socket, "recvmsg")
4158 def testInterruptedRecvmsgTimeout(self):
4159 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4160
4161 @requireAttrs(socket.socket, "recvmsg_into")
4162 def testInterruptedRecvmsgIntoTimeout(self):
4163 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4164
4165
4166# Require siginterrupt() in order to ensure that system calls are
4167# interrupted by default.
4168@requireAttrs(signal, "siginterrupt")
4169@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4170 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004171class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4172 ThreadSafeCleanupTestCase,
4173 SocketListeningTestMixin, TCPTestBase):
4174 # Test interrupting the interruptible send*() methods with signals
4175 # when a timeout is set.
4176
4177 def setUp(self):
4178 super().setUp()
4179 self.serv_conn = self.newSocket()
4180 self.addCleanup(self.serv_conn.close)
4181 # Use a thread to complete the connection, but wait for it to
4182 # terminate before running the test, so that there is only one
4183 # thread to accept the signal.
4184 cli_thread = threading.Thread(target=self.doConnect)
4185 cli_thread.start()
4186 self.cli_conn, addr = self.serv.accept()
4187 self.addCleanup(self.cli_conn.close)
4188 cli_thread.join()
4189 self.serv_conn.settimeout(self.timeout)
4190
4191 def doConnect(self):
4192 self.serv_conn.connect(self.serv_addr)
4193
4194 def checkInterruptedSend(self, func, *args, **kwargs):
4195 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004196 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004197 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004198 try:
4199 with self.assertRaises(ZeroDivisionError) as cm:
4200 while True:
4201 self.setAlarm(self.alarm_time)
4202 func(*args, **kwargs)
4203 finally:
4204 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004205
Ned Deilyc5640382014-02-03 13:58:31 -08004206 # Issue #12958: The following tests have problems on OS X prior to 10.7
4207 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004208 def testInterruptedSendTimeout(self):
4209 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4210
Ned Deilyc5640382014-02-03 13:58:31 -08004211 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004212 def testInterruptedSendtoTimeout(self):
4213 # Passing an actual address here as Python's wrapper for
4214 # sendto() doesn't allow passing a zero-length one; POSIX
4215 # requires that the address is ignored since the socket is
4216 # connection-mode, however.
4217 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4218 self.serv_addr)
4219
Ned Deilyc5640382014-02-03 13:58:31 -08004220 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221 @requireAttrs(socket.socket, "sendmsg")
4222 def testInterruptedSendmsgTimeout(self):
4223 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4224
4225
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004226class TCPCloserTest(ThreadedTCPSocketTest):
4227
4228 def testClose(self):
4229 conn, addr = self.serv.accept()
4230 conn.close()
4231
4232 sd = self.cli
4233 read, write, err = select.select([sd], [], [], 1.0)
4234 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004235 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004236
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004237 # Calling close() many times should be safe.
4238 conn.close()
4239 conn.close()
4240
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004241 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004242 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004243 time.sleep(1.0)
4244
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004245
Dave Cole331708b2004-08-09 04:51:41 +00004246class BasicSocketPairTest(SocketPairTest):
4247
4248 def __init__(self, methodName='runTest'):
4249 SocketPairTest.__init__(self, methodName=methodName)
4250
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004251 def _check_defaults(self, sock):
4252 self.assertIsInstance(sock, socket.socket)
4253 if hasattr(socket, 'AF_UNIX'):
4254 self.assertEqual(sock.family, socket.AF_UNIX)
4255 else:
4256 self.assertEqual(sock.family, socket.AF_INET)
4257 self.assertEqual(sock.type, socket.SOCK_STREAM)
4258 self.assertEqual(sock.proto, 0)
4259
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004260 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004261 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004262
4263 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004264 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004265
Dave Cole331708b2004-08-09 04:51:41 +00004266 def testRecv(self):
4267 msg = self.serv.recv(1024)
4268 self.assertEqual(msg, MSG)
4269
4270 def _testRecv(self):
4271 self.cli.send(MSG)
4272
4273 def testSend(self):
4274 self.serv.send(MSG)
4275
4276 def _testSend(self):
4277 msg = self.cli.recv(1024)
4278 self.assertEqual(msg, MSG)
4279
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004280
Guido van Rossum24e4af82002-06-12 19:18:08 +00004281class NonBlockingTCPTests(ThreadedTCPSocketTest):
4282
4283 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004284 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004285 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4286
Victor Stinner304315d2018-11-30 13:22:44 +01004287 def assert_sock_timeout(self, sock, timeout):
4288 self.assertEqual(self.serv.gettimeout(), timeout)
4289
4290 blocking = (timeout != 0.0)
4291 self.assertEqual(sock.getblocking(), blocking)
4292
4293 if fcntl is not None:
4294 # When a Python socket has a non-zero timeout, it's switched
4295 # internally to a non-blocking mode. Later, sock.sendall(),
4296 # sock.recv(), and other socket operations use a select() call and
4297 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4298 # timeouts are enforced.
4299 fd_blocking = (timeout is None)
4300
4301 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4302 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4303
Guido van Rossum24e4af82002-06-12 19:18:08 +00004304 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004305 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004306 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004307 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004308
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004309 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004310 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004311
4312 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004313 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004314
4315 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004316 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004317
4318 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004319 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004320
4321 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004322 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004323
4324 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004325 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004326
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004327 @support.cpython_only
4328 def testSetBlocking_overflow(self):
4329 # Issue 15989
4330 import _testcapi
4331 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4332 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004333
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004334 self.serv.setblocking(False)
4335 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004336
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004337 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4338 self.assertIsNone(self.serv.gettimeout())
4339
4340 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4341
Serhiy Storchaka43767632013-11-03 21:31:38 +02004342 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4343 'test needs socket.SOCK_NONBLOCK')
4344 @support.requires_linux_version(2, 6, 28)
4345 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004346 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004347 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004348 self.serv = socket.socket(socket.AF_INET,
4349 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4350 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004351
4352 def _testInitNonBlocking(self):
4353 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004354
Victor Stinner304315d2018-11-30 13:22:44 +01004355 def testInheritFlagsBlocking(self):
4356 # bpo-7995: accept() on a listening socket with a timeout and the
4357 # default timeout is None, the resulting socket must be blocking.
4358 with socket_setdefaulttimeout(None):
4359 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004360 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004361 self.addCleanup(conn.close)
4362 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004363
Victor Stinner304315d2018-11-30 13:22:44 +01004364 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004365 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004366
4367 def testInheritFlagsTimeout(self):
4368 # bpo-7995: accept() on a listening socket with a timeout and the
4369 # default timeout is None, the resulting socket must inherit
4370 # the default timeout.
4371 default_timeout = 20.0
4372 with socket_setdefaulttimeout(default_timeout):
4373 self.serv.settimeout(10)
4374 conn, addr = self.serv.accept()
4375 self.addCleanup(conn.close)
4376 self.assertEqual(conn.gettimeout(), default_timeout)
4377
4378 def _testInheritFlagsTimeout(self):
4379 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004380
Guido van Rossum24e4af82002-06-12 19:18:08 +00004381 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004382 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004383 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004384
4385 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004386 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004387 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004388 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004389 dt = time.monotonic() - start_time
4390 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004391
4392 self.event.set()
4393
4394 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4395 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004396 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004397
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004398 # connect() completed: non-blocking accept() doesn't block
4399 conn, addr = self.serv.accept()
4400 self.addCleanup(conn.close)
4401 self.assertIsNone(conn.gettimeout())
4402
Guido van Rossum24e4af82002-06-12 19:18:08 +00004403 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004404 # don't connect before event is set to check
4405 # that non-blocking accept() raises BlockingIOError
4406 self.event.wait()
4407
Christian Heimes5e696852008-04-09 08:37:03 +00004408 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004409
Guido van Rossum24e4af82002-06-12 19:18:08 +00004410 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004411 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004412 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004413 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004414 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004415
4416 # the server didn't send data yet: non-blocking recv() fails
4417 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004418 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004419
4420 self.event.set()
4421
4422 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4423 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004424 self.fail("Error during select call to non-blocking socket.")
4425
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004426 # the server sent data yet: non-blocking recv() doesn't block
4427 msg = conn.recv(len(MSG))
4428 self.assertEqual(msg, MSG)
4429
Guido van Rossum24e4af82002-06-12 19:18:08 +00004430 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004431 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004432
4433 # don't send anything before event is set to check
4434 # that non-blocking recv() raises BlockingIOError
4435 self.event.wait()
4436
4437 # send data: recv() will no longer block
4438 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004439
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004440
Guido van Rossum24e4af82002-06-12 19:18:08 +00004441class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004442 """Unit tests for the object returned by socket.makefile()
4443
Antoine Pitrou834bd812010-10-13 16:17:14 +00004444 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004445 the client connection. You can read from this file to
4446 get output from the server.
4447
Antoine Pitrou834bd812010-10-13 16:17:14 +00004448 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004449 server connection. You can write to this file to send output
4450 to the client.
4451 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004452
Guido van Rossume9f66142002-08-07 15:46:19 +00004453 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004454 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004455 errors = 'strict'
4456 newline = None
4457
4458 read_mode = 'rb'
4459 read_msg = MSG
4460 write_mode = 'wb'
4461 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004462
Guido van Rossum24e4af82002-06-12 19:18:08 +00004463 def __init__(self, methodName='runTest'):
4464 SocketConnectedTest.__init__(self, methodName=methodName)
4465
4466 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004467 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4468 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004469 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004470 self.read_file = self.cli_conn.makefile(
4471 self.read_mode, self.bufsize,
4472 encoding = self.encoding,
4473 errors = self.errors,
4474 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004475
4476 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004477 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004478 self.read_file.close()
4479 self.assertTrue(self.read_file.closed)
4480 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004481 SocketConnectedTest.tearDown(self)
4482
4483 def clientSetUp(self):
4484 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004485 self.write_file = self.serv_conn.makefile(
4486 self.write_mode, self.bufsize,
4487 encoding = self.encoding,
4488 errors = self.errors,
4489 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004490
4491 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004492 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004493 self.write_file.close()
4494 self.assertTrue(self.write_file.closed)
4495 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004496 SocketConnectedTest.clientTearDown(self)
4497
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004498 def testReadAfterTimeout(self):
4499 # Issue #7322: A file object must disallow further reads
4500 # after a timeout has occurred.
4501 self.cli_conn.settimeout(1)
4502 self.read_file.read(3)
4503 # First read raises a timeout
4504 self.assertRaises(socket.timeout, self.read_file.read, 1)
4505 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004506 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004507 self.read_file.read(1)
4508 self.assertIn("cannot read from timed out object", str(ctx.exception))
4509
4510 def _testReadAfterTimeout(self):
4511 self.write_file.write(self.write_msg[0:3])
4512 self.write_file.flush()
4513 self.serv_finished.wait()
4514
Guido van Rossum24e4af82002-06-12 19:18:08 +00004515 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004516 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004517 first_seg = self.read_file.read(len(self.read_msg)-3)
4518 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004519 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004520 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004521
4522 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004523 self.write_file.write(self.write_msg)
4524 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004525
Guido van Rossum8c943832002-08-08 01:00:28 +00004526 def testFullRead(self):
4527 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004528 msg = self.read_file.read()
4529 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004530
4531 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004532 self.write_file.write(self.write_msg)
4533 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004534
Guido van Rossum24e4af82002-06-12 19:18:08 +00004535 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004536 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004537 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004538 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004539 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004540 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004541 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004542 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004543 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004544
4545 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004546 self.write_file.write(self.write_msg)
4547 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004548
4549 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004550 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004551 line = self.read_file.readline()
4552 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004553
4554 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004555 self.write_file.write(self.write_msg)
4556 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004557
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004558 def testCloseAfterMakefile(self):
4559 # The file returned by makefile should keep the socket open.
4560 self.cli_conn.close()
4561 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004562 msg = self.read_file.read()
4563 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004564
4565 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004566 self.write_file.write(self.write_msg)
4567 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004568
4569 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004570 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004571 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004572 if isinstance(self.read_msg, str):
4573 msg = msg.decode()
4574 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004575
4576 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004577 self.write_file.write(self.write_msg)
4578 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004579
Tim Peters116d83c2004-03-28 02:20:45 +00004580 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004581 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004582
4583 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004584 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004585
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004586 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004587 self.assertEqual(self.read_file.mode, self.read_mode)
4588 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004589
4590 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004591 self.assertEqual(self.write_file.mode, self.write_mode)
4592 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004593
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004594 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004595 self.read_file.close()
4596 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004597 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004598 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004599
4600 def _testRealClose(self):
4601 pass
4602
4603
Guido van Rossume9f66142002-08-07 15:46:19 +00004604class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4605
4606 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004607
Guido van Rossume9f66142002-08-07 15:46:19 +00004608 In this case (and in this case only), it should be possible to
4609 create a file object, read a line from it, create another file
4610 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004611 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004612 when reading multiple requests from the same socket."""
4613
4614 bufsize = 0 # Use unbuffered mode
4615
4616 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004617 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004618 line = self.read_file.readline() # first line
4619 self.assertEqual(line, b"A. " + self.write_msg) # first line
4620 self.read_file = self.cli_conn.makefile('rb', 0)
4621 line = self.read_file.readline() # second line
4622 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004623
4624 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004625 self.write_file.write(b"A. " + self.write_msg)
4626 self.write_file.write(b"B. " + self.write_msg)
4627 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004628
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004629 def testMakefileClose(self):
4630 # The file returned by makefile should keep the socket open...
4631 self.cli_conn.close()
4632 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004633 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004634 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004635 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004636 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004637
4638 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004639 self.write_file.write(self.write_msg)
4640 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004641
4642 def testMakefileCloseSocketDestroy(self):
4643 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004644 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004645 refcount_after = sys.getrefcount(self.cli_conn)
4646 self.assertEqual(refcount_before - 1, refcount_after)
4647
4648 def _testMakefileCloseSocketDestroy(self):
4649 pass
4650
Antoine Pitrou98b46702010-09-18 22:59:00 +00004651 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004652 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004653 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4654
4655 def testSmallReadNonBlocking(self):
4656 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004657 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4658 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004659 self.evt1.set()
4660 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004661 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004662 if first_seg is None:
4663 # Data not arrived (can happen under Windows), wait a bit
4664 time.sleep(0.5)
4665 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004666 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004667 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004668 self.assertEqual(n, 3)
4669 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004670 self.assertEqual(msg, self.read_msg)
4671 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4672 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004673
4674 def _testSmallReadNonBlocking(self):
4675 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004676 self.write_file.write(self.write_msg)
4677 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004678 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004679 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004680 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4681 self.serv_finished.wait(5.0)
4682
4683 def testWriteNonBlocking(self):
4684 self.cli_finished.wait(5.0)
4685 # The client thread can't skip directly - the SkipTest exception
4686 # would appear as a failure.
4687 if self.serv_skipped:
4688 self.skipTest(self.serv_skipped)
4689
4690 def _testWriteNonBlocking(self):
4691 self.serv_skipped = None
4692 self.serv_conn.setblocking(False)
4693 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004694 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004695 LIMIT = 10
4696 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004697 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004698 self.assertGreater(n, 0)
4699 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004700 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004701 if n is None:
4702 # Succeeded
4703 break
4704 self.assertGreater(n, 0)
4705 else:
4706 # Let us know that this test didn't manage to establish
4707 # the expected conditions. This is not a failure in itself but,
4708 # if it happens repeatedly, the test should be fixed.
4709 self.serv_skipped = "failed to saturate the socket buffer"
4710
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004711
Guido van Rossum8c943832002-08-08 01:00:28 +00004712class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4713
4714 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4715
4716
4717class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4718
4719 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004720
Thomas Woutersb2137042007-02-01 18:02:27 +00004721
Antoine Pitrou834bd812010-10-13 16:17:14 +00004722class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4723 """Tests for socket.makefile() in text mode (rather than binary)"""
4724
4725 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004726 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004727 write_mode = 'wb'
4728 write_msg = MSG
4729 newline = ''
4730
4731
4732class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4733 """Tests for socket.makefile() in text mode (rather than binary)"""
4734
4735 read_mode = 'rb'
4736 read_msg = MSG
4737 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004738 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004739 newline = ''
4740
4741
4742class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4743 """Tests for socket.makefile() in text mode (rather than binary)"""
4744
4745 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004746 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004747 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004748 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004749 newline = ''
4750
4751
Guido van Rossumd8faa362007-04-27 19:54:29 +00004752class NetworkConnectionTest(object):
4753 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004754
Guido van Rossumd8faa362007-04-27 19:54:29 +00004755 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004756 # We're inherited below by BasicTCPTest2, which also inherits
4757 # BasicTCPTest, which defines self.port referenced below.
4758 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004759 self.serv_conn = self.cli
4760
4761class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4762 """Tests that NetworkConnection does not break existing TCP functionality.
4763 """
4764
4765class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004766
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004767 class MockSocket(socket.socket):
4768 def connect(self, *args):
4769 raise socket.timeout('timed out')
4770
4771 @contextlib.contextmanager
4772 def mocked_socket_module(self):
4773 """Return a socket which times out on connect"""
4774 old_socket = socket.socket
4775 socket.socket = self.MockSocket
4776 try:
4777 yield
4778 finally:
4779 socket.socket = old_socket
4780
4781 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004782 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004783 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004784 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004785 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004786 cli.connect((HOST, port))
4787 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4788
4789 def test_create_connection(self):
4790 # Issue #9792: errors raised by create_connection() should have
4791 # a proper errno attribute.
4792 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004793 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004794 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004795
4796 # Issue #16257: create_connection() calls getaddrinfo() against
4797 # 'localhost'. This may result in an IPV6 addr being returned
4798 # as well as an IPV4 one:
4799 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4800 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4801 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4802 #
4803 # create_connection() enumerates through all the addresses returned
4804 # and if it doesn't successfully bind to any of them, it propagates
4805 # the last exception it encountered.
4806 #
4807 # On Solaris, ENETUNREACH is returned in this circumstance instead
4808 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4809 # expected errnos.
Victor Stinner3c7931e2019-04-15 12:34:53 +02004810 expected_errnos = support.get_socket_conn_refused_errs()
Trent Nelson45bb6132012-10-17 06:15:15 -04004811 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004812
4813 def test_create_connection_timeout(self):
4814 # Issue #9792: create_connection() should not recast timeout errors
4815 # as generic socket errors.
4816 with self.mocked_socket_module():
4817 with self.assertRaises(socket.timeout):
4818 socket.create_connection((HOST, 1234))
4819
Guido van Rossumd8faa362007-04-27 19:54:29 +00004820
4821class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4822
4823 def __init__(self, methodName='runTest'):
4824 SocketTCPTest.__init__(self, methodName=methodName)
4825 ThreadableTest.__init__(self)
4826
4827 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004828 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004829
4830 def clientTearDown(self):
4831 self.cli.close()
4832 self.cli = None
4833 ThreadableTest.clientTearDown(self)
4834
4835 def _justAccept(self):
4836 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004837 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004838
4839 testFamily = _justAccept
4840 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004841 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004842 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004843 self.assertEqual(self.cli.family, 2)
4844
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004845 testSourceAddress = _justAccept
4846 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004847 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4848 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004849 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004850 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004851 # The port number being used is sufficient to show that the bind()
4852 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004853
Guido van Rossumd8faa362007-04-27 19:54:29 +00004854 testTimeoutDefault = _justAccept
4855 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004856 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004857 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004858 socket.setdefaulttimeout(42)
4859 try:
4860 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004861 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004862 finally:
4863 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004864 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004865
4866 testTimeoutNone = _justAccept
4867 def _testTimeoutNone(self):
4868 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004869 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004870 socket.setdefaulttimeout(30)
4871 try:
4872 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004873 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004874 finally:
4875 socket.setdefaulttimeout(None)
4876 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004877
4878 testTimeoutValueNamed = _justAccept
4879 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004880 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004881 self.assertEqual(self.cli.gettimeout(), 30)
4882
4883 testTimeoutValueNonamed = _justAccept
4884 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004885 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004886 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004887 self.assertEqual(self.cli.gettimeout(), 30)
4888
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004889
Guido van Rossumd8faa362007-04-27 19:54:29 +00004890class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4891
4892 def __init__(self, methodName='runTest'):
4893 SocketTCPTest.__init__(self, methodName=methodName)
4894 ThreadableTest.__init__(self)
4895
4896 def clientSetUp(self):
4897 pass
4898
4899 def clientTearDown(self):
4900 self.cli.close()
4901 self.cli = None
4902 ThreadableTest.clientTearDown(self)
4903
4904 def testInsideTimeout(self):
4905 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004906 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004907 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004908 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004909 testOutsideTimeout = testInsideTimeout
4910
4911 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004912 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004913 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004914 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004915
4916 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004917 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004918 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004919
4920
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004921class TCPTimeoutTest(SocketTCPTest):
4922
4923 def testTCPTimeout(self):
4924 def raise_timeout(*args, **kwargs):
4925 self.serv.settimeout(1.0)
4926 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004927 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004928 "Error generating a timeout exception (TCP)")
4929
4930 def testTimeoutZero(self):
4931 ok = False
4932 try:
4933 self.serv.settimeout(0.0)
4934 foo = self.serv.accept()
4935 except socket.timeout:
4936 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004937 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004938 ok = True
4939 except:
4940 self.fail("caught unexpected exception (TCP)")
4941 if not ok:
4942 self.fail("accept() returned success when we did not expect it")
4943
Serhiy Storchaka43767632013-11-03 21:31:38 +02004944 @unittest.skipUnless(hasattr(signal, 'alarm'),
4945 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004946 def testInterruptedTimeout(self):
4947 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004948 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004949 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004950 self.serv.settimeout(5.0) # must be longer than alarm
4951 class Alarm(Exception):
4952 pass
4953 def alarm_handler(signal, frame):
4954 raise Alarm
4955 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4956 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004957 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004958 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004959 foo = self.serv.accept()
4960 except socket.timeout:
4961 self.fail("caught timeout instead of Alarm")
4962 except Alarm:
4963 pass
4964 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004965 self.fail("caught other exception instead of Alarm:"
4966 " %s(%s):\n%s" %
4967 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004968 else:
4969 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004970 finally:
4971 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004972 except Alarm:
4973 self.fail("got Alarm in wrong place")
4974 finally:
4975 # no alarm can be pending. Safe to restore old handler.
4976 signal.signal(signal.SIGALRM, old_alarm)
4977
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004978class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004979
4980 def testUDPTimeout(self):
4981 def raise_timeout(*args, **kwargs):
4982 self.serv.settimeout(1.0)
4983 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004984 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004985 "Error generating a timeout exception (UDP)")
4986
4987 def testTimeoutZero(self):
4988 ok = False
4989 try:
4990 self.serv.settimeout(0.0)
4991 foo = self.serv.recv(1024)
4992 except socket.timeout:
4993 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004994 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004995 ok = True
4996 except:
4997 self.fail("caught unexpected exception (UDP)")
4998 if not ok:
4999 self.fail("recv() returned success when we did not expect it")
5000
5001class TestExceptions(unittest.TestCase):
5002
5003 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02005004 self.assertTrue(issubclass(OSError, Exception))
5005 self.assertTrue(issubclass(socket.herror, OSError))
5006 self.assertTrue(issubclass(socket.gaierror, OSError))
5007 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005008
Yury Selivanovfa22b292016-10-18 16:03:52 -04005009 def test_setblocking_invalidfd(self):
5010 # Regression test for issue #28471
5011
5012 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5013 sock = socket.socket(
5014 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5015 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005016 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005017
5018 with self.assertRaises(OSError):
5019 sock.setblocking(False)
5020
5021
Serhiy Storchaka43767632013-11-03 21:31:38 +02005022@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005023class TestLinuxAbstractNamespace(unittest.TestCase):
5024
5025 UNIX_PATH_MAX = 108
5026
5027 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005028 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005029 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5030 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005031 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005032 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5033 s2.connect(s1.getsockname())
5034 with s1.accept()[0] as s3:
5035 self.assertEqual(s1.getsockname(), address)
5036 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005037
5038 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005039 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005040 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5041 s.bind(address)
5042 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005043
5044 def testNameOverflow(self):
5045 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005046 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005047 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005048
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005049 def testStrName(self):
5050 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005051 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5052 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005053 s.bind("\x00python\x00test\x00")
5054 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005055 finally:
5056 s.close()
5057
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005058 def testBytearrayName(self):
5059 # Check that an abstract name can be passed as a bytearray.
5060 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5061 s.bind(bytearray(b"\x00python\x00test\x00"))
5062 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5063
Serhiy Storchaka43767632013-11-03 21:31:38 +02005064@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005065class TestUnixDomain(unittest.TestCase):
5066
5067 def setUp(self):
5068 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5069
5070 def tearDown(self):
5071 self.sock.close()
5072
5073 def encoded(self, path):
5074 # Return the given path encoded in the file system encoding,
5075 # or skip the test if this is not possible.
5076 try:
5077 return os.fsencode(path)
5078 except UnicodeEncodeError:
5079 self.skipTest(
5080 "Pathname {0!a} cannot be represented in file "
5081 "system encoding {1!r}".format(
5082 path, sys.getfilesystemencoding()))
5083
Antoine Pitrou16374872011-12-16 15:04:12 +01005084 def bind(self, sock, path):
5085 # Bind the socket
5086 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005087 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005088 except OSError as e:
5089 if str(e) == "AF_UNIX path too long":
5090 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005091 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005092 .format(path))
5093 else:
5094 raise
5095
Antoine Pitrou495b5022017-05-02 17:20:00 +02005096 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005097 # Issue #30205 (note getsockname() can return None on OS X)
5098 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005099
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005100 def testStrAddr(self):
5101 # Test binding to and retrieving a normal string pathname.
5102 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005103 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005104 self.addCleanup(support.unlink, path)
5105 self.assertEqual(self.sock.getsockname(), path)
5106
5107 def testBytesAddr(self):
5108 # Test binding to a bytes pathname.
5109 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005110 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005111 self.addCleanup(support.unlink, path)
5112 self.assertEqual(self.sock.getsockname(), path)
5113
5114 def testSurrogateescapeBind(self):
5115 # Test binding to a valid non-ASCII pathname, with the
5116 # non-ASCII bytes supplied using surrogateescape encoding.
5117 path = os.path.abspath(support.TESTFN_UNICODE)
5118 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005119 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005120 self.addCleanup(support.unlink, path)
5121 self.assertEqual(self.sock.getsockname(), path)
5122
5123 def testUnencodableAddr(self):
5124 # Test binding to a pathname that cannot be encoded in the
5125 # file system encoding.
5126 if support.TESTFN_UNENCODABLE is None:
5127 self.skipTest("No unencodable filename available")
5128 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005129 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005130 self.addCleanup(support.unlink, path)
5131 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005132
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005133
Thomas Wouters477c8d52006-05-27 19:21:47 +00005134class BufferIOTest(SocketConnectedTest):
5135 """
5136 Test the buffer versions of socket.recv() and socket.send().
5137 """
5138 def __init__(self, methodName='runTest'):
5139 SocketConnectedTest.__init__(self, methodName=methodName)
5140
Antoine Pitrou25480782010-03-17 22:50:28 +00005141 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005142 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005143 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005144 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005145 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005146 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005147 self.assertEqual(msg, MSG)
5148
Antoine Pitrou25480782010-03-17 22:50:28 +00005149 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005150 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005151 self.serv_conn.send(buf)
5152
Antoine Pitrou25480782010-03-17 22:50:28 +00005153 def testRecvIntoBytearray(self):
5154 buf = bytearray(1024)
5155 nbytes = self.cli_conn.recv_into(buf)
5156 self.assertEqual(nbytes, len(MSG))
5157 msg = buf[:len(MSG)]
5158 self.assertEqual(msg, MSG)
5159
5160 _testRecvIntoBytearray = _testRecvIntoArray
5161
5162 def testRecvIntoMemoryview(self):
5163 buf = bytearray(1024)
5164 nbytes = self.cli_conn.recv_into(memoryview(buf))
5165 self.assertEqual(nbytes, len(MSG))
5166 msg = buf[:len(MSG)]
5167 self.assertEqual(msg, MSG)
5168
5169 _testRecvIntoMemoryview = _testRecvIntoArray
5170
5171 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005172 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005173 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005174 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005175 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005176 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005177 self.assertEqual(msg, MSG)
5178
Antoine Pitrou25480782010-03-17 22:50:28 +00005179 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005180 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005181 self.serv_conn.send(buf)
5182
Antoine Pitrou25480782010-03-17 22:50:28 +00005183 def testRecvFromIntoBytearray(self):
5184 buf = bytearray(1024)
5185 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5186 self.assertEqual(nbytes, len(MSG))
5187 msg = buf[:len(MSG)]
5188 self.assertEqual(msg, MSG)
5189
5190 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5191
5192 def testRecvFromIntoMemoryview(self):
5193 buf = bytearray(1024)
5194 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5195 self.assertEqual(nbytes, len(MSG))
5196 msg = buf[:len(MSG)]
5197 self.assertEqual(msg, MSG)
5198
5199 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5200
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005201 def testRecvFromIntoSmallBuffer(self):
5202 # See issue #20246.
5203 buf = bytearray(8)
5204 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5205
5206 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005207 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005208
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005209 def testRecvFromIntoEmptyBuffer(self):
5210 buf = bytearray()
5211 self.cli_conn.recvfrom_into(buf)
5212 self.cli_conn.recvfrom_into(buf, 0)
5213
5214 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5215
Christian Heimes043d6f62008-01-07 17:19:16 +00005216
5217TIPC_STYPE = 2000
5218TIPC_LOWER = 200
5219TIPC_UPPER = 210
5220
5221def isTipcAvailable():
5222 """Check if the TIPC module is loaded
5223
5224 The TIPC module is not loaded automatically on Ubuntu and probably
5225 other Linux distros.
5226 """
5227 if not hasattr(socket, "AF_TIPC"):
5228 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005229 try:
5230 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005231 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005232 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005233 # have not the permission to read it.
5234 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005235 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005236 for line in f:
5237 if line.startswith("tipc "):
5238 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005239 return False
5240
Serhiy Storchaka43767632013-11-03 21:31:38 +02005241@unittest.skipUnless(isTipcAvailable(),
5242 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005243class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005244 def testRDM(self):
5245 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5246 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005247 self.addCleanup(srv.close)
5248 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005249
5250 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5251 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5252 TIPC_LOWER, TIPC_UPPER)
5253 srv.bind(srvaddr)
5254
5255 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5256 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5257 cli.sendto(MSG, sendaddr)
5258
5259 msg, recvaddr = srv.recvfrom(1024)
5260
5261 self.assertEqual(cli.getsockname(), recvaddr)
5262 self.assertEqual(msg, MSG)
5263
5264
Serhiy Storchaka43767632013-11-03 21:31:38 +02005265@unittest.skipUnless(isTipcAvailable(),
5266 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005267class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005268 def __init__(self, methodName = 'runTest'):
5269 unittest.TestCase.__init__(self, methodName = methodName)
5270 ThreadableTest.__init__(self)
5271
5272 def setUp(self):
5273 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005274 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005275 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5276 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5277 TIPC_LOWER, TIPC_UPPER)
5278 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005279 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005280 self.serverExplicitReady()
5281 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005282 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005283
5284 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005285 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005286 # accept() call; sleep a little while to avoid it, otherwise
5287 # we could get an exception
5288 time.sleep(0.1)
5289 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005290 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005291 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5292 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5293 self.cli.connect(addr)
5294 self.cliaddr = self.cli.getsockname()
5295
5296 def testStream(self):
5297 msg = self.conn.recv(1024)
5298 self.assertEqual(msg, MSG)
5299 self.assertEqual(self.cliaddr, self.connaddr)
5300
5301 def _testStream(self):
5302 self.cli.send(MSG)
5303 self.cli.close()
5304
5305
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005306class ContextManagersTest(ThreadedTCPSocketTest):
5307
5308 def _testSocketClass(self):
5309 # base test
5310 with socket.socket() as sock:
5311 self.assertFalse(sock._closed)
5312 self.assertTrue(sock._closed)
5313 # close inside with block
5314 with socket.socket() as sock:
5315 sock.close()
5316 self.assertTrue(sock._closed)
5317 # exception inside with block
5318 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005319 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005320 self.assertTrue(sock._closed)
5321
5322 def testCreateConnectionBase(self):
5323 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005324 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005325 data = conn.recv(1024)
5326 conn.sendall(data)
5327
5328 def _testCreateConnectionBase(self):
5329 address = self.serv.getsockname()
5330 with socket.create_connection(address) as sock:
5331 self.assertFalse(sock._closed)
5332 sock.sendall(b'foo')
5333 self.assertEqual(sock.recv(1024), b'foo')
5334 self.assertTrue(sock._closed)
5335
5336 def testCreateConnectionClose(self):
5337 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005338 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005339 data = conn.recv(1024)
5340 conn.sendall(data)
5341
5342 def _testCreateConnectionClose(self):
5343 address = self.serv.getsockname()
5344 with socket.create_connection(address) as sock:
5345 sock.close()
5346 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005347 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005348
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005349
Victor Stinnerdaf45552013-08-28 00:53:59 +02005350class InheritanceTest(unittest.TestCase):
5351 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5352 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005353 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005354 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005355 with socket.socket(socket.AF_INET,
5356 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005357 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005358 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005359
5360 def test_default_inheritable(self):
5361 sock = socket.socket()
5362 with sock:
5363 self.assertEqual(sock.get_inheritable(), False)
5364
5365 def test_dup(self):
5366 sock = socket.socket()
5367 with sock:
5368 newsock = sock.dup()
5369 sock.close()
5370 with newsock:
5371 self.assertEqual(newsock.get_inheritable(), False)
5372
5373 def test_set_inheritable(self):
5374 sock = socket.socket()
5375 with sock:
5376 sock.set_inheritable(True)
5377 self.assertEqual(sock.get_inheritable(), True)
5378
5379 sock.set_inheritable(False)
5380 self.assertEqual(sock.get_inheritable(), False)
5381
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005382 @unittest.skipIf(fcntl is None, "need fcntl")
5383 def test_get_inheritable_cloexec(self):
5384 sock = socket.socket()
5385 with sock:
5386 fd = sock.fileno()
5387 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005388
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005389 # clear FD_CLOEXEC flag
5390 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5391 flags &= ~fcntl.FD_CLOEXEC
5392 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005393
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005394 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005395
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005396 @unittest.skipIf(fcntl is None, "need fcntl")
5397 def test_set_inheritable_cloexec(self):
5398 sock = socket.socket()
5399 with sock:
5400 fd = sock.fileno()
5401 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5402 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005403
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005404 sock.set_inheritable(True)
5405 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5406 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005407
5408
Victor Stinnerdaf45552013-08-28 00:53:59 +02005409 def test_socketpair(self):
5410 s1, s2 = socket.socketpair()
5411 self.addCleanup(s1.close)
5412 self.addCleanup(s2.close)
5413 self.assertEqual(s1.get_inheritable(), False)
5414 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005415
5416
5417@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5418 "SOCK_NONBLOCK not defined")
5419class NonblockConstantTest(unittest.TestCase):
5420 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5421 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005422 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005423 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005424 self.assertTrue(
5425 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005426 if timeout == 0:
5427 # timeout == 0: means that getblocking() must be False.
5428 self.assertFalse(s.getblocking())
5429 else:
5430 # If timeout > 0, the socket will be in a "blocking" mode
5431 # from the standpoint of the Python API. For Python socket
5432 # object, "blocking" means that operations like 'sock.recv()'
5433 # will block. Internally, file descriptors for
5434 # "blocking" Python sockets *with timeouts* are in a
5435 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5436 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5437 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005438 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005439 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005440 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005441 self.assertFalse(
5442 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005443 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005444
Charles-François Natali239bb962011-06-03 12:55:15 +02005445 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005446 def test_SOCK_NONBLOCK(self):
5447 # a lot of it seems silly and redundant, but I wanted to test that
5448 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005449 with socket.socket(socket.AF_INET,
5450 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5451 self.checkNonblock(s)
5452 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005453 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005454 s.setblocking(0)
5455 self.checkNonblock(s)
5456 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005457 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005458 s.settimeout(2.0)
5459 self.checkNonblock(s, timeout=2.0)
5460 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005461 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005462 # defaulttimeout
5463 t = socket.getdefaulttimeout()
5464 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005465 with socket.socket() as s:
5466 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005467 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005468 with socket.socket() as s:
5469 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005470 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005471 with socket.socket() as s:
5472 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005473 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005474 with socket.socket() as s:
5475 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005476 socket.setdefaulttimeout(t)
5477
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005478
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005479@unittest.skipUnless(os.name == "nt", "Windows specific")
5480@unittest.skipUnless(multiprocessing, "need multiprocessing")
5481class TestSocketSharing(SocketTCPTest):
5482 # This must be classmethod and not staticmethod or multiprocessing
5483 # won't be able to bootstrap it.
5484 @classmethod
5485 def remoteProcessServer(cls, q):
5486 # Recreate socket from shared data
5487 sdata = q.get()
5488 message = q.get()
5489
5490 s = socket.fromshare(sdata)
5491 s2, c = s.accept()
5492
5493 # Send the message
5494 s2.sendall(message)
5495 s2.close()
5496 s.close()
5497
5498 def testShare(self):
5499 # Transfer the listening server socket to another process
5500 # and service it from there.
5501
5502 # Create process:
5503 q = multiprocessing.Queue()
5504 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5505 p.start()
5506
5507 # Get the shared socket data
5508 data = self.serv.share(p.pid)
5509
5510 # Pass the shared socket to the other process
5511 addr = self.serv.getsockname()
5512 self.serv.close()
5513 q.put(data)
5514
5515 # The data that the server will send us
5516 message = b"slapmahfro"
5517 q.put(message)
5518
5519 # Connect
5520 s = socket.create_connection(addr)
5521 # listen for the data
5522 m = []
5523 while True:
5524 data = s.recv(100)
5525 if not data:
5526 break
5527 m.append(data)
5528 s.close()
5529 received = b"".join(m)
5530 self.assertEqual(received, message)
5531 p.join()
5532
5533 def testShareLength(self):
5534 data = self.serv.share(os.getpid())
5535 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5536 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5537
5538 def compareSockets(self, org, other):
5539 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005540 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005541 self.assertEqual(org.gettimeout(), None)
5542 self.assertEqual(org.gettimeout(), other.gettimeout())
5543
5544 self.assertEqual(org.family, other.family)
5545 self.assertEqual(org.type, other.type)
5546 # If the user specified "0" for proto, then
5547 # internally windows will have picked the correct value.
5548 # Python introspection on the socket however will still return
5549 # 0. For the shared socket, the python value is recreated
5550 # from the actual value, so it may not compare correctly.
5551 if org.proto != 0:
5552 self.assertEqual(org.proto, other.proto)
5553
5554 def testShareLocal(self):
5555 data = self.serv.share(os.getpid())
5556 s = socket.fromshare(data)
5557 try:
5558 self.compareSockets(self.serv, s)
5559 finally:
5560 s.close()
5561
5562 def testTypes(self):
5563 families = [socket.AF_INET, socket.AF_INET6]
5564 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5565 for f in families:
5566 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005567 try:
5568 source = socket.socket(f, t)
5569 except OSError:
5570 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005571 try:
5572 data = source.share(os.getpid())
5573 shared = socket.fromshare(data)
5574 try:
5575 self.compareSockets(source, shared)
5576 finally:
5577 shared.close()
5578 finally:
5579 source.close()
5580
5581
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005582class SendfileUsingSendTest(ThreadedTCPSocketTest):
5583 """
5584 Test the send() implementation of socket.sendfile().
5585 """
5586
Victor Stinner8c663fd2017-11-08 14:44:44 -08005587 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005588 BUFSIZE = 8192
5589 FILEDATA = b""
5590 TIMEOUT = 2
5591
5592 @classmethod
5593 def setUpClass(cls):
5594 def chunks(total, step):
5595 assert total >= step
5596 while total > step:
5597 yield step
5598 total -= step
5599 if total:
5600 yield total
5601
5602 chunk = b"".join([random.choice(string.ascii_letters).encode()
5603 for i in range(cls.BUFSIZE)])
5604 with open(support.TESTFN, 'wb') as f:
5605 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5606 f.write(chunk)
5607 with open(support.TESTFN, 'rb') as f:
5608 cls.FILEDATA = f.read()
5609 assert len(cls.FILEDATA) == cls.FILESIZE
5610
5611 @classmethod
5612 def tearDownClass(cls):
5613 support.unlink(support.TESTFN)
5614
5615 def accept_conn(self):
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005616 self.serv.settimeout(MAIN_TIMEOUT)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005617 conn, addr = self.serv.accept()
5618 conn.settimeout(self.TIMEOUT)
5619 self.addCleanup(conn.close)
5620 return conn
5621
5622 def recv_data(self, conn):
5623 received = []
5624 while True:
5625 chunk = conn.recv(self.BUFSIZE)
5626 if not chunk:
5627 break
5628 received.append(chunk)
5629 return b''.join(received)
5630
5631 def meth_from_sock(self, sock):
5632 # Depending on the mixin class being run return either send()
5633 # or sendfile() method implementation.
5634 return getattr(sock, "_sendfile_use_send")
5635
5636 # regular file
5637
5638 def _testRegularFile(self):
5639 address = self.serv.getsockname()
5640 file = open(support.TESTFN, 'rb')
5641 with socket.create_connection(address) as sock, file as file:
5642 meth = self.meth_from_sock(sock)
5643 sent = meth(file)
5644 self.assertEqual(sent, self.FILESIZE)
5645 self.assertEqual(file.tell(), self.FILESIZE)
5646
5647 def testRegularFile(self):
5648 conn = self.accept_conn()
5649 data = self.recv_data(conn)
5650 self.assertEqual(len(data), self.FILESIZE)
5651 self.assertEqual(data, self.FILEDATA)
5652
5653 # non regular file
5654
5655 def _testNonRegularFile(self):
5656 address = self.serv.getsockname()
5657 file = io.BytesIO(self.FILEDATA)
5658 with socket.create_connection(address) as sock, file as file:
5659 sent = sock.sendfile(file)
5660 self.assertEqual(sent, self.FILESIZE)
5661 self.assertEqual(file.tell(), self.FILESIZE)
5662 self.assertRaises(socket._GiveupOnSendfile,
5663 sock._sendfile_use_sendfile, file)
5664
5665 def testNonRegularFile(self):
5666 conn = self.accept_conn()
5667 data = self.recv_data(conn)
5668 self.assertEqual(len(data), self.FILESIZE)
5669 self.assertEqual(data, self.FILEDATA)
5670
5671 # empty file
5672
5673 def _testEmptyFileSend(self):
5674 address = self.serv.getsockname()
5675 filename = support.TESTFN + "2"
5676 with open(filename, 'wb'):
5677 self.addCleanup(support.unlink, filename)
5678 file = open(filename, 'rb')
5679 with socket.create_connection(address) as sock, file as file:
5680 meth = self.meth_from_sock(sock)
5681 sent = meth(file)
5682 self.assertEqual(sent, 0)
5683 self.assertEqual(file.tell(), 0)
5684
5685 def testEmptyFileSend(self):
5686 conn = self.accept_conn()
5687 data = self.recv_data(conn)
5688 self.assertEqual(data, b"")
5689
5690 # offset
5691
5692 def _testOffset(self):
5693 address = self.serv.getsockname()
5694 file = open(support.TESTFN, 'rb')
5695 with socket.create_connection(address) as sock, file as file:
5696 meth = self.meth_from_sock(sock)
5697 sent = meth(file, offset=5000)
5698 self.assertEqual(sent, self.FILESIZE - 5000)
5699 self.assertEqual(file.tell(), self.FILESIZE)
5700
5701 def testOffset(self):
5702 conn = self.accept_conn()
5703 data = self.recv_data(conn)
5704 self.assertEqual(len(data), self.FILESIZE - 5000)
5705 self.assertEqual(data, self.FILEDATA[5000:])
5706
5707 # count
5708
5709 def _testCount(self):
5710 address = self.serv.getsockname()
5711 file = open(support.TESTFN, 'rb')
5712 with socket.create_connection(address, timeout=2) as sock, file as file:
5713 count = 5000007
5714 meth = self.meth_from_sock(sock)
5715 sent = meth(file, count=count)
5716 self.assertEqual(sent, count)
5717 self.assertEqual(file.tell(), count)
5718
5719 def testCount(self):
5720 count = 5000007
5721 conn = self.accept_conn()
5722 data = self.recv_data(conn)
5723 self.assertEqual(len(data), count)
5724 self.assertEqual(data, self.FILEDATA[:count])
5725
5726 # count small
5727
5728 def _testCountSmall(self):
5729 address = self.serv.getsockname()
5730 file = open(support.TESTFN, 'rb')
5731 with socket.create_connection(address, timeout=2) as sock, file as file:
5732 count = 1
5733 meth = self.meth_from_sock(sock)
5734 sent = meth(file, count=count)
5735 self.assertEqual(sent, count)
5736 self.assertEqual(file.tell(), count)
5737
5738 def testCountSmall(self):
5739 count = 1
5740 conn = self.accept_conn()
5741 data = self.recv_data(conn)
5742 self.assertEqual(len(data), count)
5743 self.assertEqual(data, self.FILEDATA[:count])
5744
5745 # count + offset
5746
5747 def _testCountWithOffset(self):
5748 address = self.serv.getsockname()
5749 file = open(support.TESTFN, 'rb')
5750 with socket.create_connection(address, timeout=2) as sock, file as file:
5751 count = 100007
5752 meth = self.meth_from_sock(sock)
5753 sent = meth(file, offset=2007, count=count)
5754 self.assertEqual(sent, count)
5755 self.assertEqual(file.tell(), count + 2007)
5756
5757 def testCountWithOffset(self):
5758 count = 100007
5759 conn = self.accept_conn()
5760 data = self.recv_data(conn)
5761 self.assertEqual(len(data), count)
5762 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5763
5764 # non blocking sockets are not supposed to work
5765
5766 def _testNonBlocking(self):
5767 address = self.serv.getsockname()
5768 file = open(support.TESTFN, 'rb')
5769 with socket.create_connection(address) as sock, file as file:
5770 sock.setblocking(False)
5771 meth = self.meth_from_sock(sock)
5772 self.assertRaises(ValueError, meth, file)
5773 self.assertRaises(ValueError, sock.sendfile, file)
5774
5775 def testNonBlocking(self):
5776 conn = self.accept_conn()
5777 if conn.recv(8192):
5778 self.fail('was not supposed to receive any data')
5779
5780 # timeout (non-triggered)
5781
5782 def _testWithTimeout(self):
5783 address = self.serv.getsockname()
5784 file = open(support.TESTFN, 'rb')
5785 with socket.create_connection(address, timeout=2) as sock, file as file:
5786 meth = self.meth_from_sock(sock)
5787 sent = meth(file)
5788 self.assertEqual(sent, self.FILESIZE)
5789
5790 def testWithTimeout(self):
5791 conn = self.accept_conn()
5792 data = self.recv_data(conn)
5793 self.assertEqual(len(data), self.FILESIZE)
5794 self.assertEqual(data, self.FILEDATA)
5795
5796 # timeout (triggered)
5797
5798 def _testWithTimeoutTriggeredSend(self):
5799 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00005800 with open(support.TESTFN, 'rb') as file:
Joannah Nanjekye53b9e1a2019-02-26 19:18:23 +03005801 with socket.create_connection(address) as sock:
5802 sock.settimeout(0.01)
Pablo Galindo1f511e12018-12-29 01:42:16 +00005803 meth = self.meth_from_sock(sock)
5804 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005805
5806 def testWithTimeoutTriggeredSend(self):
5807 conn = self.accept_conn()
5808 conn.recv(88192)
5809
5810 # errors
5811
5812 def _test_errors(self):
5813 pass
5814
5815 def test_errors(self):
5816 with open(support.TESTFN, 'rb') as file:
5817 with socket.socket(type=socket.SOCK_DGRAM) as s:
5818 meth = self.meth_from_sock(s)
5819 self.assertRaisesRegex(
5820 ValueError, "SOCK_STREAM", meth, file)
5821 with open(support.TESTFN, 'rt') as file:
5822 with socket.socket() as s:
5823 meth = self.meth_from_sock(s)
5824 self.assertRaisesRegex(
5825 ValueError, "binary mode", meth, file)
5826 with open(support.TESTFN, 'rb') as file:
5827 with socket.socket() as s:
5828 meth = self.meth_from_sock(s)
5829 self.assertRaisesRegex(TypeError, "positive integer",
5830 meth, file, count='2')
5831 self.assertRaisesRegex(TypeError, "positive integer",
5832 meth, file, count=0.1)
5833 self.assertRaisesRegex(ValueError, "positive integer",
5834 meth, file, count=0)
5835 self.assertRaisesRegex(ValueError, "positive integer",
5836 meth, file, count=-1)
5837
5838
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005839@unittest.skipUnless(hasattr(os, "sendfile"),
5840 'os.sendfile() required for this test.')
5841class SendfileUsingSendfileTest(SendfileUsingSendTest):
5842 """
5843 Test the sendfile() implementation of socket.sendfile().
5844 """
5845 def meth_from_sock(self, sock):
5846 return getattr(sock, "_sendfile_use_sendfile")
5847
Christian Heimes48371412016-09-06 00:37:46 +02005848
5849@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005850class LinuxKernelCryptoAPI(unittest.TestCase):
5851 # tests for AF_ALG
5852 def create_alg(self, typ, name):
5853 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005854 try:
5855 sock.bind((typ, name))
5856 except FileNotFoundError as e:
5857 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005858 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005859 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005860 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005861 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005862
Victor Stinner86afc1f2017-11-30 13:58:43 +01005863 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5864 # at least on ppc64le architecture
5865 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005866 def test_sha256(self):
5867 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5868 "177a9cb410ff61f20015ad")
5869 with self.create_alg('hash', 'sha256') as algo:
5870 op, _ = algo.accept()
5871 with op:
5872 op.sendall(b"abc")
5873 self.assertEqual(op.recv(512), expected)
5874
5875 op, _ = algo.accept()
5876 with op:
5877 op.send(b'a', socket.MSG_MORE)
5878 op.send(b'b', socket.MSG_MORE)
5879 op.send(b'c', socket.MSG_MORE)
5880 op.send(b'')
5881 self.assertEqual(op.recv(512), expected)
5882
5883 def test_hmac_sha1(self):
5884 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5885 with self.create_alg('hash', 'hmac(sha1)') as algo:
5886 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5887 op, _ = algo.accept()
5888 with op:
5889 op.sendall(b"what do ya want for nothing?")
5890 self.assertEqual(op.recv(512), expected)
5891
Christian Heimese084f842016-09-11 20:11:30 +02005892 # Although it should work with 3.19 and newer the test blocks on
5893 # Ubuntu 15.10 with Kernel 4.2.0-19.
5894 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005895 def test_aes_cbc(self):
5896 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5897 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5898 msg = b"Single block msg"
5899 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5900 msglen = len(msg)
5901 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5902 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5903 op, _ = algo.accept()
5904 with op:
5905 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5906 flags=socket.MSG_MORE)
5907 op.sendall(msg)
5908 self.assertEqual(op.recv(msglen), ciphertext)
5909
5910 op, _ = algo.accept()
5911 with op:
5912 op.sendmsg_afalg([ciphertext],
5913 op=socket.ALG_OP_DECRYPT, iv=iv)
5914 self.assertEqual(op.recv(msglen), msg)
5915
5916 # long message
5917 multiplier = 1024
5918 longmsg = [msg] * multiplier
5919 op, _ = algo.accept()
5920 with op:
5921 op.sendmsg_afalg(longmsg,
5922 op=socket.ALG_OP_ENCRYPT, iv=iv)
5923 enc = op.recv(msglen * multiplier)
5924 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05005925 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005926
5927 op, _ = algo.accept()
5928 with op:
5929 op.sendmsg_afalg([enc],
5930 op=socket.ALG_OP_DECRYPT, iv=iv)
5931 dec = op.recv(msglen * multiplier)
5932 self.assertEqual(len(dec), msglen * multiplier)
5933 self.assertEqual(dec, msg * multiplier)
5934
matejcik9764c152017-02-16 14:41:31 +01005935 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005936 def test_aead_aes_gcm(self):
5937 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5938 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5939 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5940 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5941 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5942 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5943
5944 taglen = len(expected_tag)
5945 assoclen = len(assoc)
5946
5947 with self.create_alg('aead', 'gcm(aes)') as algo:
5948 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5949 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5950 None, taglen)
5951
5952 # send assoc, plain and tag buffer in separate steps
5953 op, _ = algo.accept()
5954 with op:
5955 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5956 assoclen=assoclen, flags=socket.MSG_MORE)
5957 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005958 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005959 res = op.recv(assoclen + len(plain) + taglen)
5960 self.assertEqual(expected_ct, res[assoclen:-taglen])
5961 self.assertEqual(expected_tag, res[-taglen:])
5962
5963 # now with msg
5964 op, _ = algo.accept()
5965 with op:
matejcik9764c152017-02-16 14:41:31 +01005966 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005967 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5968 assoclen=assoclen)
5969 res = op.recv(assoclen + len(plain) + taglen)
5970 self.assertEqual(expected_ct, res[assoclen:-taglen])
5971 self.assertEqual(expected_tag, res[-taglen:])
5972
5973 # create anc data manually
5974 pack_uint32 = struct.Struct('I').pack
5975 op, _ = algo.accept()
5976 with op:
matejcik9764c152017-02-16 14:41:31 +01005977 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005978 op.sendmsg(
5979 [msg],
5980 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5981 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5982 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5983 )
5984 )
matejcik9764c152017-02-16 14:41:31 +01005985 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005986 self.assertEqual(expected_ct, res[assoclen:-taglen])
5987 self.assertEqual(expected_tag, res[-taglen:])
5988
5989 # decrypt and verify
5990 op, _ = algo.accept()
5991 with op:
5992 msg = assoc + expected_ct + expected_tag
5993 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5994 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005995 res = op.recv(len(msg) - taglen)
5996 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005997
Christian Heimese084f842016-09-11 20:11:30 +02005998 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005999 def test_drbg_pr_sha256(self):
6000 # deterministic random bit generator, prediction resistance, sha256
6001 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
6002 extra_seed = os.urandom(32)
6003 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
6004 op, _ = algo.accept()
6005 with op:
6006 rn = op.recv(32)
6007 self.assertEqual(len(rn), 32)
6008
6009 def test_sendmsg_afalg_args(self):
6010 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006011 with sock:
6012 with self.assertRaises(TypeError):
6013 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006014
Christian Heimes02b30352016-09-11 19:49:56 +02006015 with self.assertRaises(TypeError):
6016 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006017
Christian Heimes02b30352016-09-11 19:49:56 +02006018 with self.assertRaises(TypeError):
6019 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006020
Christian Heimes02b30352016-09-11 19:49:56 +02006021 with self.assertRaises(TypeError):
6022 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006023
Christian Heimes02b30352016-09-11 19:49:56 +02006024 with self.assertRaises(TypeError):
6025 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6026
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006027 def test_length_restriction(self):
6028 # bpo-35050, off-by-one error in length check
6029 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6030 self.addCleanup(sock.close)
6031
6032 # salg_type[14]
6033 with self.assertRaises(FileNotFoundError):
6034 sock.bind(("t" * 13, "name"))
6035 with self.assertRaisesRegex(ValueError, "type too long"):
6036 sock.bind(("t" * 14, "name"))
6037
6038 # salg_name[64]
6039 with self.assertRaises(FileNotFoundError):
6040 sock.bind(("type", "n" * 63))
6041 with self.assertRaisesRegex(ValueError, "name too long"):
6042 sock.bind(("type", "n" * 64))
6043
6044
animalize19e7d482018-02-27 02:10:36 +08006045@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6046class TestMSWindowsTCPFlags(unittest.TestCase):
6047 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006048 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006049 'TCP_MAXSEG',
6050 'TCP_NODELAY',
6051 # available starting with Windows 10 1607
6052 'TCP_FASTOPEN',
6053 # available starting with Windows 10 1703
6054 'TCP_KEEPCNT',
6055 # available starting with Windows 10 1709
6056 'TCP_KEEPIDLE',
6057 'TCP_KEEPINTVL'
6058 }
6059
6060 def test_new_tcp_flags(self):
6061 provided = [s for s in dir(socket) if s.startswith('TCP')]
6062 unknown = [s for s in provided if s not in self.knownTCPFlags]
6063
6064 self.assertEqual([], unknown,
6065 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006066
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006067
6068class CreateServerTest(unittest.TestCase):
6069
6070 def test_address(self):
6071 port = support.find_unused_port()
6072 with socket.create_server(("127.0.0.1", port)) as sock:
6073 self.assertEqual(sock.getsockname()[0], "127.0.0.1")
6074 self.assertEqual(sock.getsockname()[1], port)
6075 if support.IPV6_ENABLED:
6076 with socket.create_server(("::1", port),
6077 family=socket.AF_INET6) as sock:
6078 self.assertEqual(sock.getsockname()[0], "::1")
6079 self.assertEqual(sock.getsockname()[1], port)
6080
6081 def test_family_and_type(self):
6082 with socket.create_server(("127.0.0.1", 0)) as sock:
6083 self.assertEqual(sock.family, socket.AF_INET)
6084 self.assertEqual(sock.type, socket.SOCK_STREAM)
6085 if support.IPV6_ENABLED:
6086 with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
6087 self.assertEqual(s.family, socket.AF_INET6)
6088 self.assertEqual(sock.type, socket.SOCK_STREAM)
6089
6090 def test_reuse_port(self):
6091 if not hasattr(socket, "SO_REUSEPORT"):
6092 with self.assertRaises(ValueError):
6093 socket.create_server(("localhost", 0), reuse_port=True)
6094 else:
6095 with socket.create_server(("localhost", 0)) as sock:
6096 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6097 self.assertEqual(opt, 0)
6098 with socket.create_server(("localhost", 0), reuse_port=True) as sock:
6099 opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
6100 self.assertNotEqual(opt, 0)
6101
6102 @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
6103 not hasattr(_socket, 'IPV6_V6ONLY'),
6104 "IPV6_V6ONLY option not supported")
6105 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6106 def test_ipv6_only_default(self):
6107 with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
6108 assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
6109
6110 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6111 "dualstack_ipv6 not supported")
6112 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6113 def test_dualstack_ipv6_family(self):
6114 with socket.create_server(("::1", 0), family=socket.AF_INET6,
6115 dualstack_ipv6=True) as sock:
6116 self.assertEqual(sock.family, socket.AF_INET6)
6117
6118
6119class CreateServerFunctionalTest(unittest.TestCase):
6120 timeout = 3
6121
6122 def setUp(self):
6123 self.thread = None
6124
6125 def tearDown(self):
6126 if self.thread is not None:
6127 self.thread.join(self.timeout)
6128
6129 def echo_server(self, sock):
6130 def run(sock):
6131 with sock:
6132 conn, _ = sock.accept()
6133 with conn:
6134 event.wait(self.timeout)
6135 msg = conn.recv(1024)
6136 if not msg:
6137 return
6138 conn.sendall(msg)
6139
6140 event = threading.Event()
6141 sock.settimeout(self.timeout)
6142 self.thread = threading.Thread(target=run, args=(sock, ))
6143 self.thread.start()
6144 event.set()
6145
6146 def echo_client(self, addr, family):
6147 with socket.socket(family=family) as sock:
6148 sock.settimeout(self.timeout)
6149 sock.connect(addr)
6150 sock.sendall(b'foo')
6151 self.assertEqual(sock.recv(1024), b'foo')
6152
6153 def test_tcp4(self):
6154 port = support.find_unused_port()
6155 with socket.create_server(("", port)) as sock:
6156 self.echo_server(sock)
6157 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6158
6159 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6160 def test_tcp6(self):
6161 port = support.find_unused_port()
6162 with socket.create_server(("", port),
6163 family=socket.AF_INET6) as sock:
6164 self.echo_server(sock)
6165 self.echo_client(("::1", port), socket.AF_INET6)
6166
6167 # --- dual stack tests
6168
6169 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6170 "dualstack_ipv6 not supported")
6171 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6172 def test_dual_stack_client_v4(self):
6173 port = support.find_unused_port()
6174 with socket.create_server(("", port), family=socket.AF_INET6,
6175 dualstack_ipv6=True) as sock:
6176 self.echo_server(sock)
6177 self.echo_client(("127.0.0.1", port), socket.AF_INET)
6178
6179 @unittest.skipIf(not socket.has_dualstack_ipv6(),
6180 "dualstack_ipv6 not supported")
6181 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test')
6182 def test_dual_stack_client_v6(self):
6183 port = support.find_unused_port()
6184 with socket.create_server(("", port), family=socket.AF_INET6,
6185 dualstack_ipv6=True) as sock:
6186 self.echo_server(sock)
6187 self.echo_client(("::1", port), socket.AF_INET6)
6188
6189
Guido van Rossumb995eb72002-07-31 16:08:40 +00006190def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006191 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +02006192 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
6193 UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006194
6195 tests.extend([
6196 NonBlockingTCPTests,
6197 FileObjectClassTestCase,
6198 UnbufferedFileObjectClassTestCase,
6199 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006200 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006201 UnicodeReadFileObjectClassTestCase,
6202 UnicodeWriteFileObjectClassTestCase,
6203 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006204 NetworkConnectionNoServer,
6205 NetworkConnectionAttributesTest,
6206 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006207 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006208 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006209 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006210 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006211 tests.append(BasicSocketPairTest)
6212 tests.append(TestUnixDomain)
6213 tests.append(TestLinuxAbstractNamespace)
6214 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006215 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006216 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006217 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006218 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006219 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006220 BasicVSOCKTest,
6221 ThreadedVSOCKSocketStreamTest,
6222 ])
6223 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006224 CmsgMacroTests,
6225 SendmsgUDPTest,
6226 RecvmsgUDPTest,
6227 RecvmsgIntoUDPTest,
6228 SendmsgUDP6Test,
6229 RecvmsgUDP6Test,
6230 RecvmsgRFC3542AncillaryUDP6Test,
6231 RecvmsgIntoRFC3542AncillaryUDP6Test,
6232 RecvmsgIntoUDP6Test,
6233 SendmsgTCPTest,
6234 RecvmsgTCPTest,
6235 RecvmsgIntoTCPTest,
6236 SendmsgSCTPStreamTest,
6237 RecvmsgSCTPStreamTest,
6238 RecvmsgIntoSCTPStreamTest,
6239 SendmsgUnixStreamTest,
6240 RecvmsgUnixStreamTest,
6241 RecvmsgIntoUnixStreamTest,
6242 RecvmsgSCMRightsStreamTest,
6243 RecvmsgIntoSCMRightsStreamTest,
6244 # These are slow when setitimer() is not available
6245 InterruptedRecvTimeoutTest,
6246 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006247 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006248 SendfileUsingSendTest,
6249 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006250 ])
animalize19e7d482018-02-27 02:10:36 +08006251 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006252
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006253 thread_info = support.threading_setup()
6254 support.run_unittest(*tests)
6255 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006256
6257if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006258 test_main()