blob: 7c5167d85033cf96c1208cddde904959151869a6 [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):
802 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
803 p = proxy(s)
804 self.assertEqual(p.fileno(), s.fileno())
805 s.close()
806 s = None
807 try:
808 p.fileno()
809 except ReferenceError:
810 pass
811 else:
812 self.fail('Socket proxy still exists')
813
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000815 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300816 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200817 with self.assertRaises(OSError, msg=msg % 'OSError'):
818 raise OSError
819 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200821 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823
Ezio Melotti63e42302011-05-07 19:47:48 +0300824 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000825 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300826 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
827 self.addCleanup(s.close)
828 s.bind(('', 0))
829 sockname = s.getsockname()
830 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300831 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300832 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300833 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400834 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300835 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300836 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300837 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400838 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300839 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300840 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300841 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300842 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300843 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300844 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300845 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400846 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300847 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300848 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300849 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400850 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300851 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300852 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300853 self.assertIn('not NoneType', str(cm.exception))
854 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300855 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300856 self.assertIn('an integer is required', str(cm.exception))
857 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300858 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300859 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300860 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300861 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300862 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300863 self.assertIn('(1 given)', str(cm.exception))
864 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300865 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300866 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300867
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 socket.AF_INET
871 socket.SOCK_STREAM
872 socket.SOCK_DGRAM
873 socket.SOCK_RAW
874 socket.SOCK_RDM
875 socket.SOCK_SEQPACKET
876 socket.SOL_SOCKET
877 socket.SO_REUSEADDR
878
Guido van Rossum654c11e2002-06-13 20:24:17 +0000879 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000880 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000881 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000882 try:
883 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200884 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000885 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600886 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000887 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000888 try:
889 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200890 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000891 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600892 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000893 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000894 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000895 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000896 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000897
Charles-François Natali0cc86852013-09-13 19:53:08 +0200898 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700899 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200900 self.assertEqual(socket.gethostbyname(addr), addr)
901
902 # we don't test support.HOSTv6 because there's a chance it doesn't have
903 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700904 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200905 self.assertIn(host, socket.gethostbyaddr(host)[2])
906
Xiang Zhangd36a7162017-03-07 11:06:09 +0800907 def test_host_resolution_bad_address(self):
908 # These are all malformed IP addresses and expected not to resolve to
909 # any result. But some ISPs, e.g. AWS, may successfully resolve these
910 # IPs.
911 explanation = (
912 "resolving an invalid IP address did not raise OSError; "
913 "can be caused by a broken DNS server"
914 )
915 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
916 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400917 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800918 socket.gethostbyname(addr)
919 with self.assertRaises(OSError, msg=explanation):
920 socket.gethostbyaddr(addr)
921
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000922 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
923 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
924 def test_sethostname(self):
925 oldhn = socket.gethostname()
926 try:
927 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200928 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000929 if e.errno == errno.EPERM:
930 self.skipTest("test should be run as root")
931 else:
932 raise
933 try:
934 # running test as root!
935 self.assertEqual(socket.gethostname(), 'new')
936 # Should work with bytes objects too
937 socket.sethostname(b'bar')
938 self.assertEqual(socket.gethostname(), 'bar')
939 finally:
940 socket.sethostname(oldhn)
941
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700942 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
943 'socket.if_nameindex() not available.')
944 def testInterfaceNameIndex(self):
945 interfaces = socket.if_nameindex()
946 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200947 self.assertIsInstance(index, int)
948 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700949 # interface indices are non-zero integers
950 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200951 _index = socket.if_nametoindex(name)
952 self.assertIsInstance(_index, int)
953 self.assertEqual(index, _index)
954 _name = socket.if_indextoname(index)
955 self.assertIsInstance(_name, str)
956 self.assertEqual(name, _name)
957
958 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
959 'socket.if_nameindex() not available.')
960 def testInvalidInterfaceNameIndex(self):
961 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200962 self.assertRaises(OSError, socket.if_indextoname, 0)
963 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200964 # test with invalid values
965 self.assertRaises(TypeError, socket.if_nametoindex, 0)
966 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700967
Serhiy Storchaka43767632013-11-03 21:31:38 +0200968 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
969 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000970 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000971 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200972 try:
973 # On some versions, this loses a reference
974 orig = sys.getrefcount(__name__)
975 socket.getnameinfo(__name__,0)
976 except TypeError:
977 if sys.getrefcount(__name__) != orig:
978 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000979
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000981 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982 try:
983 # On some versions, this crashes the interpreter.
984 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200985 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000987
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000988 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000989 # This just checks that htons etc. are their own inverse,
990 # when looking at the lower 16 or 32 bits.
991 sizes = {socket.htonl: 32, socket.ntohl: 32,
992 socket.htons: 16, socket.ntohs: 16}
993 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000994 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000995 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
996 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000997
Guido van Rossuma2627af2002-09-14 00:58:46 +0000998 swapped = func(mask)
999 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001000 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +00001001
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001002 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001003 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001004 import _testcapi
1005 s_good_values = [0, 1, 2, 0xffff]
1006 l_good_values = s_good_values + [0xffffffff]
1007 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1008 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1009 _testcapi.INT_MAX + 1]
1010 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1011 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001012 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001013 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001014 for k in l_good_values:
1015 socket.ntohl(k)
1016 socket.htonl(k)
1017 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001018 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001019 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001020 for k in l_bad_values:
1021 self.assertRaises(OverflowError, socket.ntohl, k)
1022 self.assertRaises(OverflowError, socket.htonl, k)
1023 for k in s_deprecated_values:
1024 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1025 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001026
Barry Warsaw11b91a02004-06-28 00:50:43 +00001027 def testGetServBy(self):
1028 eq = self.assertEqual
1029 # Find one service that exists, then check all the related interfaces.
1030 # I've ordered this by protocols that have both a tcp and udp
1031 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001032 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001033 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001034 # avoid the 'echo' service on this platform, as there is an
1035 # assumption breaking non-standard port/protocol entry
1036 services = ('daytime', 'qotd', 'domain')
1037 else:
1038 services = ('echo', 'daytime', 'domain')
1039 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001040 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001041 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001042 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001043 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001044 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001045 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001046 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001047 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001048 # Issue #26936: Android getservbyname() was broken before API 23.
1049 if (not hasattr(sys, 'getandroidapilevel') or
1050 sys.getandroidapilevel() >= 23):
1051 port2 = socket.getservbyname(service)
1052 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001053 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001054 try:
1055 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001056 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001057 udpport = None
1058 else:
1059 eq(udpport, port)
1060 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001061 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001062 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001063 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001064 eq(socket.getservbyport(port, 'tcp'), service)
1065 if udpport is not None:
1066 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001067 # Make sure getservbyport does not accept out of range ports.
1068 self.assertRaises(OverflowError, socket.getservbyport, -1)
1069 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001071 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001072 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001073 # The default timeout should initially be None
1074 self.assertEqual(socket.getdefaulttimeout(), None)
1075 s = socket.socket()
1076 self.assertEqual(s.gettimeout(), None)
1077 s.close()
1078
1079 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001080 with socket_setdefaulttimeout(10):
1081 self.assertEqual(socket.getdefaulttimeout(), 10)
1082 with socket.socket() as sock:
1083 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001084
Victor Stinner304315d2018-11-30 13:22:44 +01001085 # Reset the default timeout to None, and see if it propagates
1086 socket.setdefaulttimeout(None)
1087 self.assertEqual(socket.getdefaulttimeout(), None)
1088 with socket.socket() as sock:
1089 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001090
1091 # Check that setting it to an invalid value raises ValueError
1092 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1093
1094 # Check that setting it to an invalid type raises TypeError
1095 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1096
Serhiy Storchaka43767632013-11-03 21:31:38 +02001097 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1098 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001099 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001100 # Test that issue1008086 and issue767150 are fixed.
1101 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001102 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1103 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001104
Serhiy Storchaka43767632013-11-03 21:31:38 +02001105 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1106 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001107 def testIPv4toString(self):
1108 from socket import inet_aton as f, inet_pton, AF_INET
1109 g = lambda a: inet_pton(AF_INET, a)
1110
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001111 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001112 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001113 )
1114
Ezio Melottib3aedd42010-11-20 19:04:17 +00001115 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1116 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1117 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1118 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1119 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001120 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001121 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001122 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001123 assertInvalid(f, '300.0.0.0')
1124 assertInvalid(f, 'a.0.0.0')
1125 assertInvalid(f, '1.2.3.4.5')
1126 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001127
Ezio Melottib3aedd42010-11-20 19:04:17 +00001128 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1129 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1130 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1131 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001132 assertInvalid(g, '0.0.0.')
1133 assertInvalid(g, '300.0.0.0')
1134 assertInvalid(g, 'a.0.0.0')
1135 assertInvalid(g, '1.2.3.4.5')
1136 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001137
Serhiy Storchaka43767632013-11-03 21:31:38 +02001138 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1139 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001140 def testIPv6toString(self):
1141 try:
1142 from socket import inet_pton, AF_INET6, has_ipv6
1143 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001144 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001145 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001146 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001147
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001148 if sys.platform == "win32":
1149 try:
1150 inet_pton(AF_INET6, '::')
1151 except OSError as e:
1152 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001153 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001154
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001155 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001156 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001157 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001158 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001159
Ezio Melottib3aedd42010-11-20 19:04:17 +00001160 self.assertEqual(b'\x00' * 16, f('::'))
1161 self.assertEqual(b'\x00' * 16, f('0::0'))
1162 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1163 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001164 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 +00001165 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1166 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001167 self.assertEqual(
1168 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1169 f('ad42:abc::127:0:254:2')
1170 )
1171 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1172 assertInvalid('0x20::')
1173 assertInvalid(':::')
1174 assertInvalid('::0::')
1175 assertInvalid('1::abc::')
1176 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001177 assertInvalid('1:2:3:4:5:6')
Michael Felt56614592018-12-26 04:34:37 +01001178 assertInvalid('1:2:3:4:5:6:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001179 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001180 # bpo-29972: inet_pton() doesn't fail on AIX
Michael Felt56614592018-12-26 04:34:37 +01001181 if not AIX:
Victor Stinner5de85a12017-04-04 10:35:15 +02001182 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001183
1184 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1185 f('::254.42.23.64')
1186 )
1187 self.assertEqual(
1188 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1189 f('42::a29b:254.42.23.64')
1190 )
1191 self.assertEqual(
1192 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1193 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1194 )
1195 assertInvalid('255.254.253.252')
1196 assertInvalid('1::260.2.3.0')
1197 assertInvalid('1::0.be.e.0')
1198 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1199 assertInvalid('::1.2.3.4:0')
1200 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001201
Serhiy Storchaka43767632013-11-03 21:31:38 +02001202 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1203 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001204 def testStringToIPv4(self):
1205 from socket import inet_ntoa as f, inet_ntop, AF_INET
1206 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001207 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001208 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001209 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001210
Ezio Melottib3aedd42010-11-20 19:04:17 +00001211 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1212 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1213 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1214 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001215 assertInvalid(f, b'\x00' * 3)
1216 assertInvalid(f, b'\x00' * 5)
1217 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001218 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001219
Ezio Melottib3aedd42010-11-20 19:04:17 +00001220 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1221 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1222 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001223 assertInvalid(g, b'\x00' * 3)
1224 assertInvalid(g, b'\x00' * 5)
1225 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001226 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001227
Serhiy Storchaka43767632013-11-03 21:31:38 +02001228 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1229 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001230 def testStringToIPv6(self):
1231 try:
1232 from socket import inet_ntop, AF_INET6, has_ipv6
1233 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001234 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001235 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001236 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001237
1238 if sys.platform == "win32":
1239 try:
1240 inet_ntop(AF_INET6, b'\x00' * 16)
1241 except OSError as e:
1242 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001243 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001244
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001245 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001246 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001247 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001248 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001249
Ezio Melottib3aedd42010-11-20 19:04:17 +00001250 self.assertEqual('::', f(b'\x00' * 16))
1251 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1252 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001253 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001254 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 +00001255 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001256 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001257
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001258 assertInvalid(b'\x12' * 15)
1259 assertInvalid(b'\x12' * 17)
1260 assertInvalid(b'\x12' * 4)
1261
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001262 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001263
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001264 def testSockName(self):
1265 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001266 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001267 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001268 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001269 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001270 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001271 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1272 # it reasonable to get the host's addr in addition to 0.0.0.0.
1273 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001274 try:
1275 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001276 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001277 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001278 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001279 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001280 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001281
1282 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001283 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001284 # We know a socket should start without reuse==0
1285 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001286 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001287 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001288 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001289
1290 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001291 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001292 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001293 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001294 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1295 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001296 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001297
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001298 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001299 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001300 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1301 sock.settimeout(1)
1302 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001303 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001304
Martin Panter50ab1a32016-04-11 00:38:12 +00001305 def testCloseException(self):
1306 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001307 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001308 socket.socket(fileno=sock.fileno()).close()
1309 try:
1310 sock.close()
1311 except OSError as err:
1312 # Winsock apparently raises ENOTSOCK
1313 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1314 else:
1315 self.fail("close() should raise EBADF/ENOTSOCK")
1316
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001317 def testNewAttributes(self):
1318 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001319
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001320 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1321 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001322 if hasattr(socket, 'SOCK_CLOEXEC'):
1323 self.assertIn(sock.type,
1324 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1325 socket.SOCK_STREAM))
1326 else:
1327 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001328 self.assertEqual(sock.proto, 0)
1329 sock.close()
1330
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001331 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001332 sock = socket.socket()
1333 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001334 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001335 big_port = port + 65536
1336 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001337 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1338 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1339 # Since find_unused_port() is inherently subject to race conditions, we
1340 # call it a couple times if necessary.
1341 for i in itertools.count():
1342 port = support.find_unused_port()
1343 try:
1344 sock.bind((HOST, port))
1345 except OSError as e:
1346 if e.errno != errno.EADDRINUSE or i == 5:
1347 raise
1348 else:
1349 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001350
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001351 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001352 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001353 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1354 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1355 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1356 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001357 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1358 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001359 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001360 self.assertRaises(ValueError, s.ioctl, -1, None)
1361 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001362
Steve Dowerea93ac02016-06-17 12:52:18 -07001363 @unittest.skipUnless(os.name == "nt", "Windows specific")
1364 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1365 'Loopback fast path support required for this test')
1366 def test_sio_loopback_fast_path(self):
1367 s = socket.socket()
1368 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001369 try:
1370 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1371 except OSError as exc:
1372 WSAEOPNOTSUPP = 10045
1373 if exc.winerror == WSAEOPNOTSUPP:
1374 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1375 "doesn't implemented in this Windows version")
1376 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001377 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1378
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001379 def testGetaddrinfo(self):
1380 try:
1381 socket.getaddrinfo('localhost', 80)
1382 except socket.gaierror as err:
1383 if err.errno == socket.EAI_SERVICE:
1384 # see http://bugs.python.org/issue1282647
1385 self.skipTest("buggy libc version")
1386 raise
1387 # len of every sequence is supposed to be == 5
1388 for info in socket.getaddrinfo(HOST, None):
1389 self.assertEqual(len(info), 5)
1390 # host can be a domain name, a string representation of an
1391 # IPv4/v6 address or None
1392 socket.getaddrinfo('localhost', 80)
1393 socket.getaddrinfo('127.0.0.1', 80)
1394 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001395 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001396 socket.getaddrinfo('::1', 80)
1397 # port can be a string service name such as "http", a numeric
1398 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001399 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1400 if (not hasattr(sys, 'getandroidapilevel') or
1401 sys.getandroidapilevel() >= 23):
1402 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001403 socket.getaddrinfo(HOST, 80)
1404 socket.getaddrinfo(HOST, None)
1405 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001406 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1407 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001408 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001409 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1410 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001411 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001412 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1413 for _, socktype, _, _, _ in infos:
1414 self.assertEqual(socktype, socket.SOCK_STREAM)
1415 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001416 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001417 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1418 # a server willing to support both IPv4 and IPv6 will
1419 # usually do this
1420 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1421 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001422 # test keyword arguments
1423 a = socket.getaddrinfo(HOST, None)
1424 b = socket.getaddrinfo(host=HOST, port=None)
1425 self.assertEqual(a, b)
1426 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1427 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1428 self.assertEqual(a, b)
1429 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1430 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1431 self.assertEqual(a, b)
1432 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1433 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1434 self.assertEqual(a, b)
1435 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1436 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1437 self.assertEqual(a, b)
1438 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1439 socket.AI_PASSIVE)
1440 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1441 type=socket.SOCK_STREAM, proto=0,
1442 flags=socket.AI_PASSIVE)
1443 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001444 # Issue #6697.
1445 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001446
Ned Deilyb24f4812014-02-13 22:50:42 -08001447 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001448 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001449 try:
1450 # The arguments here are undefined and the call may succeed
1451 # or fail. All we care here is that it doesn't segfault.
1452 socket.getaddrinfo("localhost", None, 0, 0, 0,
1453 socket.AI_NUMERICSERV)
1454 except socket.gaierror:
1455 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001456
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001457 def test_getnameinfo(self):
1458 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001459 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001460
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001461 @unittest.skipUnless(support.is_resource_enabled('network'),
1462 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001463 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001464 # Check for internet access before running test
1465 # (issue #12804, issue #25138).
1466 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001467 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001468
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001469 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001470 domain = 'испытание.pythontest.net'
1471 socket.gethostbyname(domain)
1472 socket.gethostbyname_ex(domain)
1473 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001474 # 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 +00001475 # have a reverse entry yet
1476 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001477
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001478 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001479 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001480 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1481 self.skipTest("signal.alarm and socket.socketpair required for this test")
1482 # Our signal handlers clobber the C errno by calling a math function
1483 # with an invalid domain value.
1484 def ok_handler(*args):
1485 self.assertRaises(ValueError, math.acosh, 0)
1486 def raising_handler(*args):
1487 self.assertRaises(ValueError, math.acosh, 0)
1488 1 // 0
1489 c, s = socket.socketpair()
1490 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1491 try:
1492 if with_timeout:
1493 # Just above the one second minimum for signal.alarm
1494 c.settimeout(1.5)
1495 with self.assertRaises(ZeroDivisionError):
1496 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001497 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001498 if with_timeout:
1499 signal.signal(signal.SIGALRM, ok_handler)
1500 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001501 self.assertRaises(socket.timeout, c.sendall,
1502 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001503 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001504 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001505 signal.signal(signal.SIGALRM, old_alarm)
1506 c.close()
1507 s.close()
1508
1509 def test_sendall_interrupted(self):
1510 self.check_sendall_interrupted(False)
1511
1512 def test_sendall_interrupted_with_timeout(self):
1513 self.check_sendall_interrupted(True)
1514
Antoine Pitroue033e062010-10-29 10:38:18 +00001515 def test_dealloc_warn(self):
1516 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1517 r = repr(sock)
1518 with self.assertWarns(ResourceWarning) as cm:
1519 sock = None
1520 support.gc_collect()
1521 self.assertIn(r, str(cm.warning.args[0]))
1522 # An open socket file object gets dereferenced after the socket
1523 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1524 f = sock.makefile('rb')
1525 r = repr(sock)
1526 sock = None
1527 support.gc_collect()
1528 with self.assertWarns(ResourceWarning):
1529 f = None
1530 support.gc_collect()
1531
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001532 def test_name_closed_socketio(self):
1533 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1534 fp = sock.makefile("rb")
1535 fp.close()
1536 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1537
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001538 def test_unusable_closed_socketio(self):
1539 with socket.socket() as sock:
1540 fp = sock.makefile("rb", buffering=0)
1541 self.assertTrue(fp.readable())
1542 self.assertFalse(fp.writable())
1543 self.assertFalse(fp.seekable())
1544 fp.close()
1545 self.assertRaises(ValueError, fp.readable)
1546 self.assertRaises(ValueError, fp.writable)
1547 self.assertRaises(ValueError, fp.seekable)
1548
Christian Heimesd0e31b92018-01-27 09:54:13 +01001549 def test_socket_close(self):
1550 sock = socket.socket()
1551 try:
1552 sock.bind((HOST, 0))
1553 socket.close(sock.fileno())
1554 with self.assertRaises(OSError):
1555 sock.listen(1)
1556 finally:
1557 with self.assertRaises(OSError):
1558 # sock.close() fails with EBADF
1559 sock.close()
1560 with self.assertRaises(TypeError):
1561 socket.close(None)
1562 with self.assertRaises(OSError):
1563 socket.close(-1)
1564
Berker Peksag3fe64d02016-02-18 17:34:00 +02001565 def test_makefile_mode(self):
1566 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1567 with self.subTest(mode=mode):
1568 with socket.socket() as sock:
1569 with sock.makefile(mode) as fp:
1570 self.assertEqual(fp.mode, mode)
1571
1572 def test_makefile_invalid_mode(self):
1573 for mode in 'rt', 'x', '+', 'a':
1574 with self.subTest(mode=mode):
1575 with socket.socket() as sock:
1576 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1577 sock.makefile(mode)
1578
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001579 def test_pickle(self):
1580 sock = socket.socket()
1581 with sock:
1582 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1583 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001584 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1585 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1586 self.assertEqual(family, socket.AF_INET)
1587 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1588 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001589
Serhiy Storchaka78980432013-01-15 01:12:17 +02001590 def test_listen_backlog(self):
1591 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001592 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1593 srv.bind((HOST, 0))
1594 srv.listen(backlog)
1595
1596 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001597 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001598 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001599
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001600 @support.cpython_only
1601 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001602 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001603 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001604 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1605 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001606 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001607 srv.close()
1608
Charles-François Natali42663332012-01-02 15:57:30 +01001609 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001610 def test_flowinfo(self):
1611 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001612 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001613 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001614 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001615
Коренберг Марк7766b962018-02-13 00:47:42 +05001616 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1617 def test_getaddrinfo_ipv6_basic(self):
1618 ((*_, sockaddr),) = socket.getaddrinfo(
1619 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1620 1234, socket.AF_INET6,
1621 socket.SOCK_DGRAM,
1622 socket.IPPROTO_UDP
1623 )
1624 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1625
1626 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1627 @unittest.skipUnless(
1628 hasattr(socket, 'if_nameindex'),
1629 'if_nameindex is not supported')
Michael Felt56614592018-12-26 04:34:37 +01001630 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001631 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1632 # Just pick up any network interface (Linux, Mac OS X)
1633 (ifindex, test_interface) = socket.if_nameindex()[0]
1634 ((*_, sockaddr),) = socket.getaddrinfo(
1635 'ff02::1de:c0:face:8D%' + test_interface,
1636 1234, socket.AF_INET6,
1637 socket.SOCK_DGRAM,
1638 socket.IPPROTO_UDP
1639 )
1640 # Note missing interface name part in IPv6 address
1641 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1642
1643 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1644 @unittest.skipUnless(
1645 sys.platform == 'win32',
1646 'Numeric scope id does not work or undocumented')
1647 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1648 # Also works on Linux and Mac OS X, but is not documented (?)
1649 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1650 ifindex = 42
1651 ((*_, sockaddr),) = socket.getaddrinfo(
1652 'ff02::1de:c0:face:8D%' + str(ifindex),
1653 1234, socket.AF_INET6,
1654 socket.SOCK_DGRAM,
1655 socket.IPPROTO_UDP
1656 )
1657 # Note missing interface name part in IPv6 address
1658 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1659
1660 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1661 @unittest.skipUnless(
1662 hasattr(socket, 'if_nameindex'),
1663 'if_nameindex is not supported')
Michael Felt56614592018-12-26 04:34:37 +01001664 @unittest.skipIf(AIX, 'Symbolic scope id does not work')
Коренберг Марк7766b962018-02-13 00:47:42 +05001665 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1666 # Just pick up any network interface.
1667 (ifindex, test_interface) = socket.if_nameindex()[0]
1668 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1669 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1670 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1671
1672 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Michael Felt56614592018-12-26 04:34:37 +01001673 @unittest.skipUnless( sys.platform == 'win32',
Коренберг Марк7766b962018-02-13 00:47:42 +05001674 'Numeric scope id does not work or undocumented')
1675 def test_getnameinfo_ipv6_scopeid_numeric(self):
1676 # Also works on Linux (undocumented), but does not work on Mac OS X
1677 # Windows and Linux allow nonexistent interface numbers here.
1678 ifindex = 42
1679 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1680 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1681 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1682
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001683 def test_str_for_enums(self):
1684 # Make sure that the AF_* and SOCK_* constants have enum-like string
1685 # reprs.
1686 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1687 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001688 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001689
Yury Selivanov98181422017-12-18 20:02:54 -05001690 def test_socket_consistent_sock_type(self):
1691 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1692 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1693 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1694
1695 with socket.socket(socket.AF_INET, sock_type) as s:
1696 self.assertEqual(s.type, socket.SOCK_STREAM)
1697 s.settimeout(1)
1698 self.assertEqual(s.type, socket.SOCK_STREAM)
1699 s.settimeout(0)
1700 self.assertEqual(s.type, socket.SOCK_STREAM)
1701 s.setblocking(True)
1702 self.assertEqual(s.type, socket.SOCK_STREAM)
1703 s.setblocking(False)
1704 self.assertEqual(s.type, socket.SOCK_STREAM)
1705
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001706 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001707 # Test that when created with a family that's not one of the known
1708 # AF_*/SOCK_* constants, socket.family just returns the number.
1709 #
1710 # To do this we fool socket.socket into believing it already has an
1711 # open fd because on this path it doesn't actually verify the family and
1712 # type and populates the socket object.
Dima Tisneke9912702018-12-17 22:07:55 +09001713 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1714 fd = sock.detach()
Yury Selivanov98181422017-12-18 20:02:54 -05001715 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1716
1717 unknown_type = max(
1718 kind
1719 for name, kind in socket.SocketKind.__members__.items()
1720 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1721 ) + 1
1722
1723 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001724 family=unknown_family, type=unknown_type, proto=23,
1725 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001726 self.assertEqual(s.family, unknown_family)
1727 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001728 # some OS like macOS ignore proto
1729 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001730
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001731 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1732 def test__sendfile_use_sendfile(self):
1733 class File:
1734 def __init__(self, fd):
1735 self.fd = fd
1736
1737 def fileno(self):
1738 return self.fd
1739 with socket.socket() as sock:
1740 fd = os.open(os.curdir, os.O_RDONLY)
1741 os.close(fd)
1742 with self.assertRaises(socket._GiveupOnSendfile):
1743 sock._sendfile_use_sendfile(File(fd))
1744 with self.assertRaises(OverflowError):
1745 sock._sendfile_use_sendfile(File(2**1000))
1746 with self.assertRaises(TypeError):
1747 sock._sendfile_use_sendfile(File(None))
1748
Christian Heimesb6e43af2018-01-29 22:37:58 +01001749 def _test_socket_fileno(self, s, family, stype):
1750 self.assertEqual(s.family, family)
1751 self.assertEqual(s.type, stype)
1752
1753 fd = s.fileno()
1754 s2 = socket.socket(fileno=fd)
1755 self.addCleanup(s2.close)
1756 # detach old fd to avoid double close
1757 s.detach()
1758 self.assertEqual(s2.family, family)
1759 self.assertEqual(s2.type, stype)
1760 self.assertEqual(s2.fileno(), fd)
1761
1762 def test_socket_fileno(self):
1763 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1764 self.addCleanup(s.close)
1765 s.bind((support.HOST, 0))
1766 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1767
1768 if hasattr(socket, "SOCK_DGRAM"):
1769 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1770 self.addCleanup(s.close)
1771 s.bind((support.HOST, 0))
1772 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1773
1774 if support.IPV6_ENABLED:
1775 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1776 self.addCleanup(s.close)
1777 s.bind((support.HOSTv6, 0, 0, 0))
1778 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1779
1780 if hasattr(socket, "AF_UNIX"):
1781 tmpdir = tempfile.mkdtemp()
1782 self.addCleanup(shutil.rmtree, tmpdir)
1783 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1784 self.addCleanup(s.close)
1785 s.bind(os.path.join(tmpdir, 'socket'))
1786 self._test_socket_fileno(s, socket.AF_UNIX, socket.SOCK_STREAM)
1787
Dima Tisneke9912702018-12-17 22:07:55 +09001788 def test_socket_fileno_rejects_float(self):
1789 with self.assertRaisesRegex(TypeError, "integer argument expected"):
1790 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
1791
1792 def test_socket_fileno_rejects_other_types(self):
1793 with self.assertRaisesRegex(TypeError, "integer is required"):
1794 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
1795
1796 def test_socket_fileno_rejects_invalid_socket(self):
1797 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1798 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
1799
1800 @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
1801 def test_socket_fileno_rejects_negative(self):
1802 with self.assertRaisesRegex(ValueError, "negative file descriptor"):
1803 socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
1804
1805 def test_socket_fileno_requires_valid_fd(self):
1806 WSAENOTSOCK = 10038
1807 with self.assertRaises(OSError) as cm:
1808 socket.socket(fileno=support.make_bad_fd())
1809 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1810
1811 with self.assertRaises(OSError) as cm:
1812 socket.socket(
1813 socket.AF_INET,
1814 socket.SOCK_STREAM,
1815 fileno=support.make_bad_fd())
1816 self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
1817
1818 def test_socket_fileno_requires_socket_fd(self):
1819 with tempfile.NamedTemporaryFile() as afile:
1820 with self.assertRaises(OSError):
1821 socket.socket(fileno=afile.fileno())
1822
1823 with self.assertRaises(OSError) as cm:
1824 socket.socket(
1825 socket.AF_INET,
1826 socket.SOCK_STREAM,
1827 fileno=afile.fileno())
1828 self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
1829
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001830
Charles-François Natali47413c12011-10-06 19:47:44 +02001831@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1832class BasicCANTest(unittest.TestCase):
1833
1834 def testCrucialConstants(self):
1835 socket.AF_CAN
1836 socket.PF_CAN
1837 socket.CAN_RAW
1838
Charles-François Natali773e42d2013-02-05 19:42:01 +01001839 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1840 'socket.CAN_BCM required for this test.')
1841 def testBCMConstants(self):
1842 socket.CAN_BCM
1843
1844 # opcodes
1845 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1846 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1847 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1848 socket.CAN_BCM_TX_SEND # send one CAN frame
1849 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1850 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1851 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1852 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1853 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1854 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1855 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1856 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1857
Charles-François Natali47413c12011-10-06 19:47:44 +02001858 def testCreateSocket(self):
1859 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1860 pass
1861
Charles-François Natali773e42d2013-02-05 19:42:01 +01001862 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1863 'socket.CAN_BCM required for this test.')
1864 def testCreateBCMSocket(self):
1865 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1866 pass
1867
Charles-François Natali47413c12011-10-06 19:47:44 +02001868 def testBindAny(self):
1869 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1870 s.bind(('', ))
1871
1872 def testTooLongInterfaceName(self):
1873 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1874 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001875 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001876 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001877
1878 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1879 'socket.CAN_RAW_LOOPBACK required for this test.')
1880 def testLoopback(self):
1881 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1882 for loopback in (0, 1):
1883 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1884 loopback)
1885 self.assertEqual(loopback,
1886 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1887
1888 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1889 'socket.CAN_RAW_FILTER required for this test.')
1890 def testFilter(self):
1891 can_id, can_mask = 0x200, 0x700
1892 can_filter = struct.pack("=II", can_id, can_mask)
1893 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1894 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1895 self.assertEqual(can_filter,
1896 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001897 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001898
1899
1900@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001901class CANTest(ThreadedCANSocketTest):
1902
Charles-François Natali47413c12011-10-06 19:47:44 +02001903 def __init__(self, methodName='runTest'):
1904 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1905
1906 @classmethod
1907 def build_can_frame(cls, can_id, data):
1908 """Build a CAN frame."""
1909 can_dlc = len(data)
1910 data = data.ljust(8, b'\x00')
1911 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1912
1913 @classmethod
1914 def dissect_can_frame(cls, frame):
1915 """Dissect a CAN frame."""
1916 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1917 return (can_id, can_dlc, data[:can_dlc])
1918
1919 def testSendFrame(self):
1920 cf, addr = self.s.recvfrom(self.bufsize)
1921 self.assertEqual(self.cf, cf)
1922 self.assertEqual(addr[0], self.interface)
1923 self.assertEqual(addr[1], socket.AF_CAN)
1924
1925 def _testSendFrame(self):
1926 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1927 self.cli.send(self.cf)
1928
1929 def testSendMaxFrame(self):
1930 cf, addr = self.s.recvfrom(self.bufsize)
1931 self.assertEqual(self.cf, cf)
1932
1933 def _testSendMaxFrame(self):
1934 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1935 self.cli.send(self.cf)
1936
1937 def testSendMultiFrames(self):
1938 cf, addr = self.s.recvfrom(self.bufsize)
1939 self.assertEqual(self.cf1, cf)
1940
1941 cf, addr = self.s.recvfrom(self.bufsize)
1942 self.assertEqual(self.cf2, cf)
1943
1944 def _testSendMultiFrames(self):
1945 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1946 self.cli.send(self.cf1)
1947
1948 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1949 self.cli.send(self.cf2)
1950
Charles-François Natali773e42d2013-02-05 19:42:01 +01001951 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1952 'socket.CAN_BCM required for this test.')
1953 def _testBCM(self):
1954 cf, addr = self.cli.recvfrom(self.bufsize)
1955 self.assertEqual(self.cf, cf)
1956 can_id, can_dlc, data = self.dissect_can_frame(cf)
1957 self.assertEqual(self.can_id, can_id)
1958 self.assertEqual(self.data, data)
1959
1960 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1961 'socket.CAN_BCM required for this test.')
1962 def testBCM(self):
1963 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1964 self.addCleanup(bcm.close)
1965 bcm.connect((self.interface,))
1966 self.can_id = 0x123
1967 self.data = bytes([0xc0, 0xff, 0xee])
1968 self.cf = self.build_can_frame(self.can_id, self.data)
1969 opcode = socket.CAN_BCM_TX_SEND
1970 flags = 0
1971 count = 0
1972 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1973 bcm_can_id = 0x0222
1974 nframes = 1
1975 assert len(self.cf) == 16
1976 header = struct.pack(self.bcm_cmd_msg_fmt,
1977 opcode,
1978 flags,
1979 count,
1980 ival1_seconds,
1981 ival1_usec,
1982 ival2_seconds,
1983 ival2_usec,
1984 bcm_can_id,
1985 nframes,
1986 )
1987 header_plus_frame = header + self.cf
1988 bytes_sent = bcm.send(header_plus_frame)
1989 self.assertEqual(bytes_sent, len(header_plus_frame))
1990
Charles-François Natali47413c12011-10-06 19:47:44 +02001991
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001992@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1993class ISOTPTest(unittest.TestCase):
1994
1995 def __init__(self, *args, **kwargs):
1996 super().__init__(*args, **kwargs)
1997 self.interface = "vcan0"
1998
1999 def testCrucialConstants(self):
2000 socket.AF_CAN
2001 socket.PF_CAN
2002 socket.CAN_ISOTP
2003 socket.SOCK_DGRAM
2004
2005 def testCreateSocket(self):
2006 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
2007 pass
2008
2009 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
2010 'socket.CAN_ISOTP required for this test.')
2011 def testCreateISOTPSocket(self):
2012 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2013 pass
2014
2015 def testTooLongInterfaceName(self):
2016 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
2017 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2018 with self.assertRaisesRegex(OSError, 'interface name too long'):
2019 s.bind(('x' * 1024, 1, 2))
2020
2021 def testBind(self):
2022 try:
2023 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
2024 addr = self.interface, 0x123, 0x456
2025 s.bind(addr)
2026 self.assertEqual(s.getsockname(), addr)
2027 except OSError as e:
2028 if e.errno == errno.ENODEV:
2029 self.skipTest('network interface `%s` does not exist' %
2030 self.interface)
2031 else:
2032 raise
2033
2034
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002035@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
2036class BasicRDSTest(unittest.TestCase):
2037
2038 def testCrucialConstants(self):
2039 socket.AF_RDS
2040 socket.PF_RDS
2041
2042 def testCreateSocket(self):
2043 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2044 pass
2045
2046 def testSocketBufferSize(self):
2047 bufsize = 16384
2048 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2049 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2050 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2051
2052
2053@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002054class RDSTest(ThreadedRDSSocketTest):
2055
2056 def __init__(self, methodName='runTest'):
2057 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2058
Charles-François Natali240c55f2011-11-10 20:33:36 +01002059 def setUp(self):
2060 super().setUp()
2061 self.evt = threading.Event()
2062
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002063 def testSendAndRecv(self):
2064 data, addr = self.serv.recvfrom(self.bufsize)
2065 self.assertEqual(self.data, data)
2066 self.assertEqual(self.cli_addr, addr)
2067
2068 def _testSendAndRecv(self):
2069 self.data = b'spam'
2070 self.cli.sendto(self.data, 0, (HOST, self.port))
2071
2072 def testPeek(self):
2073 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2074 self.assertEqual(self.data, data)
2075 data, addr = self.serv.recvfrom(self.bufsize)
2076 self.assertEqual(self.data, data)
2077
2078 def _testPeek(self):
2079 self.data = b'spam'
2080 self.cli.sendto(self.data, 0, (HOST, self.port))
2081
2082 @requireAttrs(socket.socket, 'recvmsg')
2083 def testSendAndRecvMsg(self):
2084 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2085 self.assertEqual(self.data, data)
2086
2087 @requireAttrs(socket.socket, 'sendmsg')
2088 def _testSendAndRecvMsg(self):
2089 self.data = b'hello ' * 10
2090 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2091
2092 def testSendAndRecvMulti(self):
2093 data, addr = self.serv.recvfrom(self.bufsize)
2094 self.assertEqual(self.data1, data)
2095
2096 data, addr = self.serv.recvfrom(self.bufsize)
2097 self.assertEqual(self.data2, data)
2098
2099 def _testSendAndRecvMulti(self):
2100 self.data1 = b'bacon'
2101 self.cli.sendto(self.data1, 0, (HOST, self.port))
2102
2103 self.data2 = b'egg'
2104 self.cli.sendto(self.data2, 0, (HOST, self.port))
2105
2106 def testSelect(self):
2107 r, w, x = select.select([self.serv], [], [], 3.0)
2108 self.assertIn(self.serv, r)
2109 data, addr = self.serv.recvfrom(self.bufsize)
2110 self.assertEqual(self.data, data)
2111
2112 def _testSelect(self):
2113 self.data = b'select'
2114 self.cli.sendto(self.data, 0, (HOST, self.port))
2115
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002116@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2117 'QIPCRTR sockets required for this test.')
2118class BasicQIPCRTRTest(unittest.TestCase):
2119
2120 def testCrucialConstants(self):
2121 socket.AF_QIPCRTR
2122
2123 def testCreateSocket(self):
2124 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2125 pass
2126
2127 def testUnbound(self):
2128 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2129 self.assertEqual(s.getsockname()[1], 0)
2130
2131 def testBindSock(self):
2132 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2133 support.bind_port(s, host=s.getsockname()[0])
2134 self.assertNotEqual(s.getsockname()[1], 0)
2135
2136 def testInvalidBindSock(self):
2137 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2138 self.assertRaises(OSError, support.bind_port, s, host=-2)
2139
2140 def testAutoBindSock(self):
2141 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2142 s.connect((123, 123))
2143 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002144
caaveryeffc12f2017-09-06 18:18:10 -04002145@unittest.skipIf(fcntl is None, "need fcntl")
2146@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2147 'VSOCK sockets required for this test.')
2148class BasicVSOCKTest(unittest.TestCase):
2149
2150 def testCrucialConstants(self):
2151 socket.AF_VSOCK
2152
2153 def testVSOCKConstants(self):
2154 socket.SO_VM_SOCKETS_BUFFER_SIZE
2155 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2156 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2157 socket.VMADDR_CID_ANY
2158 socket.VMADDR_PORT_ANY
2159 socket.VMADDR_CID_HOST
2160 socket.VM_SOCKETS_INVALID_VERSION
2161 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2162
2163 def testCreateSocket(self):
2164 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2165 pass
2166
2167 def testSocketBufferSize(self):
2168 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2169 orig_max = s.getsockopt(socket.AF_VSOCK,
2170 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2171 orig = s.getsockopt(socket.AF_VSOCK,
2172 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2173 orig_min = s.getsockopt(socket.AF_VSOCK,
2174 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2175
2176 s.setsockopt(socket.AF_VSOCK,
2177 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2178 s.setsockopt(socket.AF_VSOCK,
2179 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2180 s.setsockopt(socket.AF_VSOCK,
2181 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2182
2183 self.assertEqual(orig_max * 2,
2184 s.getsockopt(socket.AF_VSOCK,
2185 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2186 self.assertEqual(orig * 2,
2187 s.getsockopt(socket.AF_VSOCK,
2188 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2189 self.assertEqual(orig_min * 2,
2190 s.getsockopt(socket.AF_VSOCK,
2191 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2192
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002193
Guido van Rossum24e4af82002-06-12 19:18:08 +00002194class BasicTCPTest(SocketConnectedTest):
2195
2196 def __init__(self, methodName='runTest'):
2197 SocketConnectedTest.__init__(self, methodName=methodName)
2198
2199 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002200 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002201 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002202 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002203
2204 def _testRecv(self):
2205 self.serv_conn.send(MSG)
2206
2207 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002208 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002209 seg1 = self.cli_conn.recv(len(MSG) - 3)
2210 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002211 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002212 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002213
2214 def _testOverFlowRecv(self):
2215 self.serv_conn.send(MSG)
2216
2217 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002218 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002219 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002220 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002221
2222 def _testRecvFrom(self):
2223 self.serv_conn.send(MSG)
2224
2225 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002226 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002227 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2228 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002229 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002230 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002231
2232 def _testOverFlowRecvFrom(self):
2233 self.serv_conn.send(MSG)
2234
2235 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002236 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002237 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002238 while 1:
2239 read = self.cli_conn.recv(1024)
2240 if not read:
2241 break
Guido van Rossume531e292002-08-08 20:28:34 +00002242 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002243 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002244
2245 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002246 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002247 self.serv_conn.sendall(big_chunk)
2248
2249 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002250 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002251 fd = self.cli_conn.fileno()
2252 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002253 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002254 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002255 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002256 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002257
2258 def _testFromFd(self):
2259 self.serv_conn.send(MSG)
2260
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002261 def testDup(self):
2262 # Testing dup()
2263 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002264 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002265 msg = sock.recv(1024)
2266 self.assertEqual(msg, MSG)
2267
2268 def _testDup(self):
2269 self.serv_conn.send(MSG)
2270
Guido van Rossum24e4af82002-06-12 19:18:08 +00002271 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002272 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002273 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002274 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002275 # wait for _testShutdown to finish: on OS X, when the server
2276 # closes the connection the client also becomes disconnected,
2277 # and the client's shutdown call will fail. (Issue #4397.)
2278 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002279
2280 def _testShutdown(self):
2281 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002282 self.serv_conn.shutdown(2)
2283
2284 testShutdown_overflow = support.cpython_only(testShutdown)
2285
2286 @support.cpython_only
2287 def _testShutdown_overflow(self):
2288 import _testcapi
2289 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002290 # Issue 15989
2291 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2292 _testcapi.INT_MAX + 1)
2293 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2294 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002295 self.serv_conn.shutdown(2)
2296
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002297 def testDetach(self):
2298 # Testing detach()
2299 fileno = self.cli_conn.fileno()
2300 f = self.cli_conn.detach()
2301 self.assertEqual(f, fileno)
2302 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002303 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002304 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002305 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002306 # ...but we can create another socket using the (still open)
2307 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002308 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002309 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002310 msg = sock.recv(1024)
2311 self.assertEqual(msg, MSG)
2312
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002313 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002314 self.serv_conn.send(MSG)
2315
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002316
Guido van Rossum24e4af82002-06-12 19:18:08 +00002317class BasicUDPTest(ThreadedUDPSocketTest):
2318
2319 def __init__(self, methodName='runTest'):
2320 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2321
2322 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002323 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002324 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002325 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002326
2327 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002328 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002329
Guido van Rossum1c938012002-06-12 21:17:20 +00002330 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002331 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002332 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002333 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002334
Guido van Rossum1c938012002-06-12 21:17:20 +00002335 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002336 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002337
Guido van Rossumd8faa362007-04-27 19:54:29 +00002338 def testRecvFromNegative(self):
2339 # Negative lengths passed to recvfrom should give ValueError.
2340 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2341
2342 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002343 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002344
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002345# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2346# same test code is used with different families and types of socket
2347# (e.g. stream, datagram), and tests using recvmsg() are repeated
2348# using recvmsg_into().
2349#
2350# The generic test classes such as SendmsgTests and
2351# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2352# supplied with sockets cli_sock and serv_sock representing the
2353# client's and the server's end of the connection respectively, and
2354# attributes cli_addr and serv_addr holding their (numeric where
2355# appropriate) addresses.
2356#
2357# The final concrete test classes combine these with subclasses of
2358# SocketTestBase which set up client and server sockets of a specific
2359# type, and with subclasses of SendrecvmsgBase such as
2360# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2361# sockets to cli_sock and serv_sock and override the methods and
2362# attributes of SendrecvmsgBase to fill in destination addresses if
2363# needed when sending, check for specific flags in msg_flags, etc.
2364#
2365# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2366# recvmsg_into().
2367
2368# XXX: like the other datagram (UDP) tests in this module, the code
2369# here assumes that datagram delivery on the local machine will be
2370# reliable.
2371
2372class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2373 # Base class for sendmsg()/recvmsg() tests.
2374
2375 # Time in seconds to wait before considering a test failed, or
2376 # None for no timeout. Not all tests actually set a timeout.
2377 fail_timeout = 3.0
2378
2379 def setUp(self):
2380 self.misc_event = threading.Event()
2381 super().setUp()
2382
2383 def sendToServer(self, msg):
2384 # Send msg to the server.
2385 return self.cli_sock.send(msg)
2386
2387 # Tuple of alternative default arguments for sendmsg() when called
2388 # via sendmsgToServer() (e.g. to include a destination address).
2389 sendmsg_to_server_defaults = ()
2390
2391 def sendmsgToServer(self, *args):
2392 # Call sendmsg() on self.cli_sock with the given arguments,
2393 # filling in any arguments which are not supplied with the
2394 # corresponding items of self.sendmsg_to_server_defaults, if
2395 # any.
2396 return self.cli_sock.sendmsg(
2397 *(args + self.sendmsg_to_server_defaults[len(args):]))
2398
2399 def doRecvmsg(self, sock, bufsize, *args):
2400 # Call recvmsg() on sock with given arguments and return its
2401 # result. Should be used for tests which can use either
2402 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2403 # this method with one which emulates it using recvmsg_into(),
2404 # thus allowing the same test to be used for both methods.
2405 result = sock.recvmsg(bufsize, *args)
2406 self.registerRecvmsgResult(result)
2407 return result
2408
2409 def registerRecvmsgResult(self, result):
2410 # Called by doRecvmsg() with the return value of recvmsg() or
2411 # recvmsg_into(). Can be overridden to arrange cleanup based
2412 # on the returned ancillary data, for instance.
2413 pass
2414
2415 def checkRecvmsgAddress(self, addr1, addr2):
2416 # Called to compare the received address with the address of
2417 # the peer.
2418 self.assertEqual(addr1, addr2)
2419
2420 # Flags that are normally unset in msg_flags
2421 msg_flags_common_unset = 0
2422 for name in ("MSG_CTRUNC", "MSG_OOB"):
2423 msg_flags_common_unset |= getattr(socket, name, 0)
2424
2425 # Flags that are normally set
2426 msg_flags_common_set = 0
2427
2428 # Flags set when a complete record has been received (e.g. MSG_EOR
2429 # for SCTP)
2430 msg_flags_eor_indicator = 0
2431
2432 # Flags set when a complete record has not been received
2433 # (e.g. MSG_TRUNC for datagram sockets)
2434 msg_flags_non_eor_indicator = 0
2435
2436 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2437 # Method to check the value of msg_flags returned by recvmsg[_into]().
2438 #
2439 # Checks that all bits in msg_flags_common_set attribute are
2440 # set in "flags" and all bits in msg_flags_common_unset are
2441 # unset.
2442 #
2443 # The "eor" argument specifies whether the flags should
2444 # indicate that a full record (or datagram) has been received.
2445 # If "eor" is None, no checks are done; otherwise, checks
2446 # that:
2447 #
2448 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2449 # set and all bits in msg_flags_non_eor_indicator are unset
2450 #
2451 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2452 # are set and all bits in msg_flags_eor_indicator are unset
2453 #
2454 # If "checkset" and/or "checkunset" are supplied, they require
2455 # the given bits to be set or unset respectively, overriding
2456 # what the attributes require for those bits.
2457 #
2458 # If any bits are set in "ignore", they will not be checked,
2459 # regardless of the other inputs.
2460 #
2461 # Will raise Exception if the inputs require a bit to be both
2462 # set and unset, and it is not ignored.
2463
2464 defaultset = self.msg_flags_common_set
2465 defaultunset = self.msg_flags_common_unset
2466
2467 if eor:
2468 defaultset |= self.msg_flags_eor_indicator
2469 defaultunset |= self.msg_flags_non_eor_indicator
2470 elif eor is not None:
2471 defaultset |= self.msg_flags_non_eor_indicator
2472 defaultunset |= self.msg_flags_eor_indicator
2473
2474 # Function arguments override defaults
2475 defaultset &= ~checkunset
2476 defaultunset &= ~checkset
2477
2478 # Merge arguments with remaining defaults, and check for conflicts
2479 checkset |= defaultset
2480 checkunset |= defaultunset
2481 inboth = checkset & checkunset & ~ignore
2482 if inboth:
2483 raise Exception("contradictory set, unset requirements for flags "
2484 "{0:#x}".format(inboth))
2485
2486 # Compare with given msg_flags value
2487 mask = (checkset | checkunset) & ~ignore
2488 self.assertEqual(flags & mask, checkset & mask)
2489
2490
2491class RecvmsgIntoMixin(SendrecvmsgBase):
2492 # Mixin to implement doRecvmsg() using recvmsg_into().
2493
2494 def doRecvmsg(self, sock, bufsize, *args):
2495 buf = bytearray(bufsize)
2496 result = sock.recvmsg_into([buf], *args)
2497 self.registerRecvmsgResult(result)
2498 self.assertGreaterEqual(result[0], 0)
2499 self.assertLessEqual(result[0], bufsize)
2500 return (bytes(buf[:result[0]]),) + result[1:]
2501
2502
2503class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2504 # Defines flags to be checked in msg_flags for datagram sockets.
2505
2506 @property
2507 def msg_flags_non_eor_indicator(self):
2508 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2509
2510
2511class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2512 # Defines flags to be checked in msg_flags for SCTP sockets.
2513
2514 @property
2515 def msg_flags_eor_indicator(self):
2516 return super().msg_flags_eor_indicator | socket.MSG_EOR
2517
2518
2519class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2520 # Base class for tests on connectionless-mode sockets. Users must
2521 # supply sockets on attributes cli and serv to be mapped to
2522 # cli_sock and serv_sock respectively.
2523
2524 @property
2525 def serv_sock(self):
2526 return self.serv
2527
2528 @property
2529 def cli_sock(self):
2530 return self.cli
2531
2532 @property
2533 def sendmsg_to_server_defaults(self):
2534 return ([], [], 0, self.serv_addr)
2535
2536 def sendToServer(self, msg):
2537 return self.cli_sock.sendto(msg, self.serv_addr)
2538
2539
2540class SendrecvmsgConnectedBase(SendrecvmsgBase):
2541 # Base class for tests on connected sockets. Users must supply
2542 # sockets on attributes serv_conn and cli_conn (representing the
2543 # connections *to* the server and the client), to be mapped to
2544 # cli_sock and serv_sock respectively.
2545
2546 @property
2547 def serv_sock(self):
2548 return self.cli_conn
2549
2550 @property
2551 def cli_sock(self):
2552 return self.serv_conn
2553
2554 def checkRecvmsgAddress(self, addr1, addr2):
2555 # Address is currently "unspecified" for a connected socket,
2556 # so we don't examine it
2557 pass
2558
2559
2560class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2561 # Base class to set a timeout on server's socket.
2562
2563 def setUp(self):
2564 super().setUp()
2565 self.serv_sock.settimeout(self.fail_timeout)
2566
2567
2568class SendmsgTests(SendrecvmsgServerTimeoutBase):
2569 # Tests for sendmsg() which can use any socket type and do not
2570 # involve recvmsg() or recvmsg_into().
2571
2572 def testSendmsg(self):
2573 # Send a simple message with sendmsg().
2574 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2575
2576 def _testSendmsg(self):
2577 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2578
2579 def testSendmsgDataGenerator(self):
2580 # Send from buffer obtained from a generator (not a sequence).
2581 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2582
2583 def _testSendmsgDataGenerator(self):
2584 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2585 len(MSG))
2586
2587 def testSendmsgAncillaryGenerator(self):
2588 # Gather (empty) ancillary data from a generator.
2589 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2590
2591 def _testSendmsgAncillaryGenerator(self):
2592 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2593 len(MSG))
2594
2595 def testSendmsgArray(self):
2596 # Send data from an array instead of the usual bytes object.
2597 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2598
2599 def _testSendmsgArray(self):
2600 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2601 len(MSG))
2602
2603 def testSendmsgGather(self):
2604 # Send message data from more than one buffer (gather write).
2605 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2606
2607 def _testSendmsgGather(self):
2608 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2609
2610 def testSendmsgBadArgs(self):
2611 # Check that sendmsg() rejects invalid arguments.
2612 self.assertEqual(self.serv_sock.recv(1000), b"done")
2613
2614 def _testSendmsgBadArgs(self):
2615 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2616 self.assertRaises(TypeError, self.sendmsgToServer,
2617 b"not in an iterable")
2618 self.assertRaises(TypeError, self.sendmsgToServer,
2619 object())
2620 self.assertRaises(TypeError, self.sendmsgToServer,
2621 [object()])
2622 self.assertRaises(TypeError, self.sendmsgToServer,
2623 [MSG, object()])
2624 self.assertRaises(TypeError, self.sendmsgToServer,
2625 [MSG], object())
2626 self.assertRaises(TypeError, self.sendmsgToServer,
2627 [MSG], [], object())
2628 self.assertRaises(TypeError, self.sendmsgToServer,
2629 [MSG], [], 0, object())
2630 self.sendToServer(b"done")
2631
2632 def testSendmsgBadCmsg(self):
2633 # Check that invalid ancillary data items are rejected.
2634 self.assertEqual(self.serv_sock.recv(1000), b"done")
2635
2636 def _testSendmsgBadCmsg(self):
2637 self.assertRaises(TypeError, self.sendmsgToServer,
2638 [MSG], [object()])
2639 self.assertRaises(TypeError, self.sendmsgToServer,
2640 [MSG], [(object(), 0, b"data")])
2641 self.assertRaises(TypeError, self.sendmsgToServer,
2642 [MSG], [(0, object(), b"data")])
2643 self.assertRaises(TypeError, self.sendmsgToServer,
2644 [MSG], [(0, 0, object())])
2645 self.assertRaises(TypeError, self.sendmsgToServer,
2646 [MSG], [(0, 0)])
2647 self.assertRaises(TypeError, self.sendmsgToServer,
2648 [MSG], [(0, 0, b"data", 42)])
2649 self.sendToServer(b"done")
2650
2651 @requireAttrs(socket, "CMSG_SPACE")
2652 def testSendmsgBadMultiCmsg(self):
2653 # Check that invalid ancillary data items are rejected when
2654 # more than one item is present.
2655 self.assertEqual(self.serv_sock.recv(1000), b"done")
2656
2657 @testSendmsgBadMultiCmsg.client_skip
2658 def _testSendmsgBadMultiCmsg(self):
2659 self.assertRaises(TypeError, self.sendmsgToServer,
2660 [MSG], [0, 0, b""])
2661 self.assertRaises(TypeError, self.sendmsgToServer,
2662 [MSG], [(0, 0, b""), object()])
2663 self.sendToServer(b"done")
2664
2665 def testSendmsgExcessCmsgReject(self):
2666 # Check that sendmsg() rejects excess ancillary data items
2667 # when the number that can be sent is limited.
2668 self.assertEqual(self.serv_sock.recv(1000), b"done")
2669
2670 def _testSendmsgExcessCmsgReject(self):
2671 if not hasattr(socket, "CMSG_SPACE"):
2672 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002673 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002674 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2675 self.assertIsNone(cm.exception.errno)
2676 self.sendToServer(b"done")
2677
2678 def testSendmsgAfterClose(self):
2679 # Check that sendmsg() fails on a closed socket.
2680 pass
2681
2682 def _testSendmsgAfterClose(self):
2683 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002684 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002685
2686
2687class SendmsgStreamTests(SendmsgTests):
2688 # Tests for sendmsg() which require a stream socket and do not
2689 # involve recvmsg() or recvmsg_into().
2690
2691 def testSendmsgExplicitNoneAddr(self):
2692 # Check that peer address can be specified as None.
2693 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2694
2695 def _testSendmsgExplicitNoneAddr(self):
2696 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2697
2698 def testSendmsgTimeout(self):
2699 # Check that timeout works with sendmsg().
2700 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2701 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2702
2703 def _testSendmsgTimeout(self):
2704 try:
2705 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002706 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002707 while True:
2708 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002709 except socket.timeout:
2710 pass
2711 except OSError as exc:
2712 if exc.errno != errno.ENOMEM:
2713 raise
2714 # bpo-33937 the test randomly fails on Travis CI with
2715 # "OSError: [Errno 12] Cannot allocate memory"
2716 else:
2717 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002718 finally:
2719 self.misc_event.set()
2720
2721 # XXX: would be nice to have more tests for sendmsg flags argument.
2722
2723 # Linux supports MSG_DONTWAIT when sending, but in general, it
2724 # only works when receiving. Could add other platforms if they
2725 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002726 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002727 "MSG_DONTWAIT not known to work on this platform when "
2728 "sending")
2729 def testSendmsgDontWait(self):
2730 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2731 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2732 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2733
2734 @testSendmsgDontWait.client_skip
2735 def _testSendmsgDontWait(self):
2736 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002737 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002738 while True:
2739 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002740 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2741 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002742 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002743 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002744 finally:
2745 self.misc_event.set()
2746
2747
2748class SendmsgConnectionlessTests(SendmsgTests):
2749 # Tests for sendmsg() which require a connectionless-mode
2750 # (e.g. datagram) socket, and do not involve recvmsg() or
2751 # recvmsg_into().
2752
2753 def testSendmsgNoDestAddr(self):
2754 # Check that sendmsg() fails when no destination address is
2755 # given for unconnected socket.
2756 pass
2757
2758 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002759 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002760 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002761 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002762 [MSG], [], 0, None)
2763
2764
2765class RecvmsgGenericTests(SendrecvmsgBase):
2766 # Tests for recvmsg() which can also be emulated using
2767 # recvmsg_into(), and can use any socket type.
2768
2769 def testRecvmsg(self):
2770 # Receive a simple message with recvmsg[_into]().
2771 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2772 self.assertEqual(msg, MSG)
2773 self.checkRecvmsgAddress(addr, self.cli_addr)
2774 self.assertEqual(ancdata, [])
2775 self.checkFlags(flags, eor=True)
2776
2777 def _testRecvmsg(self):
2778 self.sendToServer(MSG)
2779
2780 def testRecvmsgExplicitDefaults(self):
2781 # Test recvmsg[_into]() with default arguments provided explicitly.
2782 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2783 len(MSG), 0, 0)
2784 self.assertEqual(msg, MSG)
2785 self.checkRecvmsgAddress(addr, self.cli_addr)
2786 self.assertEqual(ancdata, [])
2787 self.checkFlags(flags, eor=True)
2788
2789 def _testRecvmsgExplicitDefaults(self):
2790 self.sendToServer(MSG)
2791
2792 def testRecvmsgShorter(self):
2793 # Receive a message smaller than buffer.
2794 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2795 len(MSG) + 42)
2796 self.assertEqual(msg, MSG)
2797 self.checkRecvmsgAddress(addr, self.cli_addr)
2798 self.assertEqual(ancdata, [])
2799 self.checkFlags(flags, eor=True)
2800
2801 def _testRecvmsgShorter(self):
2802 self.sendToServer(MSG)
2803
2804 def testRecvmsgTrunc(self):
2805 # Receive part of message, check for truncation indicators.
2806 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2807 len(MSG) - 3)
2808 self.assertEqual(msg, MSG[:-3])
2809 self.checkRecvmsgAddress(addr, self.cli_addr)
2810 self.assertEqual(ancdata, [])
2811 self.checkFlags(flags, eor=False)
2812
2813 def _testRecvmsgTrunc(self):
2814 self.sendToServer(MSG)
2815
2816 def testRecvmsgShortAncillaryBuf(self):
2817 # Test ancillary data buffer too small to hold any ancillary data.
2818 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2819 len(MSG), 1)
2820 self.assertEqual(msg, MSG)
2821 self.checkRecvmsgAddress(addr, self.cli_addr)
2822 self.assertEqual(ancdata, [])
2823 self.checkFlags(flags, eor=True)
2824
2825 def _testRecvmsgShortAncillaryBuf(self):
2826 self.sendToServer(MSG)
2827
2828 def testRecvmsgLongAncillaryBuf(self):
2829 # Test large ancillary data buffer.
2830 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2831 len(MSG), 10240)
2832 self.assertEqual(msg, MSG)
2833 self.checkRecvmsgAddress(addr, self.cli_addr)
2834 self.assertEqual(ancdata, [])
2835 self.checkFlags(flags, eor=True)
2836
2837 def _testRecvmsgLongAncillaryBuf(self):
2838 self.sendToServer(MSG)
2839
2840 def testRecvmsgAfterClose(self):
2841 # Check that recvmsg[_into]() fails on a closed socket.
2842 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002843 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002844
2845 def _testRecvmsgAfterClose(self):
2846 pass
2847
2848 def testRecvmsgTimeout(self):
2849 # Check that timeout works.
2850 try:
2851 self.serv_sock.settimeout(0.03)
2852 self.assertRaises(socket.timeout,
2853 self.doRecvmsg, self.serv_sock, len(MSG))
2854 finally:
2855 self.misc_event.set()
2856
2857 def _testRecvmsgTimeout(self):
2858 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2859
2860 @requireAttrs(socket, "MSG_PEEK")
2861 def testRecvmsgPeek(self):
2862 # Check that MSG_PEEK in flags enables examination of pending
2863 # data without consuming it.
2864
2865 # Receive part of data with MSG_PEEK.
2866 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2867 len(MSG) - 3, 0,
2868 socket.MSG_PEEK)
2869 self.assertEqual(msg, MSG[:-3])
2870 self.checkRecvmsgAddress(addr, self.cli_addr)
2871 self.assertEqual(ancdata, [])
2872 # Ignoring MSG_TRUNC here (so this test is the same for stream
2873 # and datagram sockets). Some wording in POSIX seems to
2874 # suggest that it needn't be set when peeking, but that may
2875 # just be a slip.
2876 self.checkFlags(flags, eor=False,
2877 ignore=getattr(socket, "MSG_TRUNC", 0))
2878
2879 # Receive all data with MSG_PEEK.
2880 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2881 len(MSG), 0,
2882 socket.MSG_PEEK)
2883 self.assertEqual(msg, MSG)
2884 self.checkRecvmsgAddress(addr, self.cli_addr)
2885 self.assertEqual(ancdata, [])
2886 self.checkFlags(flags, eor=True)
2887
2888 # Check that the same data can still be received normally.
2889 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2890 self.assertEqual(msg, MSG)
2891 self.checkRecvmsgAddress(addr, self.cli_addr)
2892 self.assertEqual(ancdata, [])
2893 self.checkFlags(flags, eor=True)
2894
2895 @testRecvmsgPeek.client_skip
2896 def _testRecvmsgPeek(self):
2897 self.sendToServer(MSG)
2898
2899 @requireAttrs(socket.socket, "sendmsg")
2900 def testRecvmsgFromSendmsg(self):
2901 # Test receiving with recvmsg[_into]() when message is sent
2902 # using sendmsg().
2903 self.serv_sock.settimeout(self.fail_timeout)
2904 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2905 self.assertEqual(msg, MSG)
2906 self.checkRecvmsgAddress(addr, self.cli_addr)
2907 self.assertEqual(ancdata, [])
2908 self.checkFlags(flags, eor=True)
2909
2910 @testRecvmsgFromSendmsg.client_skip
2911 def _testRecvmsgFromSendmsg(self):
2912 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2913
2914
2915class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2916 # Tests which require a stream socket and can use either recvmsg()
2917 # or recvmsg_into().
2918
2919 def testRecvmsgEOF(self):
2920 # Receive end-of-stream indicator (b"", peer socket closed).
2921 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2922 self.assertEqual(msg, b"")
2923 self.checkRecvmsgAddress(addr, self.cli_addr)
2924 self.assertEqual(ancdata, [])
2925 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2926
2927 def _testRecvmsgEOF(self):
2928 self.cli_sock.close()
2929
2930 def testRecvmsgOverflow(self):
2931 # Receive a message in more than one chunk.
2932 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2933 len(MSG) - 3)
2934 self.checkRecvmsgAddress(addr, self.cli_addr)
2935 self.assertEqual(ancdata, [])
2936 self.checkFlags(flags, eor=False)
2937
2938 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2939 self.checkRecvmsgAddress(addr, self.cli_addr)
2940 self.assertEqual(ancdata, [])
2941 self.checkFlags(flags, eor=True)
2942
2943 msg = seg1 + seg2
2944 self.assertEqual(msg, MSG)
2945
2946 def _testRecvmsgOverflow(self):
2947 self.sendToServer(MSG)
2948
2949
2950class RecvmsgTests(RecvmsgGenericTests):
2951 # Tests for recvmsg() which can use any socket type.
2952
2953 def testRecvmsgBadArgs(self):
2954 # Check that recvmsg() rejects invalid arguments.
2955 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2956 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2957 -1, 0, 0)
2958 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2959 len(MSG), -1, 0)
2960 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2961 [bytearray(10)], 0, 0)
2962 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2963 object(), 0, 0)
2964 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2965 len(MSG), object(), 0)
2966 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2967 len(MSG), 0, object())
2968
2969 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2970 self.assertEqual(msg, MSG)
2971 self.checkRecvmsgAddress(addr, self.cli_addr)
2972 self.assertEqual(ancdata, [])
2973 self.checkFlags(flags, eor=True)
2974
2975 def _testRecvmsgBadArgs(self):
2976 self.sendToServer(MSG)
2977
2978
2979class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2980 # Tests for recvmsg_into() which can use any socket type.
2981
2982 def testRecvmsgIntoBadArgs(self):
2983 # Check that recvmsg_into() rejects invalid arguments.
2984 buf = bytearray(len(MSG))
2985 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2986 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2987 len(MSG), 0, 0)
2988 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2989 buf, 0, 0)
2990 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2991 [object()], 0, 0)
2992 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2993 [b"I'm not writable"], 0, 0)
2994 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2995 [buf, object()], 0, 0)
2996 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2997 [buf], -1, 0)
2998 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2999 [buf], object(), 0)
3000 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
3001 [buf], 0, object())
3002
3003 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
3004 self.assertEqual(nbytes, len(MSG))
3005 self.assertEqual(buf, bytearray(MSG))
3006 self.checkRecvmsgAddress(addr, self.cli_addr)
3007 self.assertEqual(ancdata, [])
3008 self.checkFlags(flags, eor=True)
3009
3010 def _testRecvmsgIntoBadArgs(self):
3011 self.sendToServer(MSG)
3012
3013 def testRecvmsgIntoGenerator(self):
3014 # Receive into buffer obtained from a generator (not a sequence).
3015 buf = bytearray(len(MSG))
3016 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3017 (o for o in [buf]))
3018 self.assertEqual(nbytes, len(MSG))
3019 self.assertEqual(buf, bytearray(MSG))
3020 self.checkRecvmsgAddress(addr, self.cli_addr)
3021 self.assertEqual(ancdata, [])
3022 self.checkFlags(flags, eor=True)
3023
3024 def _testRecvmsgIntoGenerator(self):
3025 self.sendToServer(MSG)
3026
3027 def testRecvmsgIntoArray(self):
3028 # Receive into an array rather than the usual bytearray.
3029 buf = array.array("B", [0] * len(MSG))
3030 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
3031 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003032 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003033 self.checkRecvmsgAddress(addr, self.cli_addr)
3034 self.assertEqual(ancdata, [])
3035 self.checkFlags(flags, eor=True)
3036
3037 def _testRecvmsgIntoArray(self):
3038 self.sendToServer(MSG)
3039
3040 def testRecvmsgIntoScatter(self):
3041 # Receive into multiple buffers (scatter write).
3042 b1 = bytearray(b"----")
3043 b2 = bytearray(b"0123456789")
3044 b3 = bytearray(b"--------------")
3045 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3046 [b1, memoryview(b2)[2:9], b3])
3047 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3048 self.assertEqual(b1, bytearray(b"Mary"))
3049 self.assertEqual(b2, bytearray(b"01 had a 9"))
3050 self.assertEqual(b3, bytearray(b"little lamb---"))
3051 self.checkRecvmsgAddress(addr, self.cli_addr)
3052 self.assertEqual(ancdata, [])
3053 self.checkFlags(flags, eor=True)
3054
3055 def _testRecvmsgIntoScatter(self):
3056 self.sendToServer(b"Mary had a little lamb")
3057
3058
3059class CmsgMacroTests(unittest.TestCase):
3060 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3061 # assumptions used by sendmsg() and recvmsg[_into](), which share
3062 # code with these functions.
3063
3064 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003065 try:
3066 import _testcapi
3067 except ImportError:
3068 socklen_t_limit = 0x7fffffff
3069 else:
3070 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003071
3072 @requireAttrs(socket, "CMSG_LEN")
3073 def testCMSG_LEN(self):
3074 # Test CMSG_LEN() with various valid and invalid values,
3075 # checking the assumptions used by recvmsg() and sendmsg().
3076 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3077 values = list(range(257)) + list(range(toobig - 257, toobig))
3078
3079 # struct cmsghdr has at least three members, two of which are ints
3080 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3081 for n in values:
3082 ret = socket.CMSG_LEN(n)
3083 # This is how recvmsg() calculates the data size
3084 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3085 self.assertLessEqual(ret, self.socklen_t_limit)
3086
3087 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3088 # sendmsg() shares code with these functions, and requires
3089 # that it reject values over the limit.
3090 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3091 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3092
3093 @requireAttrs(socket, "CMSG_SPACE")
3094 def testCMSG_SPACE(self):
3095 # Test CMSG_SPACE() with various valid and invalid values,
3096 # checking the assumptions used by sendmsg().
3097 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3098 values = list(range(257)) + list(range(toobig - 257, toobig))
3099
3100 last = socket.CMSG_SPACE(0)
3101 # struct cmsghdr has at least three members, two of which are ints
3102 self.assertGreater(last, array.array("i").itemsize * 2)
3103 for n in values:
3104 ret = socket.CMSG_SPACE(n)
3105 self.assertGreaterEqual(ret, last)
3106 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3107 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3108 self.assertLessEqual(ret, self.socklen_t_limit)
3109 last = ret
3110
3111 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3112 # sendmsg() shares code with these functions, and requires
3113 # that it reject values over the limit.
3114 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3115 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3116
3117
3118class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3119 # Tests for file descriptor passing on Unix-domain sockets.
3120
3121 # Invalid file descriptor value that's unlikely to evaluate to a
3122 # real FD even if one of its bytes is replaced with a different
3123 # value (which shouldn't actually happen).
3124 badfd = -0x5555
3125
3126 def newFDs(self, n):
3127 # Return a list of n file descriptors for newly-created files
3128 # containing their list indices as ASCII numbers.
3129 fds = []
3130 for i in range(n):
3131 fd, path = tempfile.mkstemp()
3132 self.addCleanup(os.unlink, path)
3133 self.addCleanup(os.close, fd)
3134 os.write(fd, str(i).encode())
3135 fds.append(fd)
3136 return fds
3137
3138 def checkFDs(self, fds):
3139 # Check that the file descriptors in the given list contain
3140 # their correct list indices as ASCII numbers.
3141 for n, fd in enumerate(fds):
3142 os.lseek(fd, 0, os.SEEK_SET)
3143 self.assertEqual(os.read(fd, 1024), str(n).encode())
3144
3145 def registerRecvmsgResult(self, result):
3146 self.addCleanup(self.closeRecvmsgFDs, result)
3147
3148 def closeRecvmsgFDs(self, recvmsg_result):
3149 # Close all file descriptors specified in the ancillary data
3150 # of the given return value from recvmsg() or recvmsg_into().
3151 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3152 if (cmsg_level == socket.SOL_SOCKET and
3153 cmsg_type == socket.SCM_RIGHTS):
3154 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003155 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003156 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3157 for fd in fds:
3158 os.close(fd)
3159
3160 def createAndSendFDs(self, n):
3161 # Send n new file descriptors created by newFDs() to the
3162 # server, with the constant MSG as the non-ancillary data.
3163 self.assertEqual(
3164 self.sendmsgToServer([MSG],
3165 [(socket.SOL_SOCKET,
3166 socket.SCM_RIGHTS,
3167 array.array("i", self.newFDs(n)))]),
3168 len(MSG))
3169
3170 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3171 # Check that constant MSG was received with numfds file
3172 # descriptors in a maximum of maxcmsgs control messages (which
3173 # must contain only complete integers). By default, check
3174 # that MSG_CTRUNC is unset, but ignore any flags in
3175 # ignoreflags.
3176 msg, ancdata, flags, addr = result
3177 self.assertEqual(msg, MSG)
3178 self.checkRecvmsgAddress(addr, self.cli_addr)
3179 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3180 ignore=ignoreflags)
3181
3182 self.assertIsInstance(ancdata, list)
3183 self.assertLessEqual(len(ancdata), maxcmsgs)
3184 fds = array.array("i")
3185 for item in ancdata:
3186 self.assertIsInstance(item, tuple)
3187 cmsg_level, cmsg_type, cmsg_data = item
3188 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3189 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3190 self.assertIsInstance(cmsg_data, bytes)
3191 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003192 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003193
3194 self.assertEqual(len(fds), numfds)
3195 self.checkFDs(fds)
3196
3197 def testFDPassSimple(self):
3198 # Pass a single FD (array read from bytes object).
3199 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3200 len(MSG), 10240))
3201
3202 def _testFDPassSimple(self):
3203 self.assertEqual(
3204 self.sendmsgToServer(
3205 [MSG],
3206 [(socket.SOL_SOCKET,
3207 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003208 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003209 len(MSG))
3210
3211 def testMultipleFDPass(self):
3212 # Pass multiple FDs in a single array.
3213 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3214 len(MSG), 10240))
3215
3216 def _testMultipleFDPass(self):
3217 self.createAndSendFDs(4)
3218
3219 @requireAttrs(socket, "CMSG_SPACE")
3220 def testFDPassCMSG_SPACE(self):
3221 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3222 self.checkRecvmsgFDs(
3223 4, self.doRecvmsg(self.serv_sock, len(MSG),
3224 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3225
3226 @testFDPassCMSG_SPACE.client_skip
3227 def _testFDPassCMSG_SPACE(self):
3228 self.createAndSendFDs(4)
3229
3230 def testFDPassCMSG_LEN(self):
3231 # Test using CMSG_LEN() to calculate ancillary buffer size.
3232 self.checkRecvmsgFDs(1,
3233 self.doRecvmsg(self.serv_sock, len(MSG),
3234 socket.CMSG_LEN(4 * SIZEOF_INT)),
3235 # RFC 3542 says implementations may set
3236 # MSG_CTRUNC if there isn't enough space
3237 # for trailing padding.
3238 ignoreflags=socket.MSG_CTRUNC)
3239
3240 def _testFDPassCMSG_LEN(self):
3241 self.createAndSendFDs(1)
3242
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003243 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003244 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003245 @requireAttrs(socket, "CMSG_SPACE")
3246 def testFDPassSeparate(self):
3247 # Pass two FDs in two separate arrays. Arrays may be combined
3248 # into a single control message by the OS.
3249 self.checkRecvmsgFDs(2,
3250 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3251 maxcmsgs=2)
3252
3253 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003254 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003255 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003256 def _testFDPassSeparate(self):
3257 fd0, fd1 = self.newFDs(2)
3258 self.assertEqual(
3259 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3260 socket.SCM_RIGHTS,
3261 array.array("i", [fd0])),
3262 (socket.SOL_SOCKET,
3263 socket.SCM_RIGHTS,
3264 array.array("i", [fd1]))]),
3265 len(MSG))
3266
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003267 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003268 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003269 @requireAttrs(socket, "CMSG_SPACE")
3270 def testFDPassSeparateMinSpace(self):
3271 # Pass two FDs in two separate arrays, receiving them into the
3272 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003273 num_fds = 2
3274 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003275 self.doRecvmsg(self.serv_sock, len(MSG),
3276 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003277 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003278 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3279
3280 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003281 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Michael Felt56614592018-12-26 04:34:37 +01003282 @unittest.skipIf(AIX, "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003283 def _testFDPassSeparateMinSpace(self):
3284 fd0, fd1 = self.newFDs(2)
3285 self.assertEqual(
3286 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3287 socket.SCM_RIGHTS,
3288 array.array("i", [fd0])),
3289 (socket.SOL_SOCKET,
3290 socket.SCM_RIGHTS,
3291 array.array("i", [fd1]))]),
3292 len(MSG))
3293
3294 def sendAncillaryIfPossible(self, msg, ancdata):
3295 # Try to send msg and ancdata to server, but if the system
3296 # call fails, just send msg with no ancillary data.
3297 try:
3298 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003299 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003300 # Check that it was the system call that failed
3301 self.assertIsInstance(e.errno, int)
3302 nbytes = self.sendmsgToServer([msg])
3303 self.assertEqual(nbytes, len(msg))
3304
Brett Cannon3bbad122015-12-28 17:21:44 -08003305 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003306 def testFDPassEmpty(self):
3307 # Try to pass an empty FD array. Can receive either no array
3308 # or an empty array.
3309 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3310 len(MSG), 10240),
3311 ignoreflags=socket.MSG_CTRUNC)
3312
3313 def _testFDPassEmpty(self):
3314 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3315 socket.SCM_RIGHTS,
3316 b"")])
3317
3318 def testFDPassPartialInt(self):
3319 # Try to pass a truncated FD array.
3320 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3321 len(MSG), 10240)
3322 self.assertEqual(msg, MSG)
3323 self.checkRecvmsgAddress(addr, self.cli_addr)
3324 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3325 self.assertLessEqual(len(ancdata), 1)
3326 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3327 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3328 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3329 self.assertLess(len(cmsg_data), SIZEOF_INT)
3330
3331 def _testFDPassPartialInt(self):
3332 self.sendAncillaryIfPossible(
3333 MSG,
3334 [(socket.SOL_SOCKET,
3335 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003336 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003337
3338 @requireAttrs(socket, "CMSG_SPACE")
3339 def testFDPassPartialIntInMiddle(self):
3340 # Try to pass two FD arrays, the first of which is truncated.
3341 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3342 len(MSG), 10240)
3343 self.assertEqual(msg, MSG)
3344 self.checkRecvmsgAddress(addr, self.cli_addr)
3345 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3346 self.assertLessEqual(len(ancdata), 2)
3347 fds = array.array("i")
3348 # Arrays may have been combined in a single control message
3349 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3350 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3351 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003352 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003353 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3354 self.assertLessEqual(len(fds), 2)
3355 self.checkFDs(fds)
3356
3357 @testFDPassPartialIntInMiddle.client_skip
3358 def _testFDPassPartialIntInMiddle(self):
3359 fd0, fd1 = self.newFDs(2)
3360 self.sendAncillaryIfPossible(
3361 MSG,
3362 [(socket.SOL_SOCKET,
3363 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003364 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003365 (socket.SOL_SOCKET,
3366 socket.SCM_RIGHTS,
3367 array.array("i", [fd1]))])
3368
3369 def checkTruncatedHeader(self, result, ignoreflags=0):
3370 # Check that no ancillary data items are returned when data is
3371 # truncated inside the cmsghdr structure.
3372 msg, ancdata, flags, addr = result
3373 self.assertEqual(msg, MSG)
3374 self.checkRecvmsgAddress(addr, self.cli_addr)
3375 self.assertEqual(ancdata, [])
3376 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3377 ignore=ignoreflags)
3378
3379 def testCmsgTruncNoBufSize(self):
3380 # Check that no ancillary data is received when no buffer size
3381 # is specified.
3382 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3383 # BSD seems to set MSG_CTRUNC only
3384 # if an item has been partially
3385 # received.
3386 ignoreflags=socket.MSG_CTRUNC)
3387
3388 def _testCmsgTruncNoBufSize(self):
3389 self.createAndSendFDs(1)
3390
3391 def testCmsgTrunc0(self):
3392 # Check that no ancillary data is received when buffer size is 0.
3393 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3394 ignoreflags=socket.MSG_CTRUNC)
3395
3396 def _testCmsgTrunc0(self):
3397 self.createAndSendFDs(1)
3398
3399 # Check that no ancillary data is returned for various non-zero
3400 # (but still too small) buffer sizes.
3401
3402 def testCmsgTrunc1(self):
3403 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3404
3405 def _testCmsgTrunc1(self):
3406 self.createAndSendFDs(1)
3407
3408 def testCmsgTrunc2Int(self):
3409 # The cmsghdr structure has at least three members, two of
3410 # which are ints, so we still shouldn't see any ancillary
3411 # data.
3412 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3413 SIZEOF_INT * 2))
3414
3415 def _testCmsgTrunc2Int(self):
3416 self.createAndSendFDs(1)
3417
3418 def testCmsgTruncLen0Minus1(self):
3419 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3420 socket.CMSG_LEN(0) - 1))
3421
3422 def _testCmsgTruncLen0Minus1(self):
3423 self.createAndSendFDs(1)
3424
3425 # The following tests try to truncate the control message in the
3426 # middle of the FD array.
3427
3428 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3429 # Check that file descriptor data is truncated to between
3430 # mindata and maxdata bytes when received with buffer size
3431 # ancbuf, and that any complete file descriptor numbers are
3432 # valid.
3433 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3434 len(MSG), ancbuf)
3435 self.assertEqual(msg, MSG)
3436 self.checkRecvmsgAddress(addr, self.cli_addr)
3437 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3438
3439 if mindata == 0 and ancdata == []:
3440 return
3441 self.assertEqual(len(ancdata), 1)
3442 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3443 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3444 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3445 self.assertGreaterEqual(len(cmsg_data), mindata)
3446 self.assertLessEqual(len(cmsg_data), maxdata)
3447 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003448 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003449 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3450 self.checkFDs(fds)
3451
3452 def testCmsgTruncLen0(self):
3453 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3454
3455 def _testCmsgTruncLen0(self):
3456 self.createAndSendFDs(1)
3457
3458 def testCmsgTruncLen0Plus1(self):
3459 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3460
3461 def _testCmsgTruncLen0Plus1(self):
3462 self.createAndSendFDs(2)
3463
3464 def testCmsgTruncLen1(self):
3465 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3466 maxdata=SIZEOF_INT)
3467
3468 def _testCmsgTruncLen1(self):
3469 self.createAndSendFDs(2)
3470
3471 def testCmsgTruncLen2Minus1(self):
3472 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3473 maxdata=(2 * SIZEOF_INT) - 1)
3474
3475 def _testCmsgTruncLen2Minus1(self):
3476 self.createAndSendFDs(2)
3477
3478
3479class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3480 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3481 # features of the RFC 3542 Advanced Sockets API for IPv6.
3482 # Currently we can only handle certain data items (e.g. traffic
3483 # class, hop limit, MTU discovery and fragmentation settings)
3484 # without resorting to unportable means such as the struct module,
3485 # but the tests here are aimed at testing the ancillary data
3486 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3487 # itself.
3488
3489 # Test value to use when setting hop limit of packet
3490 hop_limit = 2
3491
3492 # Test value to use when setting traffic class of packet.
3493 # -1 means "use kernel default".
3494 traffic_class = -1
3495
3496 def ancillaryMapping(self, ancdata):
3497 # Given ancillary data list ancdata, return a mapping from
3498 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3499 # Check that no (level, type) pair appears more than once.
3500 d = {}
3501 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3502 self.assertNotIn((cmsg_level, cmsg_type), d)
3503 d[(cmsg_level, cmsg_type)] = cmsg_data
3504 return d
3505
3506 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3507 # Receive hop limit into ancbufsize bytes of ancillary data
3508 # space. Check that data is MSG, ancillary data is not
3509 # truncated (but ignore any flags in ignoreflags), and hop
3510 # limit is between 0 and maxhop inclusive.
3511 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3512 socket.IPV6_RECVHOPLIMIT, 1)
3513 self.misc_event.set()
3514 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3515 len(MSG), ancbufsize)
3516
3517 self.assertEqual(msg, MSG)
3518 self.checkRecvmsgAddress(addr, self.cli_addr)
3519 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3520 ignore=ignoreflags)
3521
3522 self.assertEqual(len(ancdata), 1)
3523 self.assertIsInstance(ancdata[0], tuple)
3524 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3525 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3526 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3527 self.assertIsInstance(cmsg_data, bytes)
3528 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3529 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003530 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003531 self.assertGreaterEqual(a[0], 0)
3532 self.assertLessEqual(a[0], maxhop)
3533
3534 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3535 def testRecvHopLimit(self):
3536 # Test receiving the packet hop limit as ancillary data.
3537 self.checkHopLimit(ancbufsize=10240)
3538
3539 @testRecvHopLimit.client_skip
3540 def _testRecvHopLimit(self):
3541 # Need to wait until server has asked to receive ancillary
3542 # data, as implementations are not required to buffer it
3543 # otherwise.
3544 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3545 self.sendToServer(MSG)
3546
3547 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3548 def testRecvHopLimitCMSG_SPACE(self):
3549 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3550 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3551
3552 @testRecvHopLimitCMSG_SPACE.client_skip
3553 def _testRecvHopLimitCMSG_SPACE(self):
3554 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3555 self.sendToServer(MSG)
3556
3557 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3558 # 3542 says portable applications must provide space for trailing
3559 # padding. Implementations may set MSG_CTRUNC if there isn't
3560 # enough space for the padding.
3561
3562 @requireAttrs(socket.socket, "sendmsg")
3563 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3564 def testSetHopLimit(self):
3565 # Test setting hop limit on outgoing packet and receiving it
3566 # at the other end.
3567 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3568
3569 @testSetHopLimit.client_skip
3570 def _testSetHopLimit(self):
3571 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3572 self.assertEqual(
3573 self.sendmsgToServer([MSG],
3574 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3575 array.array("i", [self.hop_limit]))]),
3576 len(MSG))
3577
3578 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3579 ignoreflags=0):
3580 # Receive traffic class and hop limit into ancbufsize bytes of
3581 # ancillary data space. Check that data is MSG, ancillary
3582 # data is not truncated (but ignore any flags in ignoreflags),
3583 # and traffic class and hop limit are in range (hop limit no
3584 # more than maxhop).
3585 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3586 socket.IPV6_RECVHOPLIMIT, 1)
3587 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3588 socket.IPV6_RECVTCLASS, 1)
3589 self.misc_event.set()
3590 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3591 len(MSG), ancbufsize)
3592
3593 self.assertEqual(msg, MSG)
3594 self.checkRecvmsgAddress(addr, self.cli_addr)
3595 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3596 ignore=ignoreflags)
3597 self.assertEqual(len(ancdata), 2)
3598 ancmap = self.ancillaryMapping(ancdata)
3599
3600 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3601 self.assertEqual(len(tcdata), SIZEOF_INT)
3602 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003603 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003604 self.assertGreaterEqual(a[0], 0)
3605 self.assertLessEqual(a[0], 255)
3606
3607 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3608 self.assertEqual(len(hldata), SIZEOF_INT)
3609 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003610 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003611 self.assertGreaterEqual(a[0], 0)
3612 self.assertLessEqual(a[0], maxhop)
3613
3614 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3615 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3616 def testRecvTrafficClassAndHopLimit(self):
3617 # Test receiving traffic class and hop limit as ancillary data.
3618 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3619
3620 @testRecvTrafficClassAndHopLimit.client_skip
3621 def _testRecvTrafficClassAndHopLimit(self):
3622 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3623 self.sendToServer(MSG)
3624
3625 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3626 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3627 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3628 # Test receiving traffic class and hop limit, using
3629 # CMSG_SPACE() to calculate buffer size.
3630 self.checkTrafficClassAndHopLimit(
3631 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3632
3633 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3634 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3635 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3636 self.sendToServer(MSG)
3637
3638 @requireAttrs(socket.socket, "sendmsg")
3639 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3640 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3641 def testSetTrafficClassAndHopLimit(self):
3642 # Test setting traffic class and hop limit on outgoing packet,
3643 # and receiving them at the other end.
3644 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3645 maxhop=self.hop_limit)
3646
3647 @testSetTrafficClassAndHopLimit.client_skip
3648 def _testSetTrafficClassAndHopLimit(self):
3649 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3650 self.assertEqual(
3651 self.sendmsgToServer([MSG],
3652 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3653 array.array("i", [self.traffic_class])),
3654 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3655 array.array("i", [self.hop_limit]))]),
3656 len(MSG))
3657
3658 @requireAttrs(socket.socket, "sendmsg")
3659 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3660 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3661 def testOddCmsgSize(self):
3662 # Try to send ancillary data with first item one byte too
3663 # long. Fall back to sending with correct size if this fails,
3664 # and check that second item was handled correctly.
3665 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3666 maxhop=self.hop_limit)
3667
3668 @testOddCmsgSize.client_skip
3669 def _testOddCmsgSize(self):
3670 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3671 try:
3672 nbytes = self.sendmsgToServer(
3673 [MSG],
3674 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003675 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003676 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3677 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003678 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003679 self.assertIsInstance(e.errno, int)
3680 nbytes = self.sendmsgToServer(
3681 [MSG],
3682 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3683 array.array("i", [self.traffic_class])),
3684 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3685 array.array("i", [self.hop_limit]))])
3686 self.assertEqual(nbytes, len(MSG))
3687
3688 # Tests for proper handling of truncated ancillary data
3689
3690 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3691 # Receive hop limit into ancbufsize bytes of ancillary data
3692 # space, which should be too small to contain the ancillary
3693 # data header (if ancbufsize is None, pass no second argument
3694 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3695 # (unless included in ignoreflags), and no ancillary data is
3696 # returned.
3697 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3698 socket.IPV6_RECVHOPLIMIT, 1)
3699 self.misc_event.set()
3700 args = () if ancbufsize is None else (ancbufsize,)
3701 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3702 len(MSG), *args)
3703
3704 self.assertEqual(msg, MSG)
3705 self.checkRecvmsgAddress(addr, self.cli_addr)
3706 self.assertEqual(ancdata, [])
3707 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3708 ignore=ignoreflags)
3709
3710 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3711 def testCmsgTruncNoBufSize(self):
3712 # Check that no ancillary data is received when no ancillary
3713 # buffer size is provided.
3714 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3715 # BSD seems to set
3716 # MSG_CTRUNC only if an item
3717 # has been partially
3718 # received.
3719 ignoreflags=socket.MSG_CTRUNC)
3720
3721 @testCmsgTruncNoBufSize.client_skip
3722 def _testCmsgTruncNoBufSize(self):
3723 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3724 self.sendToServer(MSG)
3725
3726 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3727 def testSingleCmsgTrunc0(self):
3728 # Check that no ancillary data is received when ancillary
3729 # buffer size is zero.
3730 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3731 ignoreflags=socket.MSG_CTRUNC)
3732
3733 @testSingleCmsgTrunc0.client_skip
3734 def _testSingleCmsgTrunc0(self):
3735 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3736 self.sendToServer(MSG)
3737
3738 # Check that no ancillary data is returned for various non-zero
3739 # (but still too small) buffer sizes.
3740
3741 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3742 def testSingleCmsgTrunc1(self):
3743 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3744
3745 @testSingleCmsgTrunc1.client_skip
3746 def _testSingleCmsgTrunc1(self):
3747 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3748 self.sendToServer(MSG)
3749
3750 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3751 def testSingleCmsgTrunc2Int(self):
3752 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3753
3754 @testSingleCmsgTrunc2Int.client_skip
3755 def _testSingleCmsgTrunc2Int(self):
3756 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3757 self.sendToServer(MSG)
3758
3759 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3760 def testSingleCmsgTruncLen0Minus1(self):
3761 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3762
3763 @testSingleCmsgTruncLen0Minus1.client_skip
3764 def _testSingleCmsgTruncLen0Minus1(self):
3765 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3766 self.sendToServer(MSG)
3767
3768 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3769 def testSingleCmsgTruncInData(self):
3770 # Test truncation of a control message inside its associated
3771 # data. The message may be returned with its data truncated,
3772 # or not returned at all.
3773 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3774 socket.IPV6_RECVHOPLIMIT, 1)
3775 self.misc_event.set()
3776 msg, ancdata, flags, addr = self.doRecvmsg(
3777 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3778
3779 self.assertEqual(msg, MSG)
3780 self.checkRecvmsgAddress(addr, self.cli_addr)
3781 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3782
3783 self.assertLessEqual(len(ancdata), 1)
3784 if ancdata:
3785 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3786 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3787 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3788 self.assertLess(len(cmsg_data), SIZEOF_INT)
3789
3790 @testSingleCmsgTruncInData.client_skip
3791 def _testSingleCmsgTruncInData(self):
3792 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3793 self.sendToServer(MSG)
3794
3795 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3796 # Receive traffic class and hop limit into ancbufsize bytes of
3797 # ancillary data space, which should be large enough to
3798 # contain the first item, but too small to contain the header
3799 # of the second. Check that data is MSG, MSG_CTRUNC is set
3800 # (unless included in ignoreflags), and only one ancillary
3801 # data item is returned.
3802 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3803 socket.IPV6_RECVHOPLIMIT, 1)
3804 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3805 socket.IPV6_RECVTCLASS, 1)
3806 self.misc_event.set()
3807 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3808 len(MSG), ancbufsize)
3809
3810 self.assertEqual(msg, MSG)
3811 self.checkRecvmsgAddress(addr, self.cli_addr)
3812 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3813 ignore=ignoreflags)
3814
3815 self.assertEqual(len(ancdata), 1)
3816 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3817 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3818 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3819 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3820 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003821 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003822 self.assertGreaterEqual(a[0], 0)
3823 self.assertLessEqual(a[0], 255)
3824
3825 # Try the above test with various buffer sizes.
3826
3827 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3828 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3829 def testSecondCmsgTrunc0(self):
3830 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3831 ignoreflags=socket.MSG_CTRUNC)
3832
3833 @testSecondCmsgTrunc0.client_skip
3834 def _testSecondCmsgTrunc0(self):
3835 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3836 self.sendToServer(MSG)
3837
3838 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3839 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3840 def testSecondCmsgTrunc1(self):
3841 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3842
3843 @testSecondCmsgTrunc1.client_skip
3844 def _testSecondCmsgTrunc1(self):
3845 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3846 self.sendToServer(MSG)
3847
3848 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3849 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3850 def testSecondCmsgTrunc2Int(self):
3851 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3852 2 * SIZEOF_INT)
3853
3854 @testSecondCmsgTrunc2Int.client_skip
3855 def _testSecondCmsgTrunc2Int(self):
3856 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3857 self.sendToServer(MSG)
3858
3859 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3860 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3861 def testSecondCmsgTruncLen0Minus1(self):
3862 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3863 socket.CMSG_LEN(0) - 1)
3864
3865 @testSecondCmsgTruncLen0Minus1.client_skip
3866 def _testSecondCmsgTruncLen0Minus1(self):
3867 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3868 self.sendToServer(MSG)
3869
3870 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3871 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3872 def testSecomdCmsgTruncInData(self):
3873 # Test truncation of the second of two control messages inside
3874 # its associated data.
3875 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3876 socket.IPV6_RECVHOPLIMIT, 1)
3877 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3878 socket.IPV6_RECVTCLASS, 1)
3879 self.misc_event.set()
3880 msg, ancdata, flags, addr = self.doRecvmsg(
3881 self.serv_sock, len(MSG),
3882 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3883
3884 self.assertEqual(msg, MSG)
3885 self.checkRecvmsgAddress(addr, self.cli_addr)
3886 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3887
3888 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3889
3890 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3891 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3892 cmsg_types.remove(cmsg_type)
3893 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3894 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003895 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003896 self.assertGreaterEqual(a[0], 0)
3897 self.assertLessEqual(a[0], 255)
3898
3899 if ancdata:
3900 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3901 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3902 cmsg_types.remove(cmsg_type)
3903 self.assertLess(len(cmsg_data), SIZEOF_INT)
3904
3905 self.assertEqual(ancdata, [])
3906
3907 @testSecomdCmsgTruncInData.client_skip
3908 def _testSecomdCmsgTruncInData(self):
3909 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3910 self.sendToServer(MSG)
3911
3912
3913# Derive concrete test classes for different socket types.
3914
3915class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3916 SendrecvmsgConnectionlessBase,
3917 ThreadedSocketTestMixin, UDPTestBase):
3918 pass
3919
3920@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003921class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3922 pass
3923
3924@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003925class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3926 pass
3927
3928@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003929class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3930 pass
3931
3932
3933class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3934 SendrecvmsgConnectionlessBase,
3935 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003936
3937 def checkRecvmsgAddress(self, addr1, addr2):
3938 # Called to compare the received address with the address of
3939 # the peer, ignoring scope ID
3940 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003941
3942@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003943@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003944@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003945class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3946 pass
3947
3948@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003949@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003950@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003951class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3952 pass
3953
3954@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003955@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003956@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003957class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3958 pass
3959
3960@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003961@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003962@requireAttrs(socket, "IPPROTO_IPV6")
3963@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003964class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3965 SendrecvmsgUDP6TestBase):
3966 pass
3967
3968@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003969@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003970@requireAttrs(socket, "IPPROTO_IPV6")
3971@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3973 RFC3542AncillaryTest,
3974 SendrecvmsgUDP6TestBase):
3975 pass
3976
3977
3978class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3979 ConnectedStreamTestMixin, TCPTestBase):
3980 pass
3981
3982@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003983class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3984 pass
3985
3986@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003987class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3988 SendrecvmsgTCPTestBase):
3989 pass
3990
3991@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003992class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3993 SendrecvmsgTCPTestBase):
3994 pass
3995
3996
3997class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3998 SendrecvmsgConnectedBase,
3999 ConnectedStreamTestMixin, SCTPStreamBase):
4000 pass
4001
4002@requireAttrs(socket.socket, "sendmsg")
Michael Felt56614592018-12-26 04:34:37 +01004003@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004004@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004005class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
4006 pass
4007
4008@requireAttrs(socket.socket, "recvmsg")
Michael Felt56614592018-12-26 04:34:37 +01004009@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004010@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004011class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4012 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01004013
4014 def testRecvmsgEOF(self):
4015 try:
4016 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
4017 except OSError as e:
4018 if e.errno != errno.ENOTCONN:
4019 raise
4020 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004021
4022@requireAttrs(socket.socket, "recvmsg_into")
Michael Felt56614592018-12-26 04:34:37 +01004023@unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004024@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004025class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4026 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01004027
4028 def testRecvmsgEOF(self):
4029 try:
4030 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
4031 except OSError as e:
4032 if e.errno != errno.ENOTCONN:
4033 raise
4034 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004035
4036
4037class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
4038 ConnectedStreamTestMixin, UnixStreamBase):
4039 pass
4040
4041@requireAttrs(socket.socket, "sendmsg")
4042@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004043class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
4044 pass
4045
4046@requireAttrs(socket.socket, "recvmsg")
4047@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004048class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4049 SendrecvmsgUnixStreamTestBase):
4050 pass
4051
4052@requireAttrs(socket.socket, "recvmsg_into")
4053@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4055 SendrecvmsgUnixStreamTestBase):
4056 pass
4057
4058@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4059@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004060class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4061 pass
4062
4063@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4064@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004065class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4066 SendrecvmsgUnixStreamTestBase):
4067 pass
4068
4069
4070# Test interrupting the interruptible send/receive methods with a
4071# signal when a timeout is set. These tests avoid having multiple
4072# threads alive during the test so that the OS cannot deliver the
4073# signal to the wrong one.
4074
4075class InterruptedTimeoutBase(unittest.TestCase):
4076 # Base class for interrupted send/receive tests. Installs an
4077 # empty handler for SIGALRM and removes it on teardown, along with
4078 # any scheduled alarms.
4079
4080 def setUp(self):
4081 super().setUp()
4082 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004083 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004085
4086 # Timeout for socket operations
4087 timeout = 4.0
4088
4089 # Provide setAlarm() method to schedule delivery of SIGALRM after
4090 # given number of seconds, or cancel it if zero, and an
4091 # appropriate time value to use. Use setitimer() if available.
4092 if hasattr(signal, "setitimer"):
4093 alarm_time = 0.05
4094
4095 def setAlarm(self, seconds):
4096 signal.setitimer(signal.ITIMER_REAL, seconds)
4097 else:
4098 # Old systems may deliver the alarm up to one second early
4099 alarm_time = 2
4100
4101 def setAlarm(self, seconds):
4102 signal.alarm(seconds)
4103
4104
4105# Require siginterrupt() in order to ensure that system calls are
4106# interrupted by default.
4107@requireAttrs(signal, "siginterrupt")
4108@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4109 "Don't have signal.alarm or signal.setitimer")
4110class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4111 # Test interrupting the recv*() methods with signals when a
4112 # timeout is set.
4113
4114 def setUp(self):
4115 super().setUp()
4116 self.serv.settimeout(self.timeout)
4117
4118 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004119 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004120 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004121 try:
4122 self.setAlarm(self.alarm_time)
4123 with self.assertRaises(ZeroDivisionError) as cm:
4124 func(*args, **kwargs)
4125 finally:
4126 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004127
4128 def testInterruptedRecvTimeout(self):
4129 self.checkInterruptedRecv(self.serv.recv, 1024)
4130
4131 def testInterruptedRecvIntoTimeout(self):
4132 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4133
4134 def testInterruptedRecvfromTimeout(self):
4135 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4136
4137 def testInterruptedRecvfromIntoTimeout(self):
4138 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4139
4140 @requireAttrs(socket.socket, "recvmsg")
4141 def testInterruptedRecvmsgTimeout(self):
4142 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4143
4144 @requireAttrs(socket.socket, "recvmsg_into")
4145 def testInterruptedRecvmsgIntoTimeout(self):
4146 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4147
4148
4149# Require siginterrupt() in order to ensure that system calls are
4150# interrupted by default.
4151@requireAttrs(signal, "siginterrupt")
4152@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4153 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004154class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4155 ThreadSafeCleanupTestCase,
4156 SocketListeningTestMixin, TCPTestBase):
4157 # Test interrupting the interruptible send*() methods with signals
4158 # when a timeout is set.
4159
4160 def setUp(self):
4161 super().setUp()
4162 self.serv_conn = self.newSocket()
4163 self.addCleanup(self.serv_conn.close)
4164 # Use a thread to complete the connection, but wait for it to
4165 # terminate before running the test, so that there is only one
4166 # thread to accept the signal.
4167 cli_thread = threading.Thread(target=self.doConnect)
4168 cli_thread.start()
4169 self.cli_conn, addr = self.serv.accept()
4170 self.addCleanup(self.cli_conn.close)
4171 cli_thread.join()
4172 self.serv_conn.settimeout(self.timeout)
4173
4174 def doConnect(self):
4175 self.serv_conn.connect(self.serv_addr)
4176
4177 def checkInterruptedSend(self, func, *args, **kwargs):
4178 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004179 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004180 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004181 try:
4182 with self.assertRaises(ZeroDivisionError) as cm:
4183 while True:
4184 self.setAlarm(self.alarm_time)
4185 func(*args, **kwargs)
4186 finally:
4187 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004188
Ned Deilyc5640382014-02-03 13:58:31 -08004189 # Issue #12958: The following tests have problems on OS X prior to 10.7
4190 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004191 def testInterruptedSendTimeout(self):
4192 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4193
Ned Deilyc5640382014-02-03 13:58:31 -08004194 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004195 def testInterruptedSendtoTimeout(self):
4196 # Passing an actual address here as Python's wrapper for
4197 # sendto() doesn't allow passing a zero-length one; POSIX
4198 # requires that the address is ignored since the socket is
4199 # connection-mode, however.
4200 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4201 self.serv_addr)
4202
Ned Deilyc5640382014-02-03 13:58:31 -08004203 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004204 @requireAttrs(socket.socket, "sendmsg")
4205 def testInterruptedSendmsgTimeout(self):
4206 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4207
4208
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004209class TCPCloserTest(ThreadedTCPSocketTest):
4210
4211 def testClose(self):
4212 conn, addr = self.serv.accept()
4213 conn.close()
4214
4215 sd = self.cli
4216 read, write, err = select.select([sd], [], [], 1.0)
4217 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004218 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004219
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004220 # Calling close() many times should be safe.
4221 conn.close()
4222 conn.close()
4223
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004224 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004225 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004226 time.sleep(1.0)
4227
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004228
Dave Cole331708b2004-08-09 04:51:41 +00004229class BasicSocketPairTest(SocketPairTest):
4230
4231 def __init__(self, methodName='runTest'):
4232 SocketPairTest.__init__(self, methodName=methodName)
4233
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004234 def _check_defaults(self, sock):
4235 self.assertIsInstance(sock, socket.socket)
4236 if hasattr(socket, 'AF_UNIX'):
4237 self.assertEqual(sock.family, socket.AF_UNIX)
4238 else:
4239 self.assertEqual(sock.family, socket.AF_INET)
4240 self.assertEqual(sock.type, socket.SOCK_STREAM)
4241 self.assertEqual(sock.proto, 0)
4242
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004243 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004244 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004245
4246 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004247 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004248
Dave Cole331708b2004-08-09 04:51:41 +00004249 def testRecv(self):
4250 msg = self.serv.recv(1024)
4251 self.assertEqual(msg, MSG)
4252
4253 def _testRecv(self):
4254 self.cli.send(MSG)
4255
4256 def testSend(self):
4257 self.serv.send(MSG)
4258
4259 def _testSend(self):
4260 msg = self.cli.recv(1024)
4261 self.assertEqual(msg, MSG)
4262
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004263
Guido van Rossum24e4af82002-06-12 19:18:08 +00004264class NonBlockingTCPTests(ThreadedTCPSocketTest):
4265
4266 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004267 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004268 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4269
Victor Stinner304315d2018-11-30 13:22:44 +01004270 def assert_sock_timeout(self, sock, timeout):
4271 self.assertEqual(self.serv.gettimeout(), timeout)
4272
4273 blocking = (timeout != 0.0)
4274 self.assertEqual(sock.getblocking(), blocking)
4275
4276 if fcntl is not None:
4277 # When a Python socket has a non-zero timeout, it's switched
4278 # internally to a non-blocking mode. Later, sock.sendall(),
4279 # sock.recv(), and other socket operations use a select() call and
4280 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4281 # timeouts are enforced.
4282 fd_blocking = (timeout is None)
4283
4284 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4285 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4286
Guido van Rossum24e4af82002-06-12 19:18:08 +00004287 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004288 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004289 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004290 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004291
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004292 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004293 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004294
4295 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004296 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004297
4298 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004299 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004300
4301 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004302 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004303
4304 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004305 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004306
4307 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004308 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004309
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004310 @support.cpython_only
4311 def testSetBlocking_overflow(self):
4312 # Issue 15989
4313 import _testcapi
4314 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4315 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004316
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004317 self.serv.setblocking(False)
4318 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004319
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004320 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4321 self.assertIsNone(self.serv.gettimeout())
4322
4323 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4324
Serhiy Storchaka43767632013-11-03 21:31:38 +02004325 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4326 'test needs socket.SOCK_NONBLOCK')
4327 @support.requires_linux_version(2, 6, 28)
4328 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004329 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004330 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004331 self.serv = socket.socket(socket.AF_INET,
4332 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4333 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004334
4335 def _testInitNonBlocking(self):
4336 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004337
Victor Stinner304315d2018-11-30 13:22:44 +01004338 def testInheritFlagsBlocking(self):
4339 # bpo-7995: accept() on a listening socket with a timeout and the
4340 # default timeout is None, the resulting socket must be blocking.
4341 with socket_setdefaulttimeout(None):
4342 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004343 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004344 self.addCleanup(conn.close)
4345 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004346
Victor Stinner304315d2018-11-30 13:22:44 +01004347 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004348 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004349
4350 def testInheritFlagsTimeout(self):
4351 # bpo-7995: accept() on a listening socket with a timeout and the
4352 # default timeout is None, the resulting socket must inherit
4353 # the default timeout.
4354 default_timeout = 20.0
4355 with socket_setdefaulttimeout(default_timeout):
4356 self.serv.settimeout(10)
4357 conn, addr = self.serv.accept()
4358 self.addCleanup(conn.close)
4359 self.assertEqual(conn.gettimeout(), default_timeout)
4360
4361 def _testInheritFlagsTimeout(self):
4362 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004363
Guido van Rossum24e4af82002-06-12 19:18:08 +00004364 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004365 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004366 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004367
4368 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004369 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004370 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004371 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004372 dt = time.monotonic() - start_time
4373 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004374
4375 self.event.set()
4376
4377 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4378 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004379 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004380
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004381 # connect() completed: non-blocking accept() doesn't block
4382 conn, addr = self.serv.accept()
4383 self.addCleanup(conn.close)
4384 self.assertIsNone(conn.gettimeout())
4385
Guido van Rossum24e4af82002-06-12 19:18:08 +00004386 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004387 # don't connect before event is set to check
4388 # that non-blocking accept() raises BlockingIOError
4389 self.event.wait()
4390
Christian Heimes5e696852008-04-09 08:37:03 +00004391 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004392
Guido van Rossum24e4af82002-06-12 19:18:08 +00004393 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004394 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004395 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004396 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004397 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004398
4399 # the server didn't send data yet: non-blocking recv() fails
4400 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004401 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004402
4403 self.event.set()
4404
4405 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4406 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004407 self.fail("Error during select call to non-blocking socket.")
4408
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004409 # the server sent data yet: non-blocking recv() doesn't block
4410 msg = conn.recv(len(MSG))
4411 self.assertEqual(msg, MSG)
4412
Guido van Rossum24e4af82002-06-12 19:18:08 +00004413 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004414 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004415
4416 # don't send anything before event is set to check
4417 # that non-blocking recv() raises BlockingIOError
4418 self.event.wait()
4419
4420 # send data: recv() will no longer block
4421 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004422
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004423
Guido van Rossum24e4af82002-06-12 19:18:08 +00004424class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004425 """Unit tests for the object returned by socket.makefile()
4426
Antoine Pitrou834bd812010-10-13 16:17:14 +00004427 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004428 the client connection. You can read from this file to
4429 get output from the server.
4430
Antoine Pitrou834bd812010-10-13 16:17:14 +00004431 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004432 server connection. You can write to this file to send output
4433 to the client.
4434 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004435
Guido van Rossume9f66142002-08-07 15:46:19 +00004436 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004437 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004438 errors = 'strict'
4439 newline = None
4440
4441 read_mode = 'rb'
4442 read_msg = MSG
4443 write_mode = 'wb'
4444 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004445
Guido van Rossum24e4af82002-06-12 19:18:08 +00004446 def __init__(self, methodName='runTest'):
4447 SocketConnectedTest.__init__(self, methodName=methodName)
4448
4449 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004450 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4451 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004452 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004453 self.read_file = self.cli_conn.makefile(
4454 self.read_mode, self.bufsize,
4455 encoding = self.encoding,
4456 errors = self.errors,
4457 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004458
4459 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004460 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004461 self.read_file.close()
4462 self.assertTrue(self.read_file.closed)
4463 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004464 SocketConnectedTest.tearDown(self)
4465
4466 def clientSetUp(self):
4467 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004468 self.write_file = self.serv_conn.makefile(
4469 self.write_mode, self.bufsize,
4470 encoding = self.encoding,
4471 errors = self.errors,
4472 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004473
4474 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004475 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004476 self.write_file.close()
4477 self.assertTrue(self.write_file.closed)
4478 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004479 SocketConnectedTest.clientTearDown(self)
4480
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004481 def testReadAfterTimeout(self):
4482 # Issue #7322: A file object must disallow further reads
4483 # after a timeout has occurred.
4484 self.cli_conn.settimeout(1)
4485 self.read_file.read(3)
4486 # First read raises a timeout
4487 self.assertRaises(socket.timeout, self.read_file.read, 1)
4488 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004489 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004490 self.read_file.read(1)
4491 self.assertIn("cannot read from timed out object", str(ctx.exception))
4492
4493 def _testReadAfterTimeout(self):
4494 self.write_file.write(self.write_msg[0:3])
4495 self.write_file.flush()
4496 self.serv_finished.wait()
4497
Guido van Rossum24e4af82002-06-12 19:18:08 +00004498 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004499 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004500 first_seg = self.read_file.read(len(self.read_msg)-3)
4501 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004502 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004503 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004504
4505 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004506 self.write_file.write(self.write_msg)
4507 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004508
Guido van Rossum8c943832002-08-08 01:00:28 +00004509 def testFullRead(self):
4510 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004511 msg = self.read_file.read()
4512 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004513
4514 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004515 self.write_file.write(self.write_msg)
4516 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004517
Guido van Rossum24e4af82002-06-12 19:18:08 +00004518 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004519 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004520 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004521 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004522 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004523 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004524 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004525 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004526 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004527
4528 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004529 self.write_file.write(self.write_msg)
4530 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004531
4532 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004533 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004534 line = self.read_file.readline()
4535 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004536
4537 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004538 self.write_file.write(self.write_msg)
4539 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004540
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004541 def testCloseAfterMakefile(self):
4542 # The file returned by makefile should keep the socket open.
4543 self.cli_conn.close()
4544 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004545 msg = self.read_file.read()
4546 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004547
4548 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004549 self.write_file.write(self.write_msg)
4550 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004551
4552 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004553 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004554 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004555 if isinstance(self.read_msg, str):
4556 msg = msg.decode()
4557 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004558
4559 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004560 self.write_file.write(self.write_msg)
4561 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004562
Tim Peters116d83c2004-03-28 02:20:45 +00004563 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004564 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004565
4566 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004567 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004568
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004569 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004570 self.assertEqual(self.read_file.mode, self.read_mode)
4571 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004572
4573 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004574 self.assertEqual(self.write_file.mode, self.write_mode)
4575 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004576
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004577 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004578 self.read_file.close()
4579 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004580 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004581 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004582
4583 def _testRealClose(self):
4584 pass
4585
4586
Guido van Rossume9f66142002-08-07 15:46:19 +00004587class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4588
4589 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004590
Guido van Rossume9f66142002-08-07 15:46:19 +00004591 In this case (and in this case only), it should be possible to
4592 create a file object, read a line from it, create another file
4593 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004594 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004595 when reading multiple requests from the same socket."""
4596
4597 bufsize = 0 # Use unbuffered mode
4598
4599 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004600 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004601 line = self.read_file.readline() # first line
4602 self.assertEqual(line, b"A. " + self.write_msg) # first line
4603 self.read_file = self.cli_conn.makefile('rb', 0)
4604 line = self.read_file.readline() # second line
4605 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004606
4607 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004608 self.write_file.write(b"A. " + self.write_msg)
4609 self.write_file.write(b"B. " + self.write_msg)
4610 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004611
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004612 def testMakefileClose(self):
4613 # The file returned by makefile should keep the socket open...
4614 self.cli_conn.close()
4615 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004616 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004617 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004618 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004619 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004620
4621 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004622 self.write_file.write(self.write_msg)
4623 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004624
4625 def testMakefileCloseSocketDestroy(self):
4626 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004627 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004628 refcount_after = sys.getrefcount(self.cli_conn)
4629 self.assertEqual(refcount_before - 1, refcount_after)
4630
4631 def _testMakefileCloseSocketDestroy(self):
4632 pass
4633
Antoine Pitrou98b46702010-09-18 22:59:00 +00004634 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004635 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004636 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4637
4638 def testSmallReadNonBlocking(self):
4639 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004640 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4641 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004642 self.evt1.set()
4643 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004644 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004645 if first_seg is None:
4646 # Data not arrived (can happen under Windows), wait a bit
4647 time.sleep(0.5)
4648 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004649 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004650 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004651 self.assertEqual(n, 3)
4652 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004653 self.assertEqual(msg, self.read_msg)
4654 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4655 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004656
4657 def _testSmallReadNonBlocking(self):
4658 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004659 self.write_file.write(self.write_msg)
4660 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004661 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004662 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004663 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4664 self.serv_finished.wait(5.0)
4665
4666 def testWriteNonBlocking(self):
4667 self.cli_finished.wait(5.0)
4668 # The client thread can't skip directly - the SkipTest exception
4669 # would appear as a failure.
4670 if self.serv_skipped:
4671 self.skipTest(self.serv_skipped)
4672
4673 def _testWriteNonBlocking(self):
4674 self.serv_skipped = None
4675 self.serv_conn.setblocking(False)
4676 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004677 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004678 LIMIT = 10
4679 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004680 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004681 self.assertGreater(n, 0)
4682 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004683 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004684 if n is None:
4685 # Succeeded
4686 break
4687 self.assertGreater(n, 0)
4688 else:
4689 # Let us know that this test didn't manage to establish
4690 # the expected conditions. This is not a failure in itself but,
4691 # if it happens repeatedly, the test should be fixed.
4692 self.serv_skipped = "failed to saturate the socket buffer"
4693
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004694
Guido van Rossum8c943832002-08-08 01:00:28 +00004695class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4696
4697 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4698
4699
4700class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4701
4702 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004703
Thomas Woutersb2137042007-02-01 18:02:27 +00004704
Antoine Pitrou834bd812010-10-13 16:17:14 +00004705class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4706 """Tests for socket.makefile() in text mode (rather than binary)"""
4707
4708 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004709 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004710 write_mode = 'wb'
4711 write_msg = MSG
4712 newline = ''
4713
4714
4715class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4716 """Tests for socket.makefile() in text mode (rather than binary)"""
4717
4718 read_mode = 'rb'
4719 read_msg = MSG
4720 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004721 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004722 newline = ''
4723
4724
4725class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4726 """Tests for socket.makefile() in text mode (rather than binary)"""
4727
4728 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004729 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004730 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004731 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004732 newline = ''
4733
4734
Guido van Rossumd8faa362007-04-27 19:54:29 +00004735class NetworkConnectionTest(object):
4736 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004737
Guido van Rossumd8faa362007-04-27 19:54:29 +00004738 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004739 # We're inherited below by BasicTCPTest2, which also inherits
4740 # BasicTCPTest, which defines self.port referenced below.
4741 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004742 self.serv_conn = self.cli
4743
4744class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4745 """Tests that NetworkConnection does not break existing TCP functionality.
4746 """
4747
4748class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004749
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004750 class MockSocket(socket.socket):
4751 def connect(self, *args):
4752 raise socket.timeout('timed out')
4753
4754 @contextlib.contextmanager
4755 def mocked_socket_module(self):
4756 """Return a socket which times out on connect"""
4757 old_socket = socket.socket
4758 socket.socket = self.MockSocket
4759 try:
4760 yield
4761 finally:
4762 socket.socket = old_socket
4763
4764 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004765 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004766 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004767 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004768 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004769 cli.connect((HOST, port))
4770 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4771
4772 def test_create_connection(self):
4773 # Issue #9792: errors raised by create_connection() should have
4774 # a proper errno attribute.
4775 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004776 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004777 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004778
4779 # Issue #16257: create_connection() calls getaddrinfo() against
4780 # 'localhost'. This may result in an IPV6 addr being returned
4781 # as well as an IPV4 one:
4782 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4783 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4784 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4785 #
4786 # create_connection() enumerates through all the addresses returned
4787 # and if it doesn't successfully bind to any of them, it propagates
4788 # the last exception it encountered.
4789 #
4790 # On Solaris, ENETUNREACH is returned in this circumstance instead
4791 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4792 # expected errnos.
4793 expected_errnos = [ errno.ECONNREFUSED, ]
4794 if hasattr(errno, 'ENETUNREACH'):
4795 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004796 if hasattr(errno, 'EADDRNOTAVAIL'):
4797 # bpo-31910: socket.create_connection() fails randomly
4798 # with EADDRNOTAVAIL on Travis CI
4799 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004800
4801 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004802
4803 def test_create_connection_timeout(self):
4804 # Issue #9792: create_connection() should not recast timeout errors
4805 # as generic socket errors.
4806 with self.mocked_socket_module():
4807 with self.assertRaises(socket.timeout):
4808 socket.create_connection((HOST, 1234))
4809
Guido van Rossumd8faa362007-04-27 19:54:29 +00004810
4811class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4812
4813 def __init__(self, methodName='runTest'):
4814 SocketTCPTest.__init__(self, methodName=methodName)
4815 ThreadableTest.__init__(self)
4816
4817 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004818 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004819
4820 def clientTearDown(self):
4821 self.cli.close()
4822 self.cli = None
4823 ThreadableTest.clientTearDown(self)
4824
4825 def _justAccept(self):
4826 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004827 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004828
4829 testFamily = _justAccept
4830 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004831 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004832 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004833 self.assertEqual(self.cli.family, 2)
4834
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004835 testSourceAddress = _justAccept
4836 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004837 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4838 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004839 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004840 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004841 # The port number being used is sufficient to show that the bind()
4842 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004843
Guido van Rossumd8faa362007-04-27 19:54:29 +00004844 testTimeoutDefault = _justAccept
4845 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004846 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004847 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004848 socket.setdefaulttimeout(42)
4849 try:
4850 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004851 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004852 finally:
4853 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004854 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004855
4856 testTimeoutNone = _justAccept
4857 def _testTimeoutNone(self):
4858 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004859 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004860 socket.setdefaulttimeout(30)
4861 try:
4862 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004863 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004864 finally:
4865 socket.setdefaulttimeout(None)
4866 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004867
4868 testTimeoutValueNamed = _justAccept
4869 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004870 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004871 self.assertEqual(self.cli.gettimeout(), 30)
4872
4873 testTimeoutValueNonamed = _justAccept
4874 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004875 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004876 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004877 self.assertEqual(self.cli.gettimeout(), 30)
4878
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004879
Guido van Rossumd8faa362007-04-27 19:54:29 +00004880class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4881
4882 def __init__(self, methodName='runTest'):
4883 SocketTCPTest.__init__(self, methodName=methodName)
4884 ThreadableTest.__init__(self)
4885
4886 def clientSetUp(self):
4887 pass
4888
4889 def clientTearDown(self):
4890 self.cli.close()
4891 self.cli = None
4892 ThreadableTest.clientTearDown(self)
4893
4894 def testInsideTimeout(self):
4895 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004896 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004897 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004898 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004899 testOutsideTimeout = testInsideTimeout
4900
4901 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004902 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004903 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004904 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004905
4906 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004907 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004908 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004909
4910
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004911class TCPTimeoutTest(SocketTCPTest):
4912
4913 def testTCPTimeout(self):
4914 def raise_timeout(*args, **kwargs):
4915 self.serv.settimeout(1.0)
4916 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004917 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004918 "Error generating a timeout exception (TCP)")
4919
4920 def testTimeoutZero(self):
4921 ok = False
4922 try:
4923 self.serv.settimeout(0.0)
4924 foo = self.serv.accept()
4925 except socket.timeout:
4926 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004927 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004928 ok = True
4929 except:
4930 self.fail("caught unexpected exception (TCP)")
4931 if not ok:
4932 self.fail("accept() returned success when we did not expect it")
4933
Serhiy Storchaka43767632013-11-03 21:31:38 +02004934 @unittest.skipUnless(hasattr(signal, 'alarm'),
4935 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004936 def testInterruptedTimeout(self):
4937 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004938 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004939 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004940 self.serv.settimeout(5.0) # must be longer than alarm
4941 class Alarm(Exception):
4942 pass
4943 def alarm_handler(signal, frame):
4944 raise Alarm
4945 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4946 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004947 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004948 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004949 foo = self.serv.accept()
4950 except socket.timeout:
4951 self.fail("caught timeout instead of Alarm")
4952 except Alarm:
4953 pass
4954 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004955 self.fail("caught other exception instead of Alarm:"
4956 " %s(%s):\n%s" %
4957 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004958 else:
4959 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004960 finally:
4961 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004962 except Alarm:
4963 self.fail("got Alarm in wrong place")
4964 finally:
4965 # no alarm can be pending. Safe to restore old handler.
4966 signal.signal(signal.SIGALRM, old_alarm)
4967
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004968class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004969
4970 def testUDPTimeout(self):
4971 def raise_timeout(*args, **kwargs):
4972 self.serv.settimeout(1.0)
4973 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004974 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004975 "Error generating a timeout exception (UDP)")
4976
4977 def testTimeoutZero(self):
4978 ok = False
4979 try:
4980 self.serv.settimeout(0.0)
4981 foo = self.serv.recv(1024)
4982 except socket.timeout:
4983 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004984 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004985 ok = True
4986 except:
4987 self.fail("caught unexpected exception (UDP)")
4988 if not ok:
4989 self.fail("recv() returned success when we did not expect it")
4990
4991class TestExceptions(unittest.TestCase):
4992
4993 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004994 self.assertTrue(issubclass(OSError, Exception))
4995 self.assertTrue(issubclass(socket.herror, OSError))
4996 self.assertTrue(issubclass(socket.gaierror, OSError))
4997 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004998
Yury Selivanovfa22b292016-10-18 16:03:52 -04004999 def test_setblocking_invalidfd(self):
5000 # Regression test for issue #28471
5001
5002 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
5003 sock = socket.socket(
5004 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
5005 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00005006 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04005007
5008 with self.assertRaises(OSError):
5009 sock.setblocking(False)
5010
5011
Serhiy Storchaka43767632013-11-03 21:31:38 +02005012@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005013class TestLinuxAbstractNamespace(unittest.TestCase):
5014
5015 UNIX_PATH_MAX = 108
5016
5017 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005018 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00005019 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
5020 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01005021 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00005022 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
5023 s2.connect(s1.getsockname())
5024 with s1.accept()[0] as s3:
5025 self.assertEqual(s1.getsockname(), address)
5026 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005027
5028 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005029 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005030 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5031 s.bind(address)
5032 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005033
5034 def testNameOverflow(self):
5035 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00005036 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005037 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005038
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005039 def testStrName(self):
5040 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005041 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5042 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02005043 s.bind("\x00python\x00test\x00")
5044 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005045 finally:
5046 s.close()
5047
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005048 def testBytearrayName(self):
5049 # Check that an abstract name can be passed as a bytearray.
5050 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5051 s.bind(bytearray(b"\x00python\x00test\x00"))
5052 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5053
Serhiy Storchaka43767632013-11-03 21:31:38 +02005054@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005055class TestUnixDomain(unittest.TestCase):
5056
5057 def setUp(self):
5058 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5059
5060 def tearDown(self):
5061 self.sock.close()
5062
5063 def encoded(self, path):
5064 # Return the given path encoded in the file system encoding,
5065 # or skip the test if this is not possible.
5066 try:
5067 return os.fsencode(path)
5068 except UnicodeEncodeError:
5069 self.skipTest(
5070 "Pathname {0!a} cannot be represented in file "
5071 "system encoding {1!r}".format(
5072 path, sys.getfilesystemencoding()))
5073
Antoine Pitrou16374872011-12-16 15:04:12 +01005074 def bind(self, sock, path):
5075 # Bind the socket
5076 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005077 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005078 except OSError as e:
5079 if str(e) == "AF_UNIX path too long":
5080 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005081 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005082 .format(path))
5083 else:
5084 raise
5085
Antoine Pitrou495b5022017-05-02 17:20:00 +02005086 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005087 # Issue #30205 (note getsockname() can return None on OS X)
5088 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005089
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005090 def testStrAddr(self):
5091 # Test binding to and retrieving a normal string pathname.
5092 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005093 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005094 self.addCleanup(support.unlink, path)
5095 self.assertEqual(self.sock.getsockname(), path)
5096
5097 def testBytesAddr(self):
5098 # Test binding to a bytes pathname.
5099 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005100 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005101 self.addCleanup(support.unlink, path)
5102 self.assertEqual(self.sock.getsockname(), path)
5103
5104 def testSurrogateescapeBind(self):
5105 # Test binding to a valid non-ASCII pathname, with the
5106 # non-ASCII bytes supplied using surrogateescape encoding.
5107 path = os.path.abspath(support.TESTFN_UNICODE)
5108 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005109 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005110 self.addCleanup(support.unlink, path)
5111 self.assertEqual(self.sock.getsockname(), path)
5112
5113 def testUnencodableAddr(self):
5114 # Test binding to a pathname that cannot be encoded in the
5115 # file system encoding.
5116 if support.TESTFN_UNENCODABLE is None:
5117 self.skipTest("No unencodable filename available")
5118 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005119 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005120 self.addCleanup(support.unlink, path)
5121 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005122
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005123
Thomas Wouters477c8d52006-05-27 19:21:47 +00005124class BufferIOTest(SocketConnectedTest):
5125 """
5126 Test the buffer versions of socket.recv() and socket.send().
5127 """
5128 def __init__(self, methodName='runTest'):
5129 SocketConnectedTest.__init__(self, methodName=methodName)
5130
Antoine Pitrou25480782010-03-17 22:50:28 +00005131 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005132 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005133 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005134 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005135 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005136 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005137 self.assertEqual(msg, MSG)
5138
Antoine Pitrou25480782010-03-17 22:50:28 +00005139 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005140 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005141 self.serv_conn.send(buf)
5142
Antoine Pitrou25480782010-03-17 22:50:28 +00005143 def testRecvIntoBytearray(self):
5144 buf = bytearray(1024)
5145 nbytes = self.cli_conn.recv_into(buf)
5146 self.assertEqual(nbytes, len(MSG))
5147 msg = buf[:len(MSG)]
5148 self.assertEqual(msg, MSG)
5149
5150 _testRecvIntoBytearray = _testRecvIntoArray
5151
5152 def testRecvIntoMemoryview(self):
5153 buf = bytearray(1024)
5154 nbytes = self.cli_conn.recv_into(memoryview(buf))
5155 self.assertEqual(nbytes, len(MSG))
5156 msg = buf[:len(MSG)]
5157 self.assertEqual(msg, MSG)
5158
5159 _testRecvIntoMemoryview = _testRecvIntoArray
5160
5161 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005162 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005163 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005164 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005165 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005166 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005167 self.assertEqual(msg, MSG)
5168
Antoine Pitrou25480782010-03-17 22:50:28 +00005169 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005170 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005171 self.serv_conn.send(buf)
5172
Antoine Pitrou25480782010-03-17 22:50:28 +00005173 def testRecvFromIntoBytearray(self):
5174 buf = bytearray(1024)
5175 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5176 self.assertEqual(nbytes, len(MSG))
5177 msg = buf[:len(MSG)]
5178 self.assertEqual(msg, MSG)
5179
5180 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5181
5182 def testRecvFromIntoMemoryview(self):
5183 buf = bytearray(1024)
5184 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5185 self.assertEqual(nbytes, len(MSG))
5186 msg = buf[:len(MSG)]
5187 self.assertEqual(msg, MSG)
5188
5189 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5190
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005191 def testRecvFromIntoSmallBuffer(self):
5192 # See issue #20246.
5193 buf = bytearray(8)
5194 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5195
5196 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005197 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005198
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005199 def testRecvFromIntoEmptyBuffer(self):
5200 buf = bytearray()
5201 self.cli_conn.recvfrom_into(buf)
5202 self.cli_conn.recvfrom_into(buf, 0)
5203
5204 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5205
Christian Heimes043d6f62008-01-07 17:19:16 +00005206
5207TIPC_STYPE = 2000
5208TIPC_LOWER = 200
5209TIPC_UPPER = 210
5210
5211def isTipcAvailable():
5212 """Check if the TIPC module is loaded
5213
5214 The TIPC module is not loaded automatically on Ubuntu and probably
5215 other Linux distros.
5216 """
5217 if not hasattr(socket, "AF_TIPC"):
5218 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005219 try:
5220 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005221 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005222 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005223 # have not the permission to read it.
5224 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005225 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005226 for line in f:
5227 if line.startswith("tipc "):
5228 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005229 return False
5230
Serhiy Storchaka43767632013-11-03 21:31:38 +02005231@unittest.skipUnless(isTipcAvailable(),
5232 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005233class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005234 def testRDM(self):
5235 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5236 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005237 self.addCleanup(srv.close)
5238 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005239
5240 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5241 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5242 TIPC_LOWER, TIPC_UPPER)
5243 srv.bind(srvaddr)
5244
5245 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5246 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5247 cli.sendto(MSG, sendaddr)
5248
5249 msg, recvaddr = srv.recvfrom(1024)
5250
5251 self.assertEqual(cli.getsockname(), recvaddr)
5252 self.assertEqual(msg, MSG)
5253
5254
Serhiy Storchaka43767632013-11-03 21:31:38 +02005255@unittest.skipUnless(isTipcAvailable(),
5256 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005257class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005258 def __init__(self, methodName = 'runTest'):
5259 unittest.TestCase.__init__(self, methodName = methodName)
5260 ThreadableTest.__init__(self)
5261
5262 def setUp(self):
5263 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005264 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005265 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5266 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5267 TIPC_LOWER, TIPC_UPPER)
5268 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005269 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005270 self.serverExplicitReady()
5271 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005272 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005273
5274 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005275 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005276 # accept() call; sleep a little while to avoid it, otherwise
5277 # we could get an exception
5278 time.sleep(0.1)
5279 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005280 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005281 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5282 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5283 self.cli.connect(addr)
5284 self.cliaddr = self.cli.getsockname()
5285
5286 def testStream(self):
5287 msg = self.conn.recv(1024)
5288 self.assertEqual(msg, MSG)
5289 self.assertEqual(self.cliaddr, self.connaddr)
5290
5291 def _testStream(self):
5292 self.cli.send(MSG)
5293 self.cli.close()
5294
5295
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005296class ContextManagersTest(ThreadedTCPSocketTest):
5297
5298 def _testSocketClass(self):
5299 # base test
5300 with socket.socket() as sock:
5301 self.assertFalse(sock._closed)
5302 self.assertTrue(sock._closed)
5303 # close inside with block
5304 with socket.socket() as sock:
5305 sock.close()
5306 self.assertTrue(sock._closed)
5307 # exception inside with block
5308 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005309 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005310 self.assertTrue(sock._closed)
5311
5312 def testCreateConnectionBase(self):
5313 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005314 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005315 data = conn.recv(1024)
5316 conn.sendall(data)
5317
5318 def _testCreateConnectionBase(self):
5319 address = self.serv.getsockname()
5320 with socket.create_connection(address) as sock:
5321 self.assertFalse(sock._closed)
5322 sock.sendall(b'foo')
5323 self.assertEqual(sock.recv(1024), b'foo')
5324 self.assertTrue(sock._closed)
5325
5326 def testCreateConnectionClose(self):
5327 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005328 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005329 data = conn.recv(1024)
5330 conn.sendall(data)
5331
5332 def _testCreateConnectionClose(self):
5333 address = self.serv.getsockname()
5334 with socket.create_connection(address) as sock:
5335 sock.close()
5336 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005337 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005338
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005339
Victor Stinnerdaf45552013-08-28 00:53:59 +02005340class InheritanceTest(unittest.TestCase):
5341 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5342 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005343 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005344 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005345 with socket.socket(socket.AF_INET,
5346 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005347 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005348 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005349
5350 def test_default_inheritable(self):
5351 sock = socket.socket()
5352 with sock:
5353 self.assertEqual(sock.get_inheritable(), False)
5354
5355 def test_dup(self):
5356 sock = socket.socket()
5357 with sock:
5358 newsock = sock.dup()
5359 sock.close()
5360 with newsock:
5361 self.assertEqual(newsock.get_inheritable(), False)
5362
5363 def test_set_inheritable(self):
5364 sock = socket.socket()
5365 with sock:
5366 sock.set_inheritable(True)
5367 self.assertEqual(sock.get_inheritable(), True)
5368
5369 sock.set_inheritable(False)
5370 self.assertEqual(sock.get_inheritable(), False)
5371
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005372 @unittest.skipIf(fcntl is None, "need fcntl")
5373 def test_get_inheritable_cloexec(self):
5374 sock = socket.socket()
5375 with sock:
5376 fd = sock.fileno()
5377 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005378
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005379 # clear FD_CLOEXEC flag
5380 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5381 flags &= ~fcntl.FD_CLOEXEC
5382 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005383
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005384 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005385
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005386 @unittest.skipIf(fcntl is None, "need fcntl")
5387 def test_set_inheritable_cloexec(self):
5388 sock = socket.socket()
5389 with sock:
5390 fd = sock.fileno()
5391 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5392 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005393
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005394 sock.set_inheritable(True)
5395 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5396 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005397
5398
Victor Stinnerdaf45552013-08-28 00:53:59 +02005399 def test_socketpair(self):
5400 s1, s2 = socket.socketpair()
5401 self.addCleanup(s1.close)
5402 self.addCleanup(s2.close)
5403 self.assertEqual(s1.get_inheritable(), False)
5404 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005405
5406
5407@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5408 "SOCK_NONBLOCK not defined")
5409class NonblockConstantTest(unittest.TestCase):
5410 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5411 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005412 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005413 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005414 self.assertTrue(
5415 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005416 if timeout == 0:
5417 # timeout == 0: means that getblocking() must be False.
5418 self.assertFalse(s.getblocking())
5419 else:
5420 # If timeout > 0, the socket will be in a "blocking" mode
5421 # from the standpoint of the Python API. For Python socket
5422 # object, "blocking" means that operations like 'sock.recv()'
5423 # will block. Internally, file descriptors for
5424 # "blocking" Python sockets *with timeouts* are in a
5425 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5426 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5427 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005428 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005429 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005430 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005431 self.assertFalse(
5432 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005433 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005434
Charles-François Natali239bb962011-06-03 12:55:15 +02005435 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005436 def test_SOCK_NONBLOCK(self):
5437 # a lot of it seems silly and redundant, but I wanted to test that
5438 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005439 with socket.socket(socket.AF_INET,
5440 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5441 self.checkNonblock(s)
5442 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005443 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005444 s.setblocking(0)
5445 self.checkNonblock(s)
5446 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005447 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005448 s.settimeout(2.0)
5449 self.checkNonblock(s, timeout=2.0)
5450 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005451 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005452 # defaulttimeout
5453 t = socket.getdefaulttimeout()
5454 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005455 with socket.socket() as s:
5456 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005457 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005458 with socket.socket() as s:
5459 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005460 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005461 with socket.socket() as s:
5462 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005463 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005464 with socket.socket() as s:
5465 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005466 socket.setdefaulttimeout(t)
5467
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005468
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005469@unittest.skipUnless(os.name == "nt", "Windows specific")
5470@unittest.skipUnless(multiprocessing, "need multiprocessing")
5471class TestSocketSharing(SocketTCPTest):
5472 # This must be classmethod and not staticmethod or multiprocessing
5473 # won't be able to bootstrap it.
5474 @classmethod
5475 def remoteProcessServer(cls, q):
5476 # Recreate socket from shared data
5477 sdata = q.get()
5478 message = q.get()
5479
5480 s = socket.fromshare(sdata)
5481 s2, c = s.accept()
5482
5483 # Send the message
5484 s2.sendall(message)
5485 s2.close()
5486 s.close()
5487
5488 def testShare(self):
5489 # Transfer the listening server socket to another process
5490 # and service it from there.
5491
5492 # Create process:
5493 q = multiprocessing.Queue()
5494 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5495 p.start()
5496
5497 # Get the shared socket data
5498 data = self.serv.share(p.pid)
5499
5500 # Pass the shared socket to the other process
5501 addr = self.serv.getsockname()
5502 self.serv.close()
5503 q.put(data)
5504
5505 # The data that the server will send us
5506 message = b"slapmahfro"
5507 q.put(message)
5508
5509 # Connect
5510 s = socket.create_connection(addr)
5511 # listen for the data
5512 m = []
5513 while True:
5514 data = s.recv(100)
5515 if not data:
5516 break
5517 m.append(data)
5518 s.close()
5519 received = b"".join(m)
5520 self.assertEqual(received, message)
5521 p.join()
5522
5523 def testShareLength(self):
5524 data = self.serv.share(os.getpid())
5525 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5526 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5527
5528 def compareSockets(self, org, other):
5529 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005530 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005531 self.assertEqual(org.gettimeout(), None)
5532 self.assertEqual(org.gettimeout(), other.gettimeout())
5533
5534 self.assertEqual(org.family, other.family)
5535 self.assertEqual(org.type, other.type)
5536 # If the user specified "0" for proto, then
5537 # internally windows will have picked the correct value.
5538 # Python introspection on the socket however will still return
5539 # 0. For the shared socket, the python value is recreated
5540 # from the actual value, so it may not compare correctly.
5541 if org.proto != 0:
5542 self.assertEqual(org.proto, other.proto)
5543
5544 def testShareLocal(self):
5545 data = self.serv.share(os.getpid())
5546 s = socket.fromshare(data)
5547 try:
5548 self.compareSockets(self.serv, s)
5549 finally:
5550 s.close()
5551
5552 def testTypes(self):
5553 families = [socket.AF_INET, socket.AF_INET6]
5554 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5555 for f in families:
5556 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005557 try:
5558 source = socket.socket(f, t)
5559 except OSError:
5560 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005561 try:
5562 data = source.share(os.getpid())
5563 shared = socket.fromshare(data)
5564 try:
5565 self.compareSockets(source, shared)
5566 finally:
5567 shared.close()
5568 finally:
5569 source.close()
5570
5571
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005572class SendfileUsingSendTest(ThreadedTCPSocketTest):
5573 """
5574 Test the send() implementation of socket.sendfile().
5575 """
5576
Victor Stinner8c663fd2017-11-08 14:44:44 -08005577 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005578 BUFSIZE = 8192
5579 FILEDATA = b""
5580 TIMEOUT = 2
5581
5582 @classmethod
5583 def setUpClass(cls):
5584 def chunks(total, step):
5585 assert total >= step
5586 while total > step:
5587 yield step
5588 total -= step
5589 if total:
5590 yield total
5591
5592 chunk = b"".join([random.choice(string.ascii_letters).encode()
5593 for i in range(cls.BUFSIZE)])
5594 with open(support.TESTFN, 'wb') as f:
5595 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5596 f.write(chunk)
5597 with open(support.TESTFN, 'rb') as f:
5598 cls.FILEDATA = f.read()
5599 assert len(cls.FILEDATA) == cls.FILESIZE
5600
5601 @classmethod
5602 def tearDownClass(cls):
5603 support.unlink(support.TESTFN)
5604
5605 def accept_conn(self):
5606 self.serv.settimeout(self.TIMEOUT)
5607 conn, addr = self.serv.accept()
5608 conn.settimeout(self.TIMEOUT)
5609 self.addCleanup(conn.close)
5610 return conn
5611
5612 def recv_data(self, conn):
5613 received = []
5614 while True:
5615 chunk = conn.recv(self.BUFSIZE)
5616 if not chunk:
5617 break
5618 received.append(chunk)
5619 return b''.join(received)
5620
5621 def meth_from_sock(self, sock):
5622 # Depending on the mixin class being run return either send()
5623 # or sendfile() method implementation.
5624 return getattr(sock, "_sendfile_use_send")
5625
5626 # regular file
5627
5628 def _testRegularFile(self):
5629 address = self.serv.getsockname()
5630 file = open(support.TESTFN, 'rb')
5631 with socket.create_connection(address) as sock, file as file:
5632 meth = self.meth_from_sock(sock)
5633 sent = meth(file)
5634 self.assertEqual(sent, self.FILESIZE)
5635 self.assertEqual(file.tell(), self.FILESIZE)
5636
5637 def testRegularFile(self):
5638 conn = self.accept_conn()
5639 data = self.recv_data(conn)
5640 self.assertEqual(len(data), self.FILESIZE)
5641 self.assertEqual(data, self.FILEDATA)
5642
5643 # non regular file
5644
5645 def _testNonRegularFile(self):
5646 address = self.serv.getsockname()
5647 file = io.BytesIO(self.FILEDATA)
5648 with socket.create_connection(address) as sock, file as file:
5649 sent = sock.sendfile(file)
5650 self.assertEqual(sent, self.FILESIZE)
5651 self.assertEqual(file.tell(), self.FILESIZE)
5652 self.assertRaises(socket._GiveupOnSendfile,
5653 sock._sendfile_use_sendfile, file)
5654
5655 def testNonRegularFile(self):
5656 conn = self.accept_conn()
5657 data = self.recv_data(conn)
5658 self.assertEqual(len(data), self.FILESIZE)
5659 self.assertEqual(data, self.FILEDATA)
5660
5661 # empty file
5662
5663 def _testEmptyFileSend(self):
5664 address = self.serv.getsockname()
5665 filename = support.TESTFN + "2"
5666 with open(filename, 'wb'):
5667 self.addCleanup(support.unlink, filename)
5668 file = open(filename, 'rb')
5669 with socket.create_connection(address) as sock, file as file:
5670 meth = self.meth_from_sock(sock)
5671 sent = meth(file)
5672 self.assertEqual(sent, 0)
5673 self.assertEqual(file.tell(), 0)
5674
5675 def testEmptyFileSend(self):
5676 conn = self.accept_conn()
5677 data = self.recv_data(conn)
5678 self.assertEqual(data, b"")
5679
5680 # offset
5681
5682 def _testOffset(self):
5683 address = self.serv.getsockname()
5684 file = open(support.TESTFN, 'rb')
5685 with socket.create_connection(address) as sock, file as file:
5686 meth = self.meth_from_sock(sock)
5687 sent = meth(file, offset=5000)
5688 self.assertEqual(sent, self.FILESIZE - 5000)
5689 self.assertEqual(file.tell(), self.FILESIZE)
5690
5691 def testOffset(self):
5692 conn = self.accept_conn()
5693 data = self.recv_data(conn)
5694 self.assertEqual(len(data), self.FILESIZE - 5000)
5695 self.assertEqual(data, self.FILEDATA[5000:])
5696
5697 # count
5698
5699 def _testCount(self):
5700 address = self.serv.getsockname()
5701 file = open(support.TESTFN, 'rb')
5702 with socket.create_connection(address, timeout=2) as sock, file as file:
5703 count = 5000007
5704 meth = self.meth_from_sock(sock)
5705 sent = meth(file, count=count)
5706 self.assertEqual(sent, count)
5707 self.assertEqual(file.tell(), count)
5708
5709 def testCount(self):
5710 count = 5000007
5711 conn = self.accept_conn()
5712 data = self.recv_data(conn)
5713 self.assertEqual(len(data), count)
5714 self.assertEqual(data, self.FILEDATA[:count])
5715
5716 # count small
5717
5718 def _testCountSmall(self):
5719 address = self.serv.getsockname()
5720 file = open(support.TESTFN, 'rb')
5721 with socket.create_connection(address, timeout=2) as sock, file as file:
5722 count = 1
5723 meth = self.meth_from_sock(sock)
5724 sent = meth(file, count=count)
5725 self.assertEqual(sent, count)
5726 self.assertEqual(file.tell(), count)
5727
5728 def testCountSmall(self):
5729 count = 1
5730 conn = self.accept_conn()
5731 data = self.recv_data(conn)
5732 self.assertEqual(len(data), count)
5733 self.assertEqual(data, self.FILEDATA[:count])
5734
5735 # count + offset
5736
5737 def _testCountWithOffset(self):
5738 address = self.serv.getsockname()
5739 file = open(support.TESTFN, 'rb')
5740 with socket.create_connection(address, timeout=2) as sock, file as file:
5741 count = 100007
5742 meth = self.meth_from_sock(sock)
5743 sent = meth(file, offset=2007, count=count)
5744 self.assertEqual(sent, count)
5745 self.assertEqual(file.tell(), count + 2007)
5746
5747 def testCountWithOffset(self):
5748 count = 100007
5749 conn = self.accept_conn()
5750 data = self.recv_data(conn)
5751 self.assertEqual(len(data), count)
5752 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5753
5754 # non blocking sockets are not supposed to work
5755
5756 def _testNonBlocking(self):
5757 address = self.serv.getsockname()
5758 file = open(support.TESTFN, 'rb')
5759 with socket.create_connection(address) as sock, file as file:
5760 sock.setblocking(False)
5761 meth = self.meth_from_sock(sock)
5762 self.assertRaises(ValueError, meth, file)
5763 self.assertRaises(ValueError, sock.sendfile, file)
5764
5765 def testNonBlocking(self):
5766 conn = self.accept_conn()
5767 if conn.recv(8192):
5768 self.fail('was not supposed to receive any data')
5769
5770 # timeout (non-triggered)
5771
5772 def _testWithTimeout(self):
5773 address = self.serv.getsockname()
5774 file = open(support.TESTFN, 'rb')
5775 with socket.create_connection(address, timeout=2) as sock, file as file:
5776 meth = self.meth_from_sock(sock)
5777 sent = meth(file)
5778 self.assertEqual(sent, self.FILESIZE)
5779
5780 def testWithTimeout(self):
5781 conn = self.accept_conn()
5782 data = self.recv_data(conn)
5783 self.assertEqual(len(data), self.FILESIZE)
5784 self.assertEqual(data, self.FILEDATA)
5785
5786 # timeout (triggered)
5787
5788 def _testWithTimeoutTriggeredSend(self):
5789 address = self.serv.getsockname()
Pablo Galindo1f511e12018-12-29 01:42:16 +00005790 with open(support.TESTFN, 'rb') as file:
5791 with socket.create_connection(address, timeout=0.01) as sock:
5792 meth = self.meth_from_sock(sock)
5793 self.assertRaises(socket.timeout, meth, file)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005794
5795 def testWithTimeoutTriggeredSend(self):
5796 conn = self.accept_conn()
5797 conn.recv(88192)
5798
5799 # errors
5800
5801 def _test_errors(self):
5802 pass
5803
5804 def test_errors(self):
5805 with open(support.TESTFN, 'rb') as file:
5806 with socket.socket(type=socket.SOCK_DGRAM) as s:
5807 meth = self.meth_from_sock(s)
5808 self.assertRaisesRegex(
5809 ValueError, "SOCK_STREAM", meth, file)
5810 with open(support.TESTFN, 'rt') as file:
5811 with socket.socket() as s:
5812 meth = self.meth_from_sock(s)
5813 self.assertRaisesRegex(
5814 ValueError, "binary mode", meth, file)
5815 with open(support.TESTFN, 'rb') as file:
5816 with socket.socket() as s:
5817 meth = self.meth_from_sock(s)
5818 self.assertRaisesRegex(TypeError, "positive integer",
5819 meth, file, count='2')
5820 self.assertRaisesRegex(TypeError, "positive integer",
5821 meth, file, count=0.1)
5822 self.assertRaisesRegex(ValueError, "positive integer",
5823 meth, file, count=0)
5824 self.assertRaisesRegex(ValueError, "positive integer",
5825 meth, file, count=-1)
5826
5827
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005828@unittest.skipUnless(hasattr(os, "sendfile"),
5829 'os.sendfile() required for this test.')
5830class SendfileUsingSendfileTest(SendfileUsingSendTest):
5831 """
5832 Test the sendfile() implementation of socket.sendfile().
5833 """
5834 def meth_from_sock(self, sock):
5835 return getattr(sock, "_sendfile_use_sendfile")
5836
Christian Heimes48371412016-09-06 00:37:46 +02005837
5838@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005839class LinuxKernelCryptoAPI(unittest.TestCase):
5840 # tests for AF_ALG
5841 def create_alg(self, typ, name):
5842 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005843 try:
5844 sock.bind((typ, name))
5845 except FileNotFoundError as e:
5846 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005847 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005848 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005849 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005850 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005851
Victor Stinner86afc1f2017-11-30 13:58:43 +01005852 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5853 # at least on ppc64le architecture
5854 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005855 def test_sha256(self):
5856 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5857 "177a9cb410ff61f20015ad")
5858 with self.create_alg('hash', 'sha256') as algo:
5859 op, _ = algo.accept()
5860 with op:
5861 op.sendall(b"abc")
5862 self.assertEqual(op.recv(512), expected)
5863
5864 op, _ = algo.accept()
5865 with op:
5866 op.send(b'a', socket.MSG_MORE)
5867 op.send(b'b', socket.MSG_MORE)
5868 op.send(b'c', socket.MSG_MORE)
5869 op.send(b'')
5870 self.assertEqual(op.recv(512), expected)
5871
5872 def test_hmac_sha1(self):
5873 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5874 with self.create_alg('hash', 'hmac(sha1)') as algo:
5875 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5876 op, _ = algo.accept()
5877 with op:
5878 op.sendall(b"what do ya want for nothing?")
5879 self.assertEqual(op.recv(512), expected)
5880
Christian Heimese084f842016-09-11 20:11:30 +02005881 # Although it should work with 3.19 and newer the test blocks on
5882 # Ubuntu 15.10 with Kernel 4.2.0-19.
5883 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005884 def test_aes_cbc(self):
5885 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5886 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5887 msg = b"Single block msg"
5888 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5889 msglen = len(msg)
5890 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5891 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5892 op, _ = algo.accept()
5893 with op:
5894 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5895 flags=socket.MSG_MORE)
5896 op.sendall(msg)
5897 self.assertEqual(op.recv(msglen), ciphertext)
5898
5899 op, _ = algo.accept()
5900 with op:
5901 op.sendmsg_afalg([ciphertext],
5902 op=socket.ALG_OP_DECRYPT, iv=iv)
5903 self.assertEqual(op.recv(msglen), msg)
5904
5905 # long message
5906 multiplier = 1024
5907 longmsg = [msg] * multiplier
5908 op, _ = algo.accept()
5909 with op:
5910 op.sendmsg_afalg(longmsg,
5911 op=socket.ALG_OP_ENCRYPT, iv=iv)
5912 enc = op.recv(msglen * multiplier)
5913 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05005914 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005915
5916 op, _ = algo.accept()
5917 with op:
5918 op.sendmsg_afalg([enc],
5919 op=socket.ALG_OP_DECRYPT, iv=iv)
5920 dec = op.recv(msglen * multiplier)
5921 self.assertEqual(len(dec), msglen * multiplier)
5922 self.assertEqual(dec, msg * multiplier)
5923
matejcik9764c152017-02-16 14:41:31 +01005924 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005925 def test_aead_aes_gcm(self):
5926 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5927 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5928 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5929 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5930 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5931 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5932
5933 taglen = len(expected_tag)
5934 assoclen = len(assoc)
5935
5936 with self.create_alg('aead', 'gcm(aes)') as algo:
5937 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5938 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5939 None, taglen)
5940
5941 # send assoc, plain and tag buffer in separate steps
5942 op, _ = algo.accept()
5943 with op:
5944 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5945 assoclen=assoclen, flags=socket.MSG_MORE)
5946 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005947 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005948 res = op.recv(assoclen + len(plain) + taglen)
5949 self.assertEqual(expected_ct, res[assoclen:-taglen])
5950 self.assertEqual(expected_tag, res[-taglen:])
5951
5952 # now with msg
5953 op, _ = algo.accept()
5954 with op:
matejcik9764c152017-02-16 14:41:31 +01005955 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005956 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5957 assoclen=assoclen)
5958 res = op.recv(assoclen + len(plain) + taglen)
5959 self.assertEqual(expected_ct, res[assoclen:-taglen])
5960 self.assertEqual(expected_tag, res[-taglen:])
5961
5962 # create anc data manually
5963 pack_uint32 = struct.Struct('I').pack
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(
5968 [msg],
5969 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5970 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5971 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5972 )
5973 )
matejcik9764c152017-02-16 14:41:31 +01005974 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005975 self.assertEqual(expected_ct, res[assoclen:-taglen])
5976 self.assertEqual(expected_tag, res[-taglen:])
5977
5978 # decrypt and verify
5979 op, _ = algo.accept()
5980 with op:
5981 msg = assoc + expected_ct + expected_tag
5982 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5983 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005984 res = op.recv(len(msg) - taglen)
5985 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005986
Christian Heimese084f842016-09-11 20:11:30 +02005987 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005988 def test_drbg_pr_sha256(self):
5989 # deterministic random bit generator, prediction resistance, sha256
5990 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5991 extra_seed = os.urandom(32)
5992 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5993 op, _ = algo.accept()
5994 with op:
5995 rn = op.recv(32)
5996 self.assertEqual(len(rn), 32)
5997
5998 def test_sendmsg_afalg_args(self):
5999 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02006000 with sock:
6001 with self.assertRaises(TypeError):
6002 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02006003
Christian Heimes02b30352016-09-11 19:49:56 +02006004 with self.assertRaises(TypeError):
6005 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006006
Christian Heimes02b30352016-09-11 19:49:56 +02006007 with self.assertRaises(TypeError):
6008 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02006009
Christian Heimes02b30352016-09-11 19:49:56 +02006010 with self.assertRaises(TypeError):
6011 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02006012
Christian Heimes02b30352016-09-11 19:49:56 +02006013 with self.assertRaises(TypeError):
6014 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
6015
Christian Heimes2eb6ad82018-12-10 11:22:37 +01006016 def test_length_restriction(self):
6017 # bpo-35050, off-by-one error in length check
6018 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
6019 self.addCleanup(sock.close)
6020
6021 # salg_type[14]
6022 with self.assertRaises(FileNotFoundError):
6023 sock.bind(("t" * 13, "name"))
6024 with self.assertRaisesRegex(ValueError, "type too long"):
6025 sock.bind(("t" * 14, "name"))
6026
6027 # salg_name[64]
6028 with self.assertRaises(FileNotFoundError):
6029 sock.bind(("type", "n" * 63))
6030 with self.assertRaisesRegex(ValueError, "name too long"):
6031 sock.bind(("type", "n" * 64))
6032
6033
animalize19e7d482018-02-27 02:10:36 +08006034@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
6035class TestMSWindowsTCPFlags(unittest.TestCase):
6036 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03006037 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08006038 'TCP_MAXSEG',
6039 'TCP_NODELAY',
6040 # available starting with Windows 10 1607
6041 'TCP_FASTOPEN',
6042 # available starting with Windows 10 1703
6043 'TCP_KEEPCNT',
6044 # available starting with Windows 10 1709
6045 'TCP_KEEPIDLE',
6046 'TCP_KEEPINTVL'
6047 }
6048
6049 def test_new_tcp_flags(self):
6050 provided = [s for s in dir(socket) if s.startswith('TCP')]
6051 unknown = [s for s in provided if s not in self.knownTCPFlags]
6052
6053 self.assertEqual([], unknown,
6054 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006055
Guido van Rossumb995eb72002-07-31 16:08:40 +00006056def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006057 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00006058 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006059
6060 tests.extend([
6061 NonBlockingTCPTests,
6062 FileObjectClassTestCase,
6063 UnbufferedFileObjectClassTestCase,
6064 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006065 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006066 UnicodeReadFileObjectClassTestCase,
6067 UnicodeWriteFileObjectClassTestCase,
6068 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006069 NetworkConnectionNoServer,
6070 NetworkConnectionAttributesTest,
6071 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006072 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006073 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006074 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006075 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006076 tests.append(BasicSocketPairTest)
6077 tests.append(TestUnixDomain)
6078 tests.append(TestLinuxAbstractNamespace)
6079 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006080 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006081 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006082 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006083 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006084 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006085 BasicVSOCKTest,
6086 ThreadedVSOCKSocketStreamTest,
6087 ])
6088 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006089 CmsgMacroTests,
6090 SendmsgUDPTest,
6091 RecvmsgUDPTest,
6092 RecvmsgIntoUDPTest,
6093 SendmsgUDP6Test,
6094 RecvmsgUDP6Test,
6095 RecvmsgRFC3542AncillaryUDP6Test,
6096 RecvmsgIntoRFC3542AncillaryUDP6Test,
6097 RecvmsgIntoUDP6Test,
6098 SendmsgTCPTest,
6099 RecvmsgTCPTest,
6100 RecvmsgIntoTCPTest,
6101 SendmsgSCTPStreamTest,
6102 RecvmsgSCTPStreamTest,
6103 RecvmsgIntoSCTPStreamTest,
6104 SendmsgUnixStreamTest,
6105 RecvmsgUnixStreamTest,
6106 RecvmsgIntoUnixStreamTest,
6107 RecvmsgSCMRightsStreamTest,
6108 RecvmsgIntoSCMRightsStreamTest,
6109 # These are slow when setitimer() is not available
6110 InterruptedRecvTimeoutTest,
6111 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006112 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006113 SendfileUsingSendTest,
6114 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006115 ])
animalize19e7d482018-02-27 02:10:36 +08006116 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006117
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006118 thread_info = support.threading_setup()
6119 support.run_unittest(*tests)
6120 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006121
6122if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006123 test_main()