blob: 626a0779735826096d93aef201707b46fb7f87ce [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
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020022import random
Christian Heimesb6e43af2018-01-29 22:37:58 +010023import shutil
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020024import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020025import _thread as thread
26import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000027try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000028 import multiprocessing
29except ImportError:
30 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020031try:
32 import fcntl
33except ImportError:
34 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Benjamin Petersonee8712c2008-05-20 21:35:26 +000036HOST = support.HOST
Victor Stinner304315d2018-11-30 13:22:44 +010037# test unicode string and carriage return
38MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
Victor Stinnerebd5d6d2018-11-30 12:29:25 +010039MAIN_TIMEOUT = 60.0
Barry Warsawcf3d4b51997-01-03 20:03:32 +000040
caaveryeffc12f2017-09-06 18:18:10 -040041VSOCKPORT = 1234
42
Victor Stinner45df8202010-04-28 22:31:17 +000043try:
Victor Stinnere254e532014-07-26 14:36:55 +020044 import _socket
45except ImportError:
46 _socket = None
47
caaveryeffc12f2017-09-06 18:18:10 -040048def get_cid():
49 if fcntl is None:
50 return None
51 try:
52 with open("/dev/vsock", "rb") as f:
53 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
54 except OSError:
55 return None
56 else:
57 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000058
Charles-François Natali47413c12011-10-06 19:47:44 +020059def _have_socket_can():
60 """Check whether CAN sockets are supported on this host."""
61 try:
62 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020063 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020064 return False
65 else:
66 s.close()
67 return True
68
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040069def _have_socket_can_isotp():
70 """Check whether CAN ISOTP sockets are supported on this host."""
71 try:
72 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
73 except (AttributeError, OSError):
74 return False
75 else:
76 s.close()
77 return True
78
Charles-François Natali10b8cf42011-11-10 19:21:37 +010079def _have_socket_rds():
80 """Check whether RDS sockets are supported on this host."""
81 try:
82 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
83 except (AttributeError, OSError):
84 return False
85 else:
86 s.close()
87 return True
88
Christian Heimes48371412016-09-06 00:37:46 +020089def _have_socket_alg():
90 """Check whether AF_ALG sockets are supported on this host."""
91 try:
92 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
93 except (AttributeError, OSError):
94 return False
95 else:
96 s.close()
97 return True
98
Bjorn Anderssonbb816512018-09-26 06:47:52 -070099def _have_socket_qipcrtr():
100 """Check whether AF_QIPCRTR sockets are supported on this host."""
101 try:
102 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
103 except (AttributeError, OSError):
104 return False
105 else:
106 s.close()
107 return True
108
caaveryeffc12f2017-09-06 18:18:10 -0400109def _have_socket_vsock():
110 """Check whether AF_VSOCK sockets are supported on this host."""
111 ret = get_cid() is not None
112 return ret
113
Yury Selivanovf11b4602018-01-28 17:27:38 -0500114
Victor Stinner304315d2018-11-30 13:22:44 +0100115@contextlib.contextmanager
116def socket_setdefaulttimeout(timeout):
117 old_timeout = socket.getdefaulttimeout()
118 try:
119 socket.setdefaulttimeout(timeout)
120 yield
121 finally:
122 socket.setdefaulttimeout(old_timeout)
Yury Selivanovf11b4602018-01-28 17:27:38 -0500123
124
Charles-François Natali47413c12011-10-06 19:47:44 +0200125HAVE_SOCKET_CAN = _have_socket_can()
126
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400127HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
128
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100129HAVE_SOCKET_RDS = _have_socket_rds()
130
Christian Heimes48371412016-09-06 00:37:46 +0200131HAVE_SOCKET_ALG = _have_socket_alg()
132
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700133HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
134
caaveryeffc12f2017-09-06 18:18:10 -0400135HAVE_SOCKET_VSOCK = _have_socket_vsock()
136
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000137# Size in bytes of the int type
138SIZEOF_INT = array.array("i").itemsize
139
Guido van Rossum24e4af82002-06-12 19:18:08 +0000140class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000141
Guido van Rossum24e4af82002-06-12 19:18:08 +0000142 def setUp(self):
143 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000144 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100145 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000146
Guido van Rossum24e4af82002-06-12 19:18:08 +0000147 def tearDown(self):
148 self.serv.close()
149 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000150
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151class SocketUDPTest(unittest.TestCase):
152
153 def setUp(self):
154 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000155 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def tearDown(self):
158 self.serv.close()
159 self.serv = None
160
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000161class ThreadSafeCleanupTestCase(unittest.TestCase):
162 """Subclass of unittest.TestCase with thread-safe cleanup methods.
163
164 This subclass protects the addCleanup() and doCleanups() methods
165 with a recursive lock.
166 """
167
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200168 def __init__(self, *args, **kwargs):
169 super().__init__(*args, **kwargs)
170 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000171
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200172 def addCleanup(self, *args, **kwargs):
173 with self._cleanup_lock:
174 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000175
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200176 def doCleanups(self, *args, **kwargs):
177 with self._cleanup_lock:
178 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000179
Charles-François Natali47413c12011-10-06 19:47:44 +0200180class SocketCANTest(unittest.TestCase):
181
182 """To be able to run this test, a `vcan0` CAN interface can be created with
183 the following commands:
184 # modprobe vcan
185 # ip link add dev vcan0 type vcan
186 # ifconfig vcan0 up
187 """
188 interface = 'vcan0'
189 bufsize = 128
190
Charles-François Natali773e42d2013-02-05 19:42:01 +0100191 """The CAN frame structure is defined in <linux/can.h>:
192
193 struct can_frame {
194 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
195 __u8 can_dlc; /* data length code: 0 .. 8 */
196 __u8 data[8] __attribute__((aligned(8)));
197 };
198 """
199 can_frame_fmt = "=IB3x8s"
200 can_frame_size = struct.calcsize(can_frame_fmt)
201
202 """The Broadcast Management Command frame structure is defined
203 in <linux/can/bcm.h>:
204
205 struct bcm_msg_head {
206 __u32 opcode;
207 __u32 flags;
208 __u32 count;
209 struct timeval ival1, ival2;
210 canid_t can_id;
211 __u32 nframes;
212 struct can_frame frames[0];
213 }
214
215 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
216 `struct can_frame` definition). Must use native not standard types for packing.
217 """
218 bcm_cmd_msg_fmt = "@3I4l2I"
219 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
220
Charles-François Natali47413c12011-10-06 19:47:44 +0200221 def setUp(self):
222 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200223 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200224 try:
225 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200226 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200227 self.skipTest('network interface `%s` does not exist' %
228 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200229
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100230
231class SocketRDSTest(unittest.TestCase):
232
233 """To be able to run this test, the `rds` kernel module must be loaded:
234 # modprobe rds
235 """
236 bufsize = 8192
237
238 def setUp(self):
239 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
240 self.addCleanup(self.serv.close)
241 try:
242 self.port = support.bind_port(self.serv)
243 except OSError:
244 self.skipTest('unable to bind RDS socket')
245
246
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000248 """Threadable Test class
249
250 The ThreadableTest class makes it easy to create a threaded
251 client/server pair from an existing unit test. To create a
252 new threaded class from an existing unit test, use multiple
253 inheritance:
254
255 class NewClass (OldClass, ThreadableTest):
256 pass
257
258 This class defines two new fixture functions with obvious
259 purposes for overriding:
260
261 clientSetUp ()
262 clientTearDown ()
263
264 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000265 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000266 '_' to indicate the client portion of the test. Ex:
267
268 def testFoo(self):
269 # Server portion
270
271 def _testFoo(self):
272 # Client portion
273
274 Any exceptions raised by the clients during their tests
275 are caught and transferred to the main thread to alert
276 the testing framework.
277
278 Note, the server setup function cannot call any blocking
279 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000280 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000281 the blocking call (such as in setting up a client/server
282 connection and performing the accept() in setUp().
283 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284
285 def __init__(self):
286 # Swap the true setup function
287 self.__setUp = self.setUp
288 self.__tearDown = self.tearDown
289 self.setUp = self._setUp
290 self.tearDown = self._tearDown
291
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000292 def serverExplicitReady(self):
293 """This method allows the server to explicitly indicate that
294 it wants the client thread to proceed. This is useful if the
295 server is about to execute a blocking routine that is
296 dependent upon the client thread during its setup routine."""
297 self.server_ready.set()
298
Guido van Rossum24e4af82002-06-12 19:18:08 +0000299 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700300 self.wait_threads = support.wait_threads_exit()
301 self.wait_threads.__enter__()
302
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000303 self.server_ready = threading.Event()
304 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000305 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000306 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200307 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000308
309 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000310 methodname = self.id()
311 i = methodname.rfind('.')
312 methodname = methodname[i+1:]
313 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000314 self.client_thread = thread.start_new_thread(
315 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200317 try:
318 self.__setUp()
319 except:
320 self.server_crashed = True
321 raise
322 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000323 self.server_ready.set()
324 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325
326 def _tearDown(self):
327 self.__tearDown()
328 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700329 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000331 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000332 exc = self.queue.get()
333 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000334
335 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000336 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100337 try:
338 self.clientSetUp()
339 except BaseException as e:
340 self.queue.put(e)
341 self.clientTearDown()
342 return
343 finally:
344 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200345 if self.server_crashed:
346 self.clientTearDown()
347 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000348 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000349 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000350 try:
351 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000352 except BaseException as e:
353 self.queue.put(e)
354 finally:
355 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356
357 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000358 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359
360 def clientTearDown(self):
361 self.done.set()
362 thread.exit()
363
364class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
365
366 def __init__(self, methodName='runTest'):
367 SocketTCPTest.__init__(self, methodName=methodName)
368 ThreadableTest.__init__(self)
369
370 def clientSetUp(self):
371 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
372
373 def clientTearDown(self):
374 self.cli.close()
375 self.cli = None
376 ThreadableTest.clientTearDown(self)
377
378class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
379
380 def __init__(self, methodName='runTest'):
381 SocketUDPTest.__init__(self, methodName=methodName)
382 ThreadableTest.__init__(self)
383
384 def clientSetUp(self):
385 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
386
Brian Curtin3beb38f2010-11-04 03:41:43 +0000387 def clientTearDown(self):
388 self.cli.close()
389 self.cli = None
390 ThreadableTest.clientTearDown(self)
391
Charles-François Natali47413c12011-10-06 19:47:44 +0200392class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
393
394 def __init__(self, methodName='runTest'):
395 SocketCANTest.__init__(self, methodName=methodName)
396 ThreadableTest.__init__(self)
397
398 def clientSetUp(self):
399 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
400 try:
401 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200402 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200403 # skipTest should not be called here, and will be called in the
404 # server instead
405 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200406
407 def clientTearDown(self):
408 self.cli.close()
409 self.cli = None
410 ThreadableTest.clientTearDown(self)
411
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100412class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
413
414 def __init__(self, methodName='runTest'):
415 SocketRDSTest.__init__(self, methodName=methodName)
416 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100417
418 def clientSetUp(self):
419 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
420 try:
421 # RDS sockets must be bound explicitly to send or receive data
422 self.cli.bind((HOST, 0))
423 self.cli_addr = self.cli.getsockname()
424 except OSError:
425 # skipTest should not be called here, and will be called in the
426 # server instead
427 pass
428
429 def clientTearDown(self):
430 self.cli.close()
431 self.cli = None
432 ThreadableTest.clientTearDown(self)
433
caaveryeffc12f2017-09-06 18:18:10 -0400434@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400435@unittest.skipUnless(HAVE_SOCKET_VSOCK,
436 'VSOCK sockets required for this test.')
437@unittest.skipUnless(get_cid() != 2,
438 "This test can only be run on a virtual guest.")
439class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
440
441 def __init__(self, methodName='runTest'):
442 unittest.TestCase.__init__(self, methodName=methodName)
443 ThreadableTest.__init__(self)
444
445 def setUp(self):
446 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
447 self.addCleanup(self.serv.close)
448 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
449 self.serv.listen()
450 self.serverExplicitReady()
451 self.conn, self.connaddr = self.serv.accept()
452 self.addCleanup(self.conn.close)
453
454 def clientSetUp(self):
455 time.sleep(0.1)
456 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
457 self.addCleanup(self.cli.close)
458 cid = get_cid()
459 self.cli.connect((cid, VSOCKPORT))
460
461 def testStream(self):
462 msg = self.conn.recv(1024)
463 self.assertEqual(msg, MSG)
464
465 def _testStream(self):
466 self.cli.send(MSG)
467 self.cli.close()
468
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000470 """Socket tests for client-server connection.
471
472 self.cli_conn is a client socket connected to the server. The
473 setUp() method guarantees that it is connected to the server.
474 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000475
476 def __init__(self, methodName='runTest'):
477 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
478
479 def setUp(self):
480 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000481 # Indicate explicitly we're ready for the client thread to
482 # proceed and then perform the blocking call to accept
483 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 conn, addr = self.serv.accept()
485 self.cli_conn = conn
486
487 def tearDown(self):
488 self.cli_conn.close()
489 self.cli_conn = None
490 ThreadedTCPSocketTest.tearDown(self)
491
492 def clientSetUp(self):
493 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000494 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495 self.serv_conn = self.cli
496
497 def clientTearDown(self):
498 self.serv_conn.close()
499 self.serv_conn = None
500 ThreadedTCPSocketTest.clientTearDown(self)
501
Dave Cole331708b2004-08-09 04:51:41 +0000502class SocketPairTest(unittest.TestCase, ThreadableTest):
503
504 def __init__(self, methodName='runTest'):
505 unittest.TestCase.__init__(self, methodName=methodName)
506 ThreadableTest.__init__(self)
507
508 def setUp(self):
509 self.serv, self.cli = socket.socketpair()
510
511 def tearDown(self):
512 self.serv.close()
513 self.serv = None
514
515 def clientSetUp(self):
516 pass
517
518 def clientTearDown(self):
519 self.cli.close()
520 self.cli = None
521 ThreadableTest.clientTearDown(self)
522
Tim Peters494aaee2004-08-09 18:54:11 +0000523
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000524# The following classes are used by the sendmsg()/recvmsg() tests.
525# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
526# gives a drop-in replacement for SocketConnectedTest, but different
527# address families can be used, and the attributes serv_addr and
528# cli_addr will be set to the addresses of the endpoints.
529
530class SocketTestBase(unittest.TestCase):
531 """A base class for socket tests.
532
533 Subclasses must provide methods newSocket() to return a new socket
534 and bindSock(sock) to bind it to an unused address.
535
536 Creates a socket self.serv and sets self.serv_addr to its address.
537 """
538
539 def setUp(self):
540 self.serv = self.newSocket()
541 self.bindServer()
542
543 def bindServer(self):
544 """Bind server socket and set self.serv_addr to its address."""
545 self.bindSock(self.serv)
546 self.serv_addr = self.serv.getsockname()
547
548 def tearDown(self):
549 self.serv.close()
550 self.serv = None
551
552
553class SocketListeningTestMixin(SocketTestBase):
554 """Mixin to listen on the server socket."""
555
556 def setUp(self):
557 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100558 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000559
560
561class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
562 ThreadableTest):
563 """Mixin to add client socket and allow client/server tests.
564
565 Client socket is self.cli and its address is self.cli_addr. See
566 ThreadableTest for usage information.
567 """
568
569 def __init__(self, *args, **kwargs):
570 super().__init__(*args, **kwargs)
571 ThreadableTest.__init__(self)
572
573 def clientSetUp(self):
574 self.cli = self.newClientSocket()
575 self.bindClient()
576
577 def newClientSocket(self):
578 """Return a new socket for use as client."""
579 return self.newSocket()
580
581 def bindClient(self):
582 """Bind client socket and set self.cli_addr to its address."""
583 self.bindSock(self.cli)
584 self.cli_addr = self.cli.getsockname()
585
586 def clientTearDown(self):
587 self.cli.close()
588 self.cli = None
589 ThreadableTest.clientTearDown(self)
590
591
592class ConnectedStreamTestMixin(SocketListeningTestMixin,
593 ThreadedSocketTestMixin):
594 """Mixin to allow client/server stream tests with connected client.
595
596 Server's socket representing connection to client is self.cli_conn
597 and client's connection to server is self.serv_conn. (Based on
598 SocketConnectedTest.)
599 """
600
601 def setUp(self):
602 super().setUp()
603 # Indicate explicitly we're ready for the client thread to
604 # proceed and then perform the blocking call to accept
605 self.serverExplicitReady()
606 conn, addr = self.serv.accept()
607 self.cli_conn = conn
608
609 def tearDown(self):
610 self.cli_conn.close()
611 self.cli_conn = None
612 super().tearDown()
613
614 def clientSetUp(self):
615 super().clientSetUp()
616 self.cli.connect(self.serv_addr)
617 self.serv_conn = self.cli
618
619 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100620 try:
621 self.serv_conn.close()
622 self.serv_conn = None
623 except AttributeError:
624 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000625 super().clientTearDown()
626
627
628class UnixSocketTestBase(SocketTestBase):
629 """Base class for Unix-domain socket tests."""
630
631 # This class is used for file descriptor passing tests, so we
632 # create the sockets in a private directory so that other users
633 # can't send anything that might be problematic for a privileged
634 # user running the tests.
635
636 def setUp(self):
637 self.dir_path = tempfile.mkdtemp()
638 self.addCleanup(os.rmdir, self.dir_path)
639 super().setUp()
640
641 def bindSock(self, sock):
642 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100643 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000644 self.addCleanup(support.unlink, path)
645
646class UnixStreamBase(UnixSocketTestBase):
647 """Base class for Unix-domain SOCK_STREAM tests."""
648
649 def newSocket(self):
650 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
651
652
653class InetTestBase(SocketTestBase):
654 """Base class for IPv4 socket tests."""
655
656 host = HOST
657
658 def setUp(self):
659 super().setUp()
660 self.port = self.serv_addr[1]
661
662 def bindSock(self, sock):
663 support.bind_port(sock, host=self.host)
664
665class TCPTestBase(InetTestBase):
666 """Base class for TCP-over-IPv4 tests."""
667
668 def newSocket(self):
669 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
670
671class UDPTestBase(InetTestBase):
672 """Base class for UDP-over-IPv4 tests."""
673
674 def newSocket(self):
675 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
676
677class SCTPStreamBase(InetTestBase):
678 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
679
680 def newSocket(self):
681 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
682 socket.IPPROTO_SCTP)
683
684
685class Inet6TestBase(InetTestBase):
686 """Base class for IPv6 socket tests."""
687
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200688 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000689
690class UDP6TestBase(Inet6TestBase):
691 """Base class for UDP-over-IPv6 tests."""
692
693 def newSocket(self):
694 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
695
696
697# Test-skipping decorators for use with ThreadableTest.
698
699def skipWithClientIf(condition, reason):
700 """Skip decorated test if condition is true, add client_skip decorator.
701
702 If the decorated object is not a class, sets its attribute
703 "client_skip" to a decorator which will return an empty function
704 if the test is to be skipped, or the original function if it is
705 not. This can be used to avoid running the client part of a
706 skipped test when using ThreadableTest.
707 """
708 def client_pass(*args, **kwargs):
709 pass
710 def skipdec(obj):
711 retval = unittest.skip(reason)(obj)
712 if not isinstance(obj, type):
713 retval.client_skip = lambda f: client_pass
714 return retval
715 def noskipdec(obj):
716 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
717 obj.client_skip = lambda f: f
718 return obj
719 return skipdec if condition else noskipdec
720
721
722def requireAttrs(obj, *attributes):
723 """Skip decorated test if obj is missing any of the given attributes.
724
725 Sets client_skip attribute as skipWithClientIf() does.
726 """
727 missing = [name for name in attributes if not hasattr(obj, name)]
728 return skipWithClientIf(
729 missing, "don't have " + ", ".join(name for name in missing))
730
731
732def requireSocket(*args):
733 """Skip decorated test if a socket cannot be created with given arguments.
734
735 When an argument is given as a string, will use the value of that
736 attribute of the socket module, or skip the test if it doesn't
737 exist. Sets client_skip attribute as skipWithClientIf() does.
738 """
739 err = None
740 missing = [obj for obj in args if
741 isinstance(obj, str) and not hasattr(socket, obj)]
742 if missing:
743 err = "don't have " + ", ".join(name for name in missing)
744 else:
745 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
746 for obj in args]
747 try:
748 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200749 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000750 # XXX: check errno?
751 err = str(e)
752 else:
753 s.close()
754 return skipWithClientIf(
755 err is not None,
756 "can't create socket({0}): {1}".format(
757 ", ".join(str(o) for o in args), err))
758
759
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760#######################################################################
761## Begin Tests
762
763class GeneralModuleTests(unittest.TestCase):
764
Ethan Furman7184bac2014-10-14 18:56:53 -0700765 def test_SocketType_is_socketobject(self):
766 import _socket
767 self.assertTrue(socket.SocketType is _socket.socket)
768 s = socket.socket()
769 self.assertIsInstance(s, socket.SocketType)
770 s.close()
771
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000772 def test_repr(self):
773 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200774 with s:
775 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000776 self.assertIn('family=%s' % socket.AF_INET, repr(s))
777 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200778 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200779 self.assertNotIn('raddr', repr(s))
780 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200781 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200782 self.assertIn(str(s.getsockname()), repr(s))
783 self.assertIn('[closed]', repr(s))
784 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000785
Victor Stinnere254e532014-07-26 14:36:55 +0200786 @unittest.skipUnless(_socket is not None, 'need _socket module')
787 def test_csocket_repr(self):
788 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
789 try:
790 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
791 % (s.fileno(), s.family, s.type, s.proto))
792 self.assertEqual(repr(s), expected)
793 finally:
794 s.close()
795 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
796 % (s.family, s.type, s.proto))
797 self.assertEqual(repr(s), expected)
798
Raymond Hettinger027bb632004-05-31 03:09:25 +0000799 def test_weakref(self):
800 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
801 p = proxy(s)
802 self.assertEqual(p.fileno(), s.fileno())
803 s.close()
804 s = None
805 try:
806 p.fileno()
807 except ReferenceError:
808 pass
809 else:
810 self.fail('Socket proxy still exists')
811
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000813 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300814 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200815 with self.assertRaises(OSError, msg=msg % 'OSError'):
816 raise OSError
817 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200819 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821
Ezio Melotti63e42302011-05-07 19:47:48 +0300822 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000823 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300824 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
825 self.addCleanup(s.close)
826 s.bind(('', 0))
827 sockname = s.getsockname()
828 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300829 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300830 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300831 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400832 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300833 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300834 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300835 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400836 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300837 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300838 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300839 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300840 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300841 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300842 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300843 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400844 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300845 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300846 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300847 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400848 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300849 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300850 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300851 self.assertIn('not NoneType', str(cm.exception))
852 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300853 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300854 self.assertIn('an integer is required', str(cm.exception))
855 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300856 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300857 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300858 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300859 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300860 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300861 self.assertIn('(1 given)', str(cm.exception))
862 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300863 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300864 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300865
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000867 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 socket.AF_INET
869 socket.SOCK_STREAM
870 socket.SOCK_DGRAM
871 socket.SOCK_RAW
872 socket.SOCK_RDM
873 socket.SOCK_SEQPACKET
874 socket.SOL_SOCKET
875 socket.SO_REUSEADDR
876
Guido van Rossum654c11e2002-06-13 20:24:17 +0000877 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000879 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000880 try:
881 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200882 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000883 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600884 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000885 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000886 try:
887 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200888 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000889 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600890 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000891 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000892 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000893 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000894 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000895
Charles-François Natali0cc86852013-09-13 19:53:08 +0200896 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700897 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200898 self.assertEqual(socket.gethostbyname(addr), addr)
899
900 # we don't test support.HOSTv6 because there's a chance it doesn't have
901 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700902 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200903 self.assertIn(host, socket.gethostbyaddr(host)[2])
904
Xiang Zhangd36a7162017-03-07 11:06:09 +0800905 def test_host_resolution_bad_address(self):
906 # These are all malformed IP addresses and expected not to resolve to
907 # any result. But some ISPs, e.g. AWS, may successfully resolve these
908 # IPs.
909 explanation = (
910 "resolving an invalid IP address did not raise OSError; "
911 "can be caused by a broken DNS server"
912 )
913 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
914 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400915 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800916 socket.gethostbyname(addr)
917 with self.assertRaises(OSError, msg=explanation):
918 socket.gethostbyaddr(addr)
919
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000920 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
921 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
922 def test_sethostname(self):
923 oldhn = socket.gethostname()
924 try:
925 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200926 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000927 if e.errno == errno.EPERM:
928 self.skipTest("test should be run as root")
929 else:
930 raise
931 try:
932 # running test as root!
933 self.assertEqual(socket.gethostname(), 'new')
934 # Should work with bytes objects too
935 socket.sethostname(b'bar')
936 self.assertEqual(socket.gethostname(), 'bar')
937 finally:
938 socket.sethostname(oldhn)
939
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700940 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
941 'socket.if_nameindex() not available.')
942 def testInterfaceNameIndex(self):
943 interfaces = socket.if_nameindex()
944 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200945 self.assertIsInstance(index, int)
946 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700947 # interface indices are non-zero integers
948 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200949 _index = socket.if_nametoindex(name)
950 self.assertIsInstance(_index, int)
951 self.assertEqual(index, _index)
952 _name = socket.if_indextoname(index)
953 self.assertIsInstance(_name, str)
954 self.assertEqual(name, _name)
955
956 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
957 'socket.if_nameindex() not available.')
958 def testInvalidInterfaceNameIndex(self):
959 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200960 self.assertRaises(OSError, socket.if_indextoname, 0)
961 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200962 # test with invalid values
963 self.assertRaises(TypeError, socket.if_nametoindex, 0)
964 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700965
Serhiy Storchaka43767632013-11-03 21:31:38 +0200966 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
967 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000968 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000969 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200970 try:
971 # On some versions, this loses a reference
972 orig = sys.getrefcount(__name__)
973 socket.getnameinfo(__name__,0)
974 except TypeError:
975 if sys.getrefcount(__name__) != orig:
976 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000977
Guido van Rossum24e4af82002-06-12 19:18:08 +0000978 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000979 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980 try:
981 # On some versions, this crashes the interpreter.
982 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200983 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000984 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000985
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000986 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000987 # This just checks that htons etc. are their own inverse,
988 # when looking at the lower 16 or 32 bits.
989 sizes = {socket.htonl: 32, socket.ntohl: 32,
990 socket.htons: 16, socket.ntohs: 16}
991 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000992 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000993 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
994 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000995
Guido van Rossuma2627af2002-09-14 00:58:46 +0000996 swapped = func(mask)
997 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000998 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000999
Serhiy Storchaka24c738a2017-03-19 20:20:10 +02001000 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +00001001 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001002 import _testcapi
1003 s_good_values = [0, 1, 2, 0xffff]
1004 l_good_values = s_good_values + [0xffffffff]
1005 l_bad_values = [-1, -2, 1<<32, 1<<1000]
1006 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1007 _testcapi.INT_MAX + 1]
1008 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1009 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001010 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001011 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001012 for k in l_good_values:
1013 socket.ntohl(k)
1014 socket.htonl(k)
1015 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001016 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001017 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001018 for k in l_bad_values:
1019 self.assertRaises(OverflowError, socket.ntohl, k)
1020 self.assertRaises(OverflowError, socket.htonl, k)
1021 for k in s_deprecated_values:
1022 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1023 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001024
Barry Warsaw11b91a02004-06-28 00:50:43 +00001025 def testGetServBy(self):
1026 eq = self.assertEqual
1027 # Find one service that exists, then check all the related interfaces.
1028 # I've ordered this by protocols that have both a tcp and udp
1029 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001030 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001031 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001032 # avoid the 'echo' service on this platform, as there is an
1033 # assumption breaking non-standard port/protocol entry
1034 services = ('daytime', 'qotd', 'domain')
1035 else:
1036 services = ('echo', 'daytime', 'domain')
1037 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001038 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001039 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001040 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001041 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001042 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001043 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001044 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001045 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001046 # Issue #26936: Android getservbyname() was broken before API 23.
1047 if (not hasattr(sys, 'getandroidapilevel') or
1048 sys.getandroidapilevel() >= 23):
1049 port2 = socket.getservbyname(service)
1050 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001051 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001052 try:
1053 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001054 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001055 udpport = None
1056 else:
1057 eq(udpport, port)
1058 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001059 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001060 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001061 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001062 eq(socket.getservbyport(port, 'tcp'), service)
1063 if udpport is not None:
1064 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001065 # Make sure getservbyport does not accept out of range ports.
1066 self.assertRaises(OverflowError, socket.getservbyport, -1)
1067 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001068
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001069 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001070 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001071 # The default timeout should initially be None
1072 self.assertEqual(socket.getdefaulttimeout(), None)
1073 s = socket.socket()
1074 self.assertEqual(s.gettimeout(), None)
1075 s.close()
1076
1077 # Set the default timeout to 10, and see if it propagates
Victor Stinner304315d2018-11-30 13:22:44 +01001078 with socket_setdefaulttimeout(10):
1079 self.assertEqual(socket.getdefaulttimeout(), 10)
1080 with socket.socket() as sock:
1081 self.assertEqual(sock.gettimeout(), 10)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001082
Victor Stinner304315d2018-11-30 13:22:44 +01001083 # Reset the default timeout to None, and see if it propagates
1084 socket.setdefaulttimeout(None)
1085 self.assertEqual(socket.getdefaulttimeout(), None)
1086 with socket.socket() as sock:
1087 self.assertEqual(sock.gettimeout(), None)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001088
1089 # Check that setting it to an invalid value raises ValueError
1090 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1091
1092 # Check that setting it to an invalid type raises TypeError
1093 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1094
Serhiy Storchaka43767632013-11-03 21:31:38 +02001095 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1096 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001097 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001098 # Test that issue1008086 and issue767150 are fixed.
1099 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001100 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1101 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001102
Serhiy Storchaka43767632013-11-03 21:31:38 +02001103 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1104 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001105 def testIPv4toString(self):
1106 from socket import inet_aton as f, inet_pton, AF_INET
1107 g = lambda a: inet_pton(AF_INET, a)
1108
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001109 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001110 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001111 )
1112
Ezio Melottib3aedd42010-11-20 19:04:17 +00001113 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1114 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1115 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1116 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1117 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001118 # bpo-29972: inet_pton() doesn't fail on AIX
1119 if not sys.platform.startswith('aix'):
1120 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001121 assertInvalid(f, '300.0.0.0')
1122 assertInvalid(f, 'a.0.0.0')
1123 assertInvalid(f, '1.2.3.4.5')
1124 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001125
Ezio Melottib3aedd42010-11-20 19:04:17 +00001126 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1127 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1128 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1129 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001130 assertInvalid(g, '0.0.0.')
1131 assertInvalid(g, '300.0.0.0')
1132 assertInvalid(g, 'a.0.0.0')
1133 assertInvalid(g, '1.2.3.4.5')
1134 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001135
Serhiy Storchaka43767632013-11-03 21:31:38 +02001136 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1137 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001138 def testIPv6toString(self):
1139 try:
1140 from socket import inet_pton, AF_INET6, has_ipv6
1141 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001142 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001143 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001144 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001145
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001146 if sys.platform == "win32":
1147 try:
1148 inet_pton(AF_INET6, '::')
1149 except OSError as e:
1150 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001151 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001152
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001153 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001154 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001155 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001156 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001157
Ezio Melottib3aedd42010-11-20 19:04:17 +00001158 self.assertEqual(b'\x00' * 16, f('::'))
1159 self.assertEqual(b'\x00' * 16, f('0::0'))
1160 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1161 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001162 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 +00001163 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1164 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001165 self.assertEqual(
1166 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1167 f('ad42:abc::127:0:254:2')
1168 )
1169 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1170 assertInvalid('0x20::')
1171 assertInvalid(':::')
1172 assertInvalid('::0::')
1173 assertInvalid('1::abc::')
1174 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001175 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001176 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001177 # bpo-29972: inet_pton() doesn't fail on AIX
1178 if not sys.platform.startswith('aix'):
1179 assertInvalid('1:2:3:4:5:6:')
1180 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001181
1182 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1183 f('::254.42.23.64')
1184 )
1185 self.assertEqual(
1186 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1187 f('42::a29b:254.42.23.64')
1188 )
1189 self.assertEqual(
1190 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1191 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1192 )
1193 assertInvalid('255.254.253.252')
1194 assertInvalid('1::260.2.3.0')
1195 assertInvalid('1::0.be.e.0')
1196 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1197 assertInvalid('::1.2.3.4:0')
1198 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001199
Serhiy Storchaka43767632013-11-03 21:31:38 +02001200 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1201 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001202 def testStringToIPv4(self):
1203 from socket import inet_ntoa as f, inet_ntop, AF_INET
1204 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001205 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001206 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001207 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001208
Ezio Melottib3aedd42010-11-20 19:04:17 +00001209 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1210 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1211 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1212 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001213 assertInvalid(f, b'\x00' * 3)
1214 assertInvalid(f, b'\x00' * 5)
1215 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001216 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001217
Ezio Melottib3aedd42010-11-20 19:04:17 +00001218 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1219 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1220 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001221 assertInvalid(g, b'\x00' * 3)
1222 assertInvalid(g, b'\x00' * 5)
1223 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001224 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001225
Serhiy Storchaka43767632013-11-03 21:31:38 +02001226 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1227 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001228 def testStringToIPv6(self):
1229 try:
1230 from socket import inet_ntop, AF_INET6, has_ipv6
1231 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001232 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001233 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001234 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001235
1236 if sys.platform == "win32":
1237 try:
1238 inet_ntop(AF_INET6, b'\x00' * 16)
1239 except OSError as e:
1240 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001241 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001242
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001243 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001244 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001245 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001246 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001247
Ezio Melottib3aedd42010-11-20 19:04:17 +00001248 self.assertEqual('::', f(b'\x00' * 16))
1249 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1250 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001251 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001252 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 +00001253 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001254 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001255
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001256 assertInvalid(b'\x12' * 15)
1257 assertInvalid(b'\x12' * 17)
1258 assertInvalid(b'\x12' * 4)
1259
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001260 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001261
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001262 def testSockName(self):
1263 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001264 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001265 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001266 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001267 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001269 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1270 # it reasonable to get the host's addr in addition to 0.0.0.0.
1271 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001272 try:
1273 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001274 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001275 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001276 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001277 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001278 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001279
1280 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001281 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001282 # We know a socket should start without reuse==0
1283 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001284 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001285 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001286 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001287
1288 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001289 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001290 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001291 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001292 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1293 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001294 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001295
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001296 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001297 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001298 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1299 sock.settimeout(1)
1300 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001301 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001302
Martin Panter50ab1a32016-04-11 00:38:12 +00001303 def testCloseException(self):
1304 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001305 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001306 socket.socket(fileno=sock.fileno()).close()
1307 try:
1308 sock.close()
1309 except OSError as err:
1310 # Winsock apparently raises ENOTSOCK
1311 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1312 else:
1313 self.fail("close() should raise EBADF/ENOTSOCK")
1314
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001315 def testNewAttributes(self):
1316 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001317
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001318 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1319 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001320 if hasattr(socket, 'SOCK_CLOEXEC'):
1321 self.assertIn(sock.type,
1322 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1323 socket.SOCK_STREAM))
1324 else:
1325 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001326 self.assertEqual(sock.proto, 0)
1327 sock.close()
1328
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001329 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001330 sock = socket.socket()
1331 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001332 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001333 big_port = port + 65536
1334 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001335 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1336 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1337 # Since find_unused_port() is inherently subject to race conditions, we
1338 # call it a couple times if necessary.
1339 for i in itertools.count():
1340 port = support.find_unused_port()
1341 try:
1342 sock.bind((HOST, port))
1343 except OSError as e:
1344 if e.errno != errno.EADDRINUSE or i == 5:
1345 raise
1346 else:
1347 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001348
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001349 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001350 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001351 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1352 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1353 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1354 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001355 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1356 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001357 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001358 self.assertRaises(ValueError, s.ioctl, -1, None)
1359 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001360
Steve Dowerea93ac02016-06-17 12:52:18 -07001361 @unittest.skipUnless(os.name == "nt", "Windows specific")
1362 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1363 'Loopback fast path support required for this test')
1364 def test_sio_loopback_fast_path(self):
1365 s = socket.socket()
1366 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001367 try:
1368 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1369 except OSError as exc:
1370 WSAEOPNOTSUPP = 10045
1371 if exc.winerror == WSAEOPNOTSUPP:
1372 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1373 "doesn't implemented in this Windows version")
1374 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001375 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1376
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001377 def testGetaddrinfo(self):
1378 try:
1379 socket.getaddrinfo('localhost', 80)
1380 except socket.gaierror as err:
1381 if err.errno == socket.EAI_SERVICE:
1382 # see http://bugs.python.org/issue1282647
1383 self.skipTest("buggy libc version")
1384 raise
1385 # len of every sequence is supposed to be == 5
1386 for info in socket.getaddrinfo(HOST, None):
1387 self.assertEqual(len(info), 5)
1388 # host can be a domain name, a string representation of an
1389 # IPv4/v6 address or None
1390 socket.getaddrinfo('localhost', 80)
1391 socket.getaddrinfo('127.0.0.1', 80)
1392 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001393 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001394 socket.getaddrinfo('::1', 80)
1395 # port can be a string service name such as "http", a numeric
1396 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001397 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1398 if (not hasattr(sys, 'getandroidapilevel') or
1399 sys.getandroidapilevel() >= 23):
1400 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001401 socket.getaddrinfo(HOST, 80)
1402 socket.getaddrinfo(HOST, None)
1403 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001404 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1405 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001406 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001407 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1408 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001409 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001410 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1411 for _, socktype, _, _, _ in infos:
1412 self.assertEqual(socktype, socket.SOCK_STREAM)
1413 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001414 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001415 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1416 # a server willing to support both IPv4 and IPv6 will
1417 # usually do this
1418 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1419 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001420 # test keyword arguments
1421 a = socket.getaddrinfo(HOST, None)
1422 b = socket.getaddrinfo(host=HOST, port=None)
1423 self.assertEqual(a, b)
1424 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1425 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1426 self.assertEqual(a, b)
1427 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1428 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1429 self.assertEqual(a, b)
1430 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1431 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1432 self.assertEqual(a, b)
1433 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1434 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1435 self.assertEqual(a, b)
1436 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1437 socket.AI_PASSIVE)
1438 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1439 type=socket.SOCK_STREAM, proto=0,
1440 flags=socket.AI_PASSIVE)
1441 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001442 # Issue #6697.
1443 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001444
Ned Deilyb24f4812014-02-13 22:50:42 -08001445 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001446 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001447 try:
1448 # The arguments here are undefined and the call may succeed
1449 # or fail. All we care here is that it doesn't segfault.
1450 socket.getaddrinfo("localhost", None, 0, 0, 0,
1451 socket.AI_NUMERICSERV)
1452 except socket.gaierror:
1453 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001454
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001455 def test_getnameinfo(self):
1456 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001457 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001458
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001459 @unittest.skipUnless(support.is_resource_enabled('network'),
1460 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001461 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001462 # Check for internet access before running test
1463 # (issue #12804, issue #25138).
1464 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001465 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001466
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001467 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001468 domain = 'испытание.pythontest.net'
1469 socket.gethostbyname(domain)
1470 socket.gethostbyname_ex(domain)
1471 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001472 # 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 +00001473 # have a reverse entry yet
1474 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001475
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001476 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001477 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001478 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1479 self.skipTest("signal.alarm and socket.socketpair required for this test")
1480 # Our signal handlers clobber the C errno by calling a math function
1481 # with an invalid domain value.
1482 def ok_handler(*args):
1483 self.assertRaises(ValueError, math.acosh, 0)
1484 def raising_handler(*args):
1485 self.assertRaises(ValueError, math.acosh, 0)
1486 1 // 0
1487 c, s = socket.socketpair()
1488 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1489 try:
1490 if with_timeout:
1491 # Just above the one second minimum for signal.alarm
1492 c.settimeout(1.5)
1493 with self.assertRaises(ZeroDivisionError):
1494 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001495 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001496 if with_timeout:
1497 signal.signal(signal.SIGALRM, ok_handler)
1498 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001499 self.assertRaises(socket.timeout, c.sendall,
1500 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001501 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001502 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001503 signal.signal(signal.SIGALRM, old_alarm)
1504 c.close()
1505 s.close()
1506
1507 def test_sendall_interrupted(self):
1508 self.check_sendall_interrupted(False)
1509
1510 def test_sendall_interrupted_with_timeout(self):
1511 self.check_sendall_interrupted(True)
1512
Antoine Pitroue033e062010-10-29 10:38:18 +00001513 def test_dealloc_warn(self):
1514 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1515 r = repr(sock)
1516 with self.assertWarns(ResourceWarning) as cm:
1517 sock = None
1518 support.gc_collect()
1519 self.assertIn(r, str(cm.warning.args[0]))
1520 # An open socket file object gets dereferenced after the socket
1521 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1522 f = sock.makefile('rb')
1523 r = repr(sock)
1524 sock = None
1525 support.gc_collect()
1526 with self.assertWarns(ResourceWarning):
1527 f = None
1528 support.gc_collect()
1529
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001530 def test_name_closed_socketio(self):
1531 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1532 fp = sock.makefile("rb")
1533 fp.close()
1534 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1535
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001536 def test_unusable_closed_socketio(self):
1537 with socket.socket() as sock:
1538 fp = sock.makefile("rb", buffering=0)
1539 self.assertTrue(fp.readable())
1540 self.assertFalse(fp.writable())
1541 self.assertFalse(fp.seekable())
1542 fp.close()
1543 self.assertRaises(ValueError, fp.readable)
1544 self.assertRaises(ValueError, fp.writable)
1545 self.assertRaises(ValueError, fp.seekable)
1546
Christian Heimesd0e31b92018-01-27 09:54:13 +01001547 def test_socket_close(self):
1548 sock = socket.socket()
1549 try:
1550 sock.bind((HOST, 0))
1551 socket.close(sock.fileno())
1552 with self.assertRaises(OSError):
1553 sock.listen(1)
1554 finally:
1555 with self.assertRaises(OSError):
1556 # sock.close() fails with EBADF
1557 sock.close()
1558 with self.assertRaises(TypeError):
1559 socket.close(None)
1560 with self.assertRaises(OSError):
1561 socket.close(-1)
1562
Berker Peksag3fe64d02016-02-18 17:34:00 +02001563 def test_makefile_mode(self):
1564 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1565 with self.subTest(mode=mode):
1566 with socket.socket() as sock:
1567 with sock.makefile(mode) as fp:
1568 self.assertEqual(fp.mode, mode)
1569
1570 def test_makefile_invalid_mode(self):
1571 for mode in 'rt', 'x', '+', 'a':
1572 with self.subTest(mode=mode):
1573 with socket.socket() as sock:
1574 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1575 sock.makefile(mode)
1576
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001577 def test_pickle(self):
1578 sock = socket.socket()
1579 with sock:
1580 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1581 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001582 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1583 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1584 self.assertEqual(family, socket.AF_INET)
1585 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1586 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001587
Serhiy Storchaka78980432013-01-15 01:12:17 +02001588 def test_listen_backlog(self):
1589 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001590 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1591 srv.bind((HOST, 0))
1592 srv.listen(backlog)
1593
1594 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001595 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001596 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001597
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001598 @support.cpython_only
1599 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001600 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001601 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001602 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1603 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001604 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001605 srv.close()
1606
Charles-François Natali42663332012-01-02 15:57:30 +01001607 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001608 def test_flowinfo(self):
1609 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001610 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001611 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001612 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001613
Коренберг Марк7766b962018-02-13 00:47:42 +05001614 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1615 def test_getaddrinfo_ipv6_basic(self):
1616 ((*_, sockaddr),) = socket.getaddrinfo(
1617 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1618 1234, socket.AF_INET6,
1619 socket.SOCK_DGRAM,
1620 socket.IPPROTO_UDP
1621 )
1622 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1623
1624 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1625 @unittest.skipUnless(
1626 hasattr(socket, 'if_nameindex'),
1627 'if_nameindex is not supported')
1628 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1629 # Just pick up any network interface (Linux, Mac OS X)
1630 (ifindex, test_interface) = socket.if_nameindex()[0]
1631 ((*_, sockaddr),) = socket.getaddrinfo(
1632 'ff02::1de:c0:face:8D%' + test_interface,
1633 1234, socket.AF_INET6,
1634 socket.SOCK_DGRAM,
1635 socket.IPPROTO_UDP
1636 )
1637 # Note missing interface name part in IPv6 address
1638 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1639
1640 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1641 @unittest.skipUnless(
1642 sys.platform == 'win32',
1643 'Numeric scope id does not work or undocumented')
1644 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1645 # Also works on Linux and Mac OS X, but is not documented (?)
1646 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1647 ifindex = 42
1648 ((*_, sockaddr),) = socket.getaddrinfo(
1649 'ff02::1de:c0:face:8D%' + str(ifindex),
1650 1234, socket.AF_INET6,
1651 socket.SOCK_DGRAM,
1652 socket.IPPROTO_UDP
1653 )
1654 # Note missing interface name part in IPv6 address
1655 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1656
1657 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1658 @unittest.skipUnless(
1659 hasattr(socket, 'if_nameindex'),
1660 'if_nameindex is not supported')
1661 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1662 # Just pick up any network interface.
1663 (ifindex, test_interface) = socket.if_nameindex()[0]
1664 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1665 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1666 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1667
1668 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1669 @unittest.skipUnless(
1670 sys.platform == 'win32',
1671 'Numeric scope id does not work or undocumented')
1672 def test_getnameinfo_ipv6_scopeid_numeric(self):
1673 # Also works on Linux (undocumented), but does not work on Mac OS X
1674 # Windows and Linux allow nonexistent interface numbers here.
1675 ifindex = 42
1676 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1677 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1678 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1679
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001680 def test_str_for_enums(self):
1681 # Make sure that the AF_* and SOCK_* constants have enum-like string
1682 # reprs.
1683 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1684 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001685 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001686
Yury Selivanov98181422017-12-18 20:02:54 -05001687 def test_socket_consistent_sock_type(self):
1688 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1689 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1690 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1691
1692 with socket.socket(socket.AF_INET, sock_type) as s:
1693 self.assertEqual(s.type, socket.SOCK_STREAM)
1694 s.settimeout(1)
1695 self.assertEqual(s.type, socket.SOCK_STREAM)
1696 s.settimeout(0)
1697 self.assertEqual(s.type, socket.SOCK_STREAM)
1698 s.setblocking(True)
1699 self.assertEqual(s.type, socket.SOCK_STREAM)
1700 s.setblocking(False)
1701 self.assertEqual(s.type, socket.SOCK_STREAM)
1702
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001703 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001704 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001705 # Test that when created with a family that's not one of the known
1706 # AF_*/SOCK_* constants, socket.family just returns the number.
1707 #
1708 # To do this we fool socket.socket into believing it already has an
1709 # open fd because on this path it doesn't actually verify the family and
1710 # type and populates the socket object.
1711 #
1712 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001713 fd, path = tempfile.mkstemp()
1714 self.addCleanup(os.unlink, path)
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
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001788
Charles-François Natali47413c12011-10-06 19:47:44 +02001789@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1790class BasicCANTest(unittest.TestCase):
1791
1792 def testCrucialConstants(self):
1793 socket.AF_CAN
1794 socket.PF_CAN
1795 socket.CAN_RAW
1796
Charles-François Natali773e42d2013-02-05 19:42:01 +01001797 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1798 'socket.CAN_BCM required for this test.')
1799 def testBCMConstants(self):
1800 socket.CAN_BCM
1801
1802 # opcodes
1803 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1804 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1805 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1806 socket.CAN_BCM_TX_SEND # send one CAN frame
1807 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1808 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1809 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1810 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1811 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1812 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1813 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1814 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1815
Charles-François Natali47413c12011-10-06 19:47:44 +02001816 def testCreateSocket(self):
1817 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1818 pass
1819
Charles-François Natali773e42d2013-02-05 19:42:01 +01001820 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1821 'socket.CAN_BCM required for this test.')
1822 def testCreateBCMSocket(self):
1823 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1824 pass
1825
Charles-François Natali47413c12011-10-06 19:47:44 +02001826 def testBindAny(self):
1827 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1828 s.bind(('', ))
1829
1830 def testTooLongInterfaceName(self):
1831 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1832 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001833 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001834 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001835
1836 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1837 'socket.CAN_RAW_LOOPBACK required for this test.')
1838 def testLoopback(self):
1839 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1840 for loopback in (0, 1):
1841 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1842 loopback)
1843 self.assertEqual(loopback,
1844 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1845
1846 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1847 'socket.CAN_RAW_FILTER required for this test.')
1848 def testFilter(self):
1849 can_id, can_mask = 0x200, 0x700
1850 can_filter = struct.pack("=II", can_id, can_mask)
1851 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1852 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1853 self.assertEqual(can_filter,
1854 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001855 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001856
1857
1858@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001859class CANTest(ThreadedCANSocketTest):
1860
Charles-François Natali47413c12011-10-06 19:47:44 +02001861 def __init__(self, methodName='runTest'):
1862 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1863
1864 @classmethod
1865 def build_can_frame(cls, can_id, data):
1866 """Build a CAN frame."""
1867 can_dlc = len(data)
1868 data = data.ljust(8, b'\x00')
1869 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1870
1871 @classmethod
1872 def dissect_can_frame(cls, frame):
1873 """Dissect a CAN frame."""
1874 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1875 return (can_id, can_dlc, data[:can_dlc])
1876
1877 def testSendFrame(self):
1878 cf, addr = self.s.recvfrom(self.bufsize)
1879 self.assertEqual(self.cf, cf)
1880 self.assertEqual(addr[0], self.interface)
1881 self.assertEqual(addr[1], socket.AF_CAN)
1882
1883 def _testSendFrame(self):
1884 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1885 self.cli.send(self.cf)
1886
1887 def testSendMaxFrame(self):
1888 cf, addr = self.s.recvfrom(self.bufsize)
1889 self.assertEqual(self.cf, cf)
1890
1891 def _testSendMaxFrame(self):
1892 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1893 self.cli.send(self.cf)
1894
1895 def testSendMultiFrames(self):
1896 cf, addr = self.s.recvfrom(self.bufsize)
1897 self.assertEqual(self.cf1, cf)
1898
1899 cf, addr = self.s.recvfrom(self.bufsize)
1900 self.assertEqual(self.cf2, cf)
1901
1902 def _testSendMultiFrames(self):
1903 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1904 self.cli.send(self.cf1)
1905
1906 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1907 self.cli.send(self.cf2)
1908
Charles-François Natali773e42d2013-02-05 19:42:01 +01001909 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1910 'socket.CAN_BCM required for this test.')
1911 def _testBCM(self):
1912 cf, addr = self.cli.recvfrom(self.bufsize)
1913 self.assertEqual(self.cf, cf)
1914 can_id, can_dlc, data = self.dissect_can_frame(cf)
1915 self.assertEqual(self.can_id, can_id)
1916 self.assertEqual(self.data, data)
1917
1918 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1919 'socket.CAN_BCM required for this test.')
1920 def testBCM(self):
1921 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1922 self.addCleanup(bcm.close)
1923 bcm.connect((self.interface,))
1924 self.can_id = 0x123
1925 self.data = bytes([0xc0, 0xff, 0xee])
1926 self.cf = self.build_can_frame(self.can_id, self.data)
1927 opcode = socket.CAN_BCM_TX_SEND
1928 flags = 0
1929 count = 0
1930 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1931 bcm_can_id = 0x0222
1932 nframes = 1
1933 assert len(self.cf) == 16
1934 header = struct.pack(self.bcm_cmd_msg_fmt,
1935 opcode,
1936 flags,
1937 count,
1938 ival1_seconds,
1939 ival1_usec,
1940 ival2_seconds,
1941 ival2_usec,
1942 bcm_can_id,
1943 nframes,
1944 )
1945 header_plus_frame = header + self.cf
1946 bytes_sent = bcm.send(header_plus_frame)
1947 self.assertEqual(bytes_sent, len(header_plus_frame))
1948
Charles-François Natali47413c12011-10-06 19:47:44 +02001949
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001950@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1951class ISOTPTest(unittest.TestCase):
1952
1953 def __init__(self, *args, **kwargs):
1954 super().__init__(*args, **kwargs)
1955 self.interface = "vcan0"
1956
1957 def testCrucialConstants(self):
1958 socket.AF_CAN
1959 socket.PF_CAN
1960 socket.CAN_ISOTP
1961 socket.SOCK_DGRAM
1962
1963 def testCreateSocket(self):
1964 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1965 pass
1966
1967 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1968 'socket.CAN_ISOTP required for this test.')
1969 def testCreateISOTPSocket(self):
1970 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1971 pass
1972
1973 def testTooLongInterfaceName(self):
1974 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1975 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1976 with self.assertRaisesRegex(OSError, 'interface name too long'):
1977 s.bind(('x' * 1024, 1, 2))
1978
1979 def testBind(self):
1980 try:
1981 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1982 addr = self.interface, 0x123, 0x456
1983 s.bind(addr)
1984 self.assertEqual(s.getsockname(), addr)
1985 except OSError as e:
1986 if e.errno == errno.ENODEV:
1987 self.skipTest('network interface `%s` does not exist' %
1988 self.interface)
1989 else:
1990 raise
1991
1992
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001993@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1994class BasicRDSTest(unittest.TestCase):
1995
1996 def testCrucialConstants(self):
1997 socket.AF_RDS
1998 socket.PF_RDS
1999
2000 def testCreateSocket(self):
2001 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2002 pass
2003
2004 def testSocketBufferSize(self):
2005 bufsize = 16384
2006 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2007 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2008 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2009
2010
2011@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002012class RDSTest(ThreadedRDSSocketTest):
2013
2014 def __init__(self, methodName='runTest'):
2015 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2016
Charles-François Natali240c55f2011-11-10 20:33:36 +01002017 def setUp(self):
2018 super().setUp()
2019 self.evt = threading.Event()
2020
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002021 def testSendAndRecv(self):
2022 data, addr = self.serv.recvfrom(self.bufsize)
2023 self.assertEqual(self.data, data)
2024 self.assertEqual(self.cli_addr, addr)
2025
2026 def _testSendAndRecv(self):
2027 self.data = b'spam'
2028 self.cli.sendto(self.data, 0, (HOST, self.port))
2029
2030 def testPeek(self):
2031 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2032 self.assertEqual(self.data, data)
2033 data, addr = self.serv.recvfrom(self.bufsize)
2034 self.assertEqual(self.data, data)
2035
2036 def _testPeek(self):
2037 self.data = b'spam'
2038 self.cli.sendto(self.data, 0, (HOST, self.port))
2039
2040 @requireAttrs(socket.socket, 'recvmsg')
2041 def testSendAndRecvMsg(self):
2042 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2043 self.assertEqual(self.data, data)
2044
2045 @requireAttrs(socket.socket, 'sendmsg')
2046 def _testSendAndRecvMsg(self):
2047 self.data = b'hello ' * 10
2048 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2049
2050 def testSendAndRecvMulti(self):
2051 data, addr = self.serv.recvfrom(self.bufsize)
2052 self.assertEqual(self.data1, data)
2053
2054 data, addr = self.serv.recvfrom(self.bufsize)
2055 self.assertEqual(self.data2, data)
2056
2057 def _testSendAndRecvMulti(self):
2058 self.data1 = b'bacon'
2059 self.cli.sendto(self.data1, 0, (HOST, self.port))
2060
2061 self.data2 = b'egg'
2062 self.cli.sendto(self.data2, 0, (HOST, self.port))
2063
2064 def testSelect(self):
2065 r, w, x = select.select([self.serv], [], [], 3.0)
2066 self.assertIn(self.serv, r)
2067 data, addr = self.serv.recvfrom(self.bufsize)
2068 self.assertEqual(self.data, data)
2069
2070 def _testSelect(self):
2071 self.data = b'select'
2072 self.cli.sendto(self.data, 0, (HOST, self.port))
2073
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002074@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2075 'QIPCRTR sockets required for this test.')
2076class BasicQIPCRTRTest(unittest.TestCase):
2077
2078 def testCrucialConstants(self):
2079 socket.AF_QIPCRTR
2080
2081 def testCreateSocket(self):
2082 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2083 pass
2084
2085 def testUnbound(self):
2086 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2087 self.assertEqual(s.getsockname()[1], 0)
2088
2089 def testBindSock(self):
2090 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2091 support.bind_port(s, host=s.getsockname()[0])
2092 self.assertNotEqual(s.getsockname()[1], 0)
2093
2094 def testInvalidBindSock(self):
2095 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2096 self.assertRaises(OSError, support.bind_port, s, host=-2)
2097
2098 def testAutoBindSock(self):
2099 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2100 s.connect((123, 123))
2101 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002102
caaveryeffc12f2017-09-06 18:18:10 -04002103@unittest.skipIf(fcntl is None, "need fcntl")
2104@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2105 'VSOCK sockets required for this test.')
2106class BasicVSOCKTest(unittest.TestCase):
2107
2108 def testCrucialConstants(self):
2109 socket.AF_VSOCK
2110
2111 def testVSOCKConstants(self):
2112 socket.SO_VM_SOCKETS_BUFFER_SIZE
2113 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2114 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2115 socket.VMADDR_CID_ANY
2116 socket.VMADDR_PORT_ANY
2117 socket.VMADDR_CID_HOST
2118 socket.VM_SOCKETS_INVALID_VERSION
2119 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2120
2121 def testCreateSocket(self):
2122 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2123 pass
2124
2125 def testSocketBufferSize(self):
2126 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2127 orig_max = s.getsockopt(socket.AF_VSOCK,
2128 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2129 orig = s.getsockopt(socket.AF_VSOCK,
2130 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2131 orig_min = s.getsockopt(socket.AF_VSOCK,
2132 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2133
2134 s.setsockopt(socket.AF_VSOCK,
2135 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2136 s.setsockopt(socket.AF_VSOCK,
2137 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2138 s.setsockopt(socket.AF_VSOCK,
2139 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2140
2141 self.assertEqual(orig_max * 2,
2142 s.getsockopt(socket.AF_VSOCK,
2143 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2144 self.assertEqual(orig * 2,
2145 s.getsockopt(socket.AF_VSOCK,
2146 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2147 self.assertEqual(orig_min * 2,
2148 s.getsockopt(socket.AF_VSOCK,
2149 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2150
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002151
Guido van Rossum24e4af82002-06-12 19:18:08 +00002152class BasicTCPTest(SocketConnectedTest):
2153
2154 def __init__(self, methodName='runTest'):
2155 SocketConnectedTest.__init__(self, methodName=methodName)
2156
2157 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002158 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002159 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002160 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002161
2162 def _testRecv(self):
2163 self.serv_conn.send(MSG)
2164
2165 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002166 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002167 seg1 = self.cli_conn.recv(len(MSG) - 3)
2168 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002169 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002170 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002171
2172 def _testOverFlowRecv(self):
2173 self.serv_conn.send(MSG)
2174
2175 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002176 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002177 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002178 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002179
2180 def _testRecvFrom(self):
2181 self.serv_conn.send(MSG)
2182
2183 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002184 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002185 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2186 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002187 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002188 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002189
2190 def _testOverFlowRecvFrom(self):
2191 self.serv_conn.send(MSG)
2192
2193 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002194 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002195 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002196 while 1:
2197 read = self.cli_conn.recv(1024)
2198 if not read:
2199 break
Guido van Rossume531e292002-08-08 20:28:34 +00002200 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002201 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002202
2203 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002204 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002205 self.serv_conn.sendall(big_chunk)
2206
2207 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002208 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002209 fd = self.cli_conn.fileno()
2210 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002211 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002212 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002213 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002214 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002215
2216 def _testFromFd(self):
2217 self.serv_conn.send(MSG)
2218
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002219 def testDup(self):
2220 # Testing dup()
2221 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002222 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002223 msg = sock.recv(1024)
2224 self.assertEqual(msg, MSG)
2225
2226 def _testDup(self):
2227 self.serv_conn.send(MSG)
2228
Guido van Rossum24e4af82002-06-12 19:18:08 +00002229 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002230 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002231 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002232 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002233 # wait for _testShutdown to finish: on OS X, when the server
2234 # closes the connection the client also becomes disconnected,
2235 # and the client's shutdown call will fail. (Issue #4397.)
2236 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002237
2238 def _testShutdown(self):
2239 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002240 self.serv_conn.shutdown(2)
2241
2242 testShutdown_overflow = support.cpython_only(testShutdown)
2243
2244 @support.cpython_only
2245 def _testShutdown_overflow(self):
2246 import _testcapi
2247 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002248 # Issue 15989
2249 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2250 _testcapi.INT_MAX + 1)
2251 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2252 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002253 self.serv_conn.shutdown(2)
2254
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002255 def testDetach(self):
2256 # Testing detach()
2257 fileno = self.cli_conn.fileno()
2258 f = self.cli_conn.detach()
2259 self.assertEqual(f, fileno)
2260 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002261 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002262 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002263 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002264 # ...but we can create another socket using the (still open)
2265 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002266 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002267 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002268 msg = sock.recv(1024)
2269 self.assertEqual(msg, MSG)
2270
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002271 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002272 self.serv_conn.send(MSG)
2273
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002274
Guido van Rossum24e4af82002-06-12 19:18:08 +00002275class BasicUDPTest(ThreadedUDPSocketTest):
2276
2277 def __init__(self, methodName='runTest'):
2278 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2279
2280 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002281 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002282 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002283 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002284
2285 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002286 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002287
Guido van Rossum1c938012002-06-12 21:17:20 +00002288 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002289 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002290 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002291 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002292
Guido van Rossum1c938012002-06-12 21:17:20 +00002293 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002294 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002295
Guido van Rossumd8faa362007-04-27 19:54:29 +00002296 def testRecvFromNegative(self):
2297 # Negative lengths passed to recvfrom should give ValueError.
2298 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2299
2300 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002301 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002302
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002303# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2304# same test code is used with different families and types of socket
2305# (e.g. stream, datagram), and tests using recvmsg() are repeated
2306# using recvmsg_into().
2307#
2308# The generic test classes such as SendmsgTests and
2309# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2310# supplied with sockets cli_sock and serv_sock representing the
2311# client's and the server's end of the connection respectively, and
2312# attributes cli_addr and serv_addr holding their (numeric where
2313# appropriate) addresses.
2314#
2315# The final concrete test classes combine these with subclasses of
2316# SocketTestBase which set up client and server sockets of a specific
2317# type, and with subclasses of SendrecvmsgBase such as
2318# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2319# sockets to cli_sock and serv_sock and override the methods and
2320# attributes of SendrecvmsgBase to fill in destination addresses if
2321# needed when sending, check for specific flags in msg_flags, etc.
2322#
2323# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2324# recvmsg_into().
2325
2326# XXX: like the other datagram (UDP) tests in this module, the code
2327# here assumes that datagram delivery on the local machine will be
2328# reliable.
2329
2330class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2331 # Base class for sendmsg()/recvmsg() tests.
2332
2333 # Time in seconds to wait before considering a test failed, or
2334 # None for no timeout. Not all tests actually set a timeout.
2335 fail_timeout = 3.0
2336
2337 def setUp(self):
2338 self.misc_event = threading.Event()
2339 super().setUp()
2340
2341 def sendToServer(self, msg):
2342 # Send msg to the server.
2343 return self.cli_sock.send(msg)
2344
2345 # Tuple of alternative default arguments for sendmsg() when called
2346 # via sendmsgToServer() (e.g. to include a destination address).
2347 sendmsg_to_server_defaults = ()
2348
2349 def sendmsgToServer(self, *args):
2350 # Call sendmsg() on self.cli_sock with the given arguments,
2351 # filling in any arguments which are not supplied with the
2352 # corresponding items of self.sendmsg_to_server_defaults, if
2353 # any.
2354 return self.cli_sock.sendmsg(
2355 *(args + self.sendmsg_to_server_defaults[len(args):]))
2356
2357 def doRecvmsg(self, sock, bufsize, *args):
2358 # Call recvmsg() on sock with given arguments and return its
2359 # result. Should be used for tests which can use either
2360 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2361 # this method with one which emulates it using recvmsg_into(),
2362 # thus allowing the same test to be used for both methods.
2363 result = sock.recvmsg(bufsize, *args)
2364 self.registerRecvmsgResult(result)
2365 return result
2366
2367 def registerRecvmsgResult(self, result):
2368 # Called by doRecvmsg() with the return value of recvmsg() or
2369 # recvmsg_into(). Can be overridden to arrange cleanup based
2370 # on the returned ancillary data, for instance.
2371 pass
2372
2373 def checkRecvmsgAddress(self, addr1, addr2):
2374 # Called to compare the received address with the address of
2375 # the peer.
2376 self.assertEqual(addr1, addr2)
2377
2378 # Flags that are normally unset in msg_flags
2379 msg_flags_common_unset = 0
2380 for name in ("MSG_CTRUNC", "MSG_OOB"):
2381 msg_flags_common_unset |= getattr(socket, name, 0)
2382
2383 # Flags that are normally set
2384 msg_flags_common_set = 0
2385
2386 # Flags set when a complete record has been received (e.g. MSG_EOR
2387 # for SCTP)
2388 msg_flags_eor_indicator = 0
2389
2390 # Flags set when a complete record has not been received
2391 # (e.g. MSG_TRUNC for datagram sockets)
2392 msg_flags_non_eor_indicator = 0
2393
2394 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2395 # Method to check the value of msg_flags returned by recvmsg[_into]().
2396 #
2397 # Checks that all bits in msg_flags_common_set attribute are
2398 # set in "flags" and all bits in msg_flags_common_unset are
2399 # unset.
2400 #
2401 # The "eor" argument specifies whether the flags should
2402 # indicate that a full record (or datagram) has been received.
2403 # If "eor" is None, no checks are done; otherwise, checks
2404 # that:
2405 #
2406 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2407 # set and all bits in msg_flags_non_eor_indicator are unset
2408 #
2409 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2410 # are set and all bits in msg_flags_eor_indicator are unset
2411 #
2412 # If "checkset" and/or "checkunset" are supplied, they require
2413 # the given bits to be set or unset respectively, overriding
2414 # what the attributes require for those bits.
2415 #
2416 # If any bits are set in "ignore", they will not be checked,
2417 # regardless of the other inputs.
2418 #
2419 # Will raise Exception if the inputs require a bit to be both
2420 # set and unset, and it is not ignored.
2421
2422 defaultset = self.msg_flags_common_set
2423 defaultunset = self.msg_flags_common_unset
2424
2425 if eor:
2426 defaultset |= self.msg_flags_eor_indicator
2427 defaultunset |= self.msg_flags_non_eor_indicator
2428 elif eor is not None:
2429 defaultset |= self.msg_flags_non_eor_indicator
2430 defaultunset |= self.msg_flags_eor_indicator
2431
2432 # Function arguments override defaults
2433 defaultset &= ~checkunset
2434 defaultunset &= ~checkset
2435
2436 # Merge arguments with remaining defaults, and check for conflicts
2437 checkset |= defaultset
2438 checkunset |= defaultunset
2439 inboth = checkset & checkunset & ~ignore
2440 if inboth:
2441 raise Exception("contradictory set, unset requirements for flags "
2442 "{0:#x}".format(inboth))
2443
2444 # Compare with given msg_flags value
2445 mask = (checkset | checkunset) & ~ignore
2446 self.assertEqual(flags & mask, checkset & mask)
2447
2448
2449class RecvmsgIntoMixin(SendrecvmsgBase):
2450 # Mixin to implement doRecvmsg() using recvmsg_into().
2451
2452 def doRecvmsg(self, sock, bufsize, *args):
2453 buf = bytearray(bufsize)
2454 result = sock.recvmsg_into([buf], *args)
2455 self.registerRecvmsgResult(result)
2456 self.assertGreaterEqual(result[0], 0)
2457 self.assertLessEqual(result[0], bufsize)
2458 return (bytes(buf[:result[0]]),) + result[1:]
2459
2460
2461class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2462 # Defines flags to be checked in msg_flags for datagram sockets.
2463
2464 @property
2465 def msg_flags_non_eor_indicator(self):
2466 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2467
2468
2469class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2470 # Defines flags to be checked in msg_flags for SCTP sockets.
2471
2472 @property
2473 def msg_flags_eor_indicator(self):
2474 return super().msg_flags_eor_indicator | socket.MSG_EOR
2475
2476
2477class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2478 # Base class for tests on connectionless-mode sockets. Users must
2479 # supply sockets on attributes cli and serv to be mapped to
2480 # cli_sock and serv_sock respectively.
2481
2482 @property
2483 def serv_sock(self):
2484 return self.serv
2485
2486 @property
2487 def cli_sock(self):
2488 return self.cli
2489
2490 @property
2491 def sendmsg_to_server_defaults(self):
2492 return ([], [], 0, self.serv_addr)
2493
2494 def sendToServer(self, msg):
2495 return self.cli_sock.sendto(msg, self.serv_addr)
2496
2497
2498class SendrecvmsgConnectedBase(SendrecvmsgBase):
2499 # Base class for tests on connected sockets. Users must supply
2500 # sockets on attributes serv_conn and cli_conn (representing the
2501 # connections *to* the server and the client), to be mapped to
2502 # cli_sock and serv_sock respectively.
2503
2504 @property
2505 def serv_sock(self):
2506 return self.cli_conn
2507
2508 @property
2509 def cli_sock(self):
2510 return self.serv_conn
2511
2512 def checkRecvmsgAddress(self, addr1, addr2):
2513 # Address is currently "unspecified" for a connected socket,
2514 # so we don't examine it
2515 pass
2516
2517
2518class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2519 # Base class to set a timeout on server's socket.
2520
2521 def setUp(self):
2522 super().setUp()
2523 self.serv_sock.settimeout(self.fail_timeout)
2524
2525
2526class SendmsgTests(SendrecvmsgServerTimeoutBase):
2527 # Tests for sendmsg() which can use any socket type and do not
2528 # involve recvmsg() or recvmsg_into().
2529
2530 def testSendmsg(self):
2531 # Send a simple message with sendmsg().
2532 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2533
2534 def _testSendmsg(self):
2535 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2536
2537 def testSendmsgDataGenerator(self):
2538 # Send from buffer obtained from a generator (not a sequence).
2539 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2540
2541 def _testSendmsgDataGenerator(self):
2542 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2543 len(MSG))
2544
2545 def testSendmsgAncillaryGenerator(self):
2546 # Gather (empty) ancillary data from a generator.
2547 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2548
2549 def _testSendmsgAncillaryGenerator(self):
2550 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2551 len(MSG))
2552
2553 def testSendmsgArray(self):
2554 # Send data from an array instead of the usual bytes object.
2555 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2556
2557 def _testSendmsgArray(self):
2558 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2559 len(MSG))
2560
2561 def testSendmsgGather(self):
2562 # Send message data from more than one buffer (gather write).
2563 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2564
2565 def _testSendmsgGather(self):
2566 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2567
2568 def testSendmsgBadArgs(self):
2569 # Check that sendmsg() rejects invalid arguments.
2570 self.assertEqual(self.serv_sock.recv(1000), b"done")
2571
2572 def _testSendmsgBadArgs(self):
2573 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2574 self.assertRaises(TypeError, self.sendmsgToServer,
2575 b"not in an iterable")
2576 self.assertRaises(TypeError, self.sendmsgToServer,
2577 object())
2578 self.assertRaises(TypeError, self.sendmsgToServer,
2579 [object()])
2580 self.assertRaises(TypeError, self.sendmsgToServer,
2581 [MSG, object()])
2582 self.assertRaises(TypeError, self.sendmsgToServer,
2583 [MSG], object())
2584 self.assertRaises(TypeError, self.sendmsgToServer,
2585 [MSG], [], object())
2586 self.assertRaises(TypeError, self.sendmsgToServer,
2587 [MSG], [], 0, object())
2588 self.sendToServer(b"done")
2589
2590 def testSendmsgBadCmsg(self):
2591 # Check that invalid ancillary data items are rejected.
2592 self.assertEqual(self.serv_sock.recv(1000), b"done")
2593
2594 def _testSendmsgBadCmsg(self):
2595 self.assertRaises(TypeError, self.sendmsgToServer,
2596 [MSG], [object()])
2597 self.assertRaises(TypeError, self.sendmsgToServer,
2598 [MSG], [(object(), 0, b"data")])
2599 self.assertRaises(TypeError, self.sendmsgToServer,
2600 [MSG], [(0, object(), b"data")])
2601 self.assertRaises(TypeError, self.sendmsgToServer,
2602 [MSG], [(0, 0, object())])
2603 self.assertRaises(TypeError, self.sendmsgToServer,
2604 [MSG], [(0, 0)])
2605 self.assertRaises(TypeError, self.sendmsgToServer,
2606 [MSG], [(0, 0, b"data", 42)])
2607 self.sendToServer(b"done")
2608
2609 @requireAttrs(socket, "CMSG_SPACE")
2610 def testSendmsgBadMultiCmsg(self):
2611 # Check that invalid ancillary data items are rejected when
2612 # more than one item is present.
2613 self.assertEqual(self.serv_sock.recv(1000), b"done")
2614
2615 @testSendmsgBadMultiCmsg.client_skip
2616 def _testSendmsgBadMultiCmsg(self):
2617 self.assertRaises(TypeError, self.sendmsgToServer,
2618 [MSG], [0, 0, b""])
2619 self.assertRaises(TypeError, self.sendmsgToServer,
2620 [MSG], [(0, 0, b""), object()])
2621 self.sendToServer(b"done")
2622
2623 def testSendmsgExcessCmsgReject(self):
2624 # Check that sendmsg() rejects excess ancillary data items
2625 # when the number that can be sent is limited.
2626 self.assertEqual(self.serv_sock.recv(1000), b"done")
2627
2628 def _testSendmsgExcessCmsgReject(self):
2629 if not hasattr(socket, "CMSG_SPACE"):
2630 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002631 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002632 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2633 self.assertIsNone(cm.exception.errno)
2634 self.sendToServer(b"done")
2635
2636 def testSendmsgAfterClose(self):
2637 # Check that sendmsg() fails on a closed socket.
2638 pass
2639
2640 def _testSendmsgAfterClose(self):
2641 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002642 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002643
2644
2645class SendmsgStreamTests(SendmsgTests):
2646 # Tests for sendmsg() which require a stream socket and do not
2647 # involve recvmsg() or recvmsg_into().
2648
2649 def testSendmsgExplicitNoneAddr(self):
2650 # Check that peer address can be specified as None.
2651 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2652
2653 def _testSendmsgExplicitNoneAddr(self):
2654 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2655
2656 def testSendmsgTimeout(self):
2657 # Check that timeout works with sendmsg().
2658 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2659 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2660
2661 def _testSendmsgTimeout(self):
2662 try:
2663 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002664 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002665 while True:
2666 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002667 except socket.timeout:
2668 pass
2669 except OSError as exc:
2670 if exc.errno != errno.ENOMEM:
2671 raise
2672 # bpo-33937 the test randomly fails on Travis CI with
2673 # "OSError: [Errno 12] Cannot allocate memory"
2674 else:
2675 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002676 finally:
2677 self.misc_event.set()
2678
2679 # XXX: would be nice to have more tests for sendmsg flags argument.
2680
2681 # Linux supports MSG_DONTWAIT when sending, but in general, it
2682 # only works when receiving. Could add other platforms if they
2683 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002684 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002685 "MSG_DONTWAIT not known to work on this platform when "
2686 "sending")
2687 def testSendmsgDontWait(self):
2688 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2689 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2690 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2691
2692 @testSendmsgDontWait.client_skip
2693 def _testSendmsgDontWait(self):
2694 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002695 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002696 while True:
2697 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002698 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2699 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002700 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002701 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002702 finally:
2703 self.misc_event.set()
2704
2705
2706class SendmsgConnectionlessTests(SendmsgTests):
2707 # Tests for sendmsg() which require a connectionless-mode
2708 # (e.g. datagram) socket, and do not involve recvmsg() or
2709 # recvmsg_into().
2710
2711 def testSendmsgNoDestAddr(self):
2712 # Check that sendmsg() fails when no destination address is
2713 # given for unconnected socket.
2714 pass
2715
2716 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002717 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002718 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002719 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002720 [MSG], [], 0, None)
2721
2722
2723class RecvmsgGenericTests(SendrecvmsgBase):
2724 # Tests for recvmsg() which can also be emulated using
2725 # recvmsg_into(), and can use any socket type.
2726
2727 def testRecvmsg(self):
2728 # Receive a simple message with recvmsg[_into]().
2729 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2730 self.assertEqual(msg, MSG)
2731 self.checkRecvmsgAddress(addr, self.cli_addr)
2732 self.assertEqual(ancdata, [])
2733 self.checkFlags(flags, eor=True)
2734
2735 def _testRecvmsg(self):
2736 self.sendToServer(MSG)
2737
2738 def testRecvmsgExplicitDefaults(self):
2739 # Test recvmsg[_into]() with default arguments provided explicitly.
2740 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2741 len(MSG), 0, 0)
2742 self.assertEqual(msg, MSG)
2743 self.checkRecvmsgAddress(addr, self.cli_addr)
2744 self.assertEqual(ancdata, [])
2745 self.checkFlags(flags, eor=True)
2746
2747 def _testRecvmsgExplicitDefaults(self):
2748 self.sendToServer(MSG)
2749
2750 def testRecvmsgShorter(self):
2751 # Receive a message smaller than buffer.
2752 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2753 len(MSG) + 42)
2754 self.assertEqual(msg, MSG)
2755 self.checkRecvmsgAddress(addr, self.cli_addr)
2756 self.assertEqual(ancdata, [])
2757 self.checkFlags(flags, eor=True)
2758
2759 def _testRecvmsgShorter(self):
2760 self.sendToServer(MSG)
2761
2762 def testRecvmsgTrunc(self):
2763 # Receive part of message, check for truncation indicators.
2764 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2765 len(MSG) - 3)
2766 self.assertEqual(msg, MSG[:-3])
2767 self.checkRecvmsgAddress(addr, self.cli_addr)
2768 self.assertEqual(ancdata, [])
2769 self.checkFlags(flags, eor=False)
2770
2771 def _testRecvmsgTrunc(self):
2772 self.sendToServer(MSG)
2773
2774 def testRecvmsgShortAncillaryBuf(self):
2775 # Test ancillary data buffer too small to hold any ancillary data.
2776 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2777 len(MSG), 1)
2778 self.assertEqual(msg, MSG)
2779 self.checkRecvmsgAddress(addr, self.cli_addr)
2780 self.assertEqual(ancdata, [])
2781 self.checkFlags(flags, eor=True)
2782
2783 def _testRecvmsgShortAncillaryBuf(self):
2784 self.sendToServer(MSG)
2785
2786 def testRecvmsgLongAncillaryBuf(self):
2787 # Test large ancillary data buffer.
2788 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2789 len(MSG), 10240)
2790 self.assertEqual(msg, MSG)
2791 self.checkRecvmsgAddress(addr, self.cli_addr)
2792 self.assertEqual(ancdata, [])
2793 self.checkFlags(flags, eor=True)
2794
2795 def _testRecvmsgLongAncillaryBuf(self):
2796 self.sendToServer(MSG)
2797
2798 def testRecvmsgAfterClose(self):
2799 # Check that recvmsg[_into]() fails on a closed socket.
2800 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002801 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002802
2803 def _testRecvmsgAfterClose(self):
2804 pass
2805
2806 def testRecvmsgTimeout(self):
2807 # Check that timeout works.
2808 try:
2809 self.serv_sock.settimeout(0.03)
2810 self.assertRaises(socket.timeout,
2811 self.doRecvmsg, self.serv_sock, len(MSG))
2812 finally:
2813 self.misc_event.set()
2814
2815 def _testRecvmsgTimeout(self):
2816 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2817
2818 @requireAttrs(socket, "MSG_PEEK")
2819 def testRecvmsgPeek(self):
2820 # Check that MSG_PEEK in flags enables examination of pending
2821 # data without consuming it.
2822
2823 # Receive part of data with MSG_PEEK.
2824 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2825 len(MSG) - 3, 0,
2826 socket.MSG_PEEK)
2827 self.assertEqual(msg, MSG[:-3])
2828 self.checkRecvmsgAddress(addr, self.cli_addr)
2829 self.assertEqual(ancdata, [])
2830 # Ignoring MSG_TRUNC here (so this test is the same for stream
2831 # and datagram sockets). Some wording in POSIX seems to
2832 # suggest that it needn't be set when peeking, but that may
2833 # just be a slip.
2834 self.checkFlags(flags, eor=False,
2835 ignore=getattr(socket, "MSG_TRUNC", 0))
2836
2837 # Receive all data with MSG_PEEK.
2838 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2839 len(MSG), 0,
2840 socket.MSG_PEEK)
2841 self.assertEqual(msg, MSG)
2842 self.checkRecvmsgAddress(addr, self.cli_addr)
2843 self.assertEqual(ancdata, [])
2844 self.checkFlags(flags, eor=True)
2845
2846 # Check that the same data can still be received normally.
2847 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2848 self.assertEqual(msg, MSG)
2849 self.checkRecvmsgAddress(addr, self.cli_addr)
2850 self.assertEqual(ancdata, [])
2851 self.checkFlags(flags, eor=True)
2852
2853 @testRecvmsgPeek.client_skip
2854 def _testRecvmsgPeek(self):
2855 self.sendToServer(MSG)
2856
2857 @requireAttrs(socket.socket, "sendmsg")
2858 def testRecvmsgFromSendmsg(self):
2859 # Test receiving with recvmsg[_into]() when message is sent
2860 # using sendmsg().
2861 self.serv_sock.settimeout(self.fail_timeout)
2862 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2863 self.assertEqual(msg, MSG)
2864 self.checkRecvmsgAddress(addr, self.cli_addr)
2865 self.assertEqual(ancdata, [])
2866 self.checkFlags(flags, eor=True)
2867
2868 @testRecvmsgFromSendmsg.client_skip
2869 def _testRecvmsgFromSendmsg(self):
2870 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2871
2872
2873class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2874 # Tests which require a stream socket and can use either recvmsg()
2875 # or recvmsg_into().
2876
2877 def testRecvmsgEOF(self):
2878 # Receive end-of-stream indicator (b"", peer socket closed).
2879 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2880 self.assertEqual(msg, b"")
2881 self.checkRecvmsgAddress(addr, self.cli_addr)
2882 self.assertEqual(ancdata, [])
2883 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2884
2885 def _testRecvmsgEOF(self):
2886 self.cli_sock.close()
2887
2888 def testRecvmsgOverflow(self):
2889 # Receive a message in more than one chunk.
2890 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2891 len(MSG) - 3)
2892 self.checkRecvmsgAddress(addr, self.cli_addr)
2893 self.assertEqual(ancdata, [])
2894 self.checkFlags(flags, eor=False)
2895
2896 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2897 self.checkRecvmsgAddress(addr, self.cli_addr)
2898 self.assertEqual(ancdata, [])
2899 self.checkFlags(flags, eor=True)
2900
2901 msg = seg1 + seg2
2902 self.assertEqual(msg, MSG)
2903
2904 def _testRecvmsgOverflow(self):
2905 self.sendToServer(MSG)
2906
2907
2908class RecvmsgTests(RecvmsgGenericTests):
2909 # Tests for recvmsg() which can use any socket type.
2910
2911 def testRecvmsgBadArgs(self):
2912 # Check that recvmsg() rejects invalid arguments.
2913 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2914 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2915 -1, 0, 0)
2916 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2917 len(MSG), -1, 0)
2918 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2919 [bytearray(10)], 0, 0)
2920 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2921 object(), 0, 0)
2922 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2923 len(MSG), object(), 0)
2924 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2925 len(MSG), 0, object())
2926
2927 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2928 self.assertEqual(msg, MSG)
2929 self.checkRecvmsgAddress(addr, self.cli_addr)
2930 self.assertEqual(ancdata, [])
2931 self.checkFlags(flags, eor=True)
2932
2933 def _testRecvmsgBadArgs(self):
2934 self.sendToServer(MSG)
2935
2936
2937class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2938 # Tests for recvmsg_into() which can use any socket type.
2939
2940 def testRecvmsgIntoBadArgs(self):
2941 # Check that recvmsg_into() rejects invalid arguments.
2942 buf = bytearray(len(MSG))
2943 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2944 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2945 len(MSG), 0, 0)
2946 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2947 buf, 0, 0)
2948 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2949 [object()], 0, 0)
2950 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2951 [b"I'm not writable"], 0, 0)
2952 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2953 [buf, object()], 0, 0)
2954 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2955 [buf], -1, 0)
2956 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2957 [buf], object(), 0)
2958 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2959 [buf], 0, object())
2960
2961 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2962 self.assertEqual(nbytes, len(MSG))
2963 self.assertEqual(buf, bytearray(MSG))
2964 self.checkRecvmsgAddress(addr, self.cli_addr)
2965 self.assertEqual(ancdata, [])
2966 self.checkFlags(flags, eor=True)
2967
2968 def _testRecvmsgIntoBadArgs(self):
2969 self.sendToServer(MSG)
2970
2971 def testRecvmsgIntoGenerator(self):
2972 # Receive into buffer obtained from a generator (not a sequence).
2973 buf = bytearray(len(MSG))
2974 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2975 (o for o in [buf]))
2976 self.assertEqual(nbytes, len(MSG))
2977 self.assertEqual(buf, bytearray(MSG))
2978 self.checkRecvmsgAddress(addr, self.cli_addr)
2979 self.assertEqual(ancdata, [])
2980 self.checkFlags(flags, eor=True)
2981
2982 def _testRecvmsgIntoGenerator(self):
2983 self.sendToServer(MSG)
2984
2985 def testRecvmsgIntoArray(self):
2986 # Receive into an array rather than the usual bytearray.
2987 buf = array.array("B", [0] * len(MSG))
2988 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2989 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002990 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002991 self.checkRecvmsgAddress(addr, self.cli_addr)
2992 self.assertEqual(ancdata, [])
2993 self.checkFlags(flags, eor=True)
2994
2995 def _testRecvmsgIntoArray(self):
2996 self.sendToServer(MSG)
2997
2998 def testRecvmsgIntoScatter(self):
2999 # Receive into multiple buffers (scatter write).
3000 b1 = bytearray(b"----")
3001 b2 = bytearray(b"0123456789")
3002 b3 = bytearray(b"--------------")
3003 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
3004 [b1, memoryview(b2)[2:9], b3])
3005 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3006 self.assertEqual(b1, bytearray(b"Mary"))
3007 self.assertEqual(b2, bytearray(b"01 had a 9"))
3008 self.assertEqual(b3, bytearray(b"little lamb---"))
3009 self.checkRecvmsgAddress(addr, self.cli_addr)
3010 self.assertEqual(ancdata, [])
3011 self.checkFlags(flags, eor=True)
3012
3013 def _testRecvmsgIntoScatter(self):
3014 self.sendToServer(b"Mary had a little lamb")
3015
3016
3017class CmsgMacroTests(unittest.TestCase):
3018 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3019 # assumptions used by sendmsg() and recvmsg[_into](), which share
3020 # code with these functions.
3021
3022 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003023 try:
3024 import _testcapi
3025 except ImportError:
3026 socklen_t_limit = 0x7fffffff
3027 else:
3028 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003029
3030 @requireAttrs(socket, "CMSG_LEN")
3031 def testCMSG_LEN(self):
3032 # Test CMSG_LEN() with various valid and invalid values,
3033 # checking the assumptions used by recvmsg() and sendmsg().
3034 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3035 values = list(range(257)) + list(range(toobig - 257, toobig))
3036
3037 # struct cmsghdr has at least three members, two of which are ints
3038 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3039 for n in values:
3040 ret = socket.CMSG_LEN(n)
3041 # This is how recvmsg() calculates the data size
3042 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3043 self.assertLessEqual(ret, self.socklen_t_limit)
3044
3045 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3046 # sendmsg() shares code with these functions, and requires
3047 # that it reject values over the limit.
3048 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3049 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3050
3051 @requireAttrs(socket, "CMSG_SPACE")
3052 def testCMSG_SPACE(self):
3053 # Test CMSG_SPACE() with various valid and invalid values,
3054 # checking the assumptions used by sendmsg().
3055 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3056 values = list(range(257)) + list(range(toobig - 257, toobig))
3057
3058 last = socket.CMSG_SPACE(0)
3059 # struct cmsghdr has at least three members, two of which are ints
3060 self.assertGreater(last, array.array("i").itemsize * 2)
3061 for n in values:
3062 ret = socket.CMSG_SPACE(n)
3063 self.assertGreaterEqual(ret, last)
3064 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3065 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3066 self.assertLessEqual(ret, self.socklen_t_limit)
3067 last = ret
3068
3069 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3070 # sendmsg() shares code with these functions, and requires
3071 # that it reject values over the limit.
3072 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3073 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3074
3075
3076class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3077 # Tests for file descriptor passing on Unix-domain sockets.
3078
3079 # Invalid file descriptor value that's unlikely to evaluate to a
3080 # real FD even if one of its bytes is replaced with a different
3081 # value (which shouldn't actually happen).
3082 badfd = -0x5555
3083
3084 def newFDs(self, n):
3085 # Return a list of n file descriptors for newly-created files
3086 # containing their list indices as ASCII numbers.
3087 fds = []
3088 for i in range(n):
3089 fd, path = tempfile.mkstemp()
3090 self.addCleanup(os.unlink, path)
3091 self.addCleanup(os.close, fd)
3092 os.write(fd, str(i).encode())
3093 fds.append(fd)
3094 return fds
3095
3096 def checkFDs(self, fds):
3097 # Check that the file descriptors in the given list contain
3098 # their correct list indices as ASCII numbers.
3099 for n, fd in enumerate(fds):
3100 os.lseek(fd, 0, os.SEEK_SET)
3101 self.assertEqual(os.read(fd, 1024), str(n).encode())
3102
3103 def registerRecvmsgResult(self, result):
3104 self.addCleanup(self.closeRecvmsgFDs, result)
3105
3106 def closeRecvmsgFDs(self, recvmsg_result):
3107 # Close all file descriptors specified in the ancillary data
3108 # of the given return value from recvmsg() or recvmsg_into().
3109 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3110 if (cmsg_level == socket.SOL_SOCKET and
3111 cmsg_type == socket.SCM_RIGHTS):
3112 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003113 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003114 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3115 for fd in fds:
3116 os.close(fd)
3117
3118 def createAndSendFDs(self, n):
3119 # Send n new file descriptors created by newFDs() to the
3120 # server, with the constant MSG as the non-ancillary data.
3121 self.assertEqual(
3122 self.sendmsgToServer([MSG],
3123 [(socket.SOL_SOCKET,
3124 socket.SCM_RIGHTS,
3125 array.array("i", self.newFDs(n)))]),
3126 len(MSG))
3127
3128 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3129 # Check that constant MSG was received with numfds file
3130 # descriptors in a maximum of maxcmsgs control messages (which
3131 # must contain only complete integers). By default, check
3132 # that MSG_CTRUNC is unset, but ignore any flags in
3133 # ignoreflags.
3134 msg, ancdata, flags, addr = result
3135 self.assertEqual(msg, MSG)
3136 self.checkRecvmsgAddress(addr, self.cli_addr)
3137 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3138 ignore=ignoreflags)
3139
3140 self.assertIsInstance(ancdata, list)
3141 self.assertLessEqual(len(ancdata), maxcmsgs)
3142 fds = array.array("i")
3143 for item in ancdata:
3144 self.assertIsInstance(item, tuple)
3145 cmsg_level, cmsg_type, cmsg_data = item
3146 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3147 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3148 self.assertIsInstance(cmsg_data, bytes)
3149 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003150 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003151
3152 self.assertEqual(len(fds), numfds)
3153 self.checkFDs(fds)
3154
3155 def testFDPassSimple(self):
3156 # Pass a single FD (array read from bytes object).
3157 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3158 len(MSG), 10240))
3159
3160 def _testFDPassSimple(self):
3161 self.assertEqual(
3162 self.sendmsgToServer(
3163 [MSG],
3164 [(socket.SOL_SOCKET,
3165 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003166 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003167 len(MSG))
3168
3169 def testMultipleFDPass(self):
3170 # Pass multiple FDs in a single array.
3171 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3172 len(MSG), 10240))
3173
3174 def _testMultipleFDPass(self):
3175 self.createAndSendFDs(4)
3176
3177 @requireAttrs(socket, "CMSG_SPACE")
3178 def testFDPassCMSG_SPACE(self):
3179 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3180 self.checkRecvmsgFDs(
3181 4, self.doRecvmsg(self.serv_sock, len(MSG),
3182 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3183
3184 @testFDPassCMSG_SPACE.client_skip
3185 def _testFDPassCMSG_SPACE(self):
3186 self.createAndSendFDs(4)
3187
3188 def testFDPassCMSG_LEN(self):
3189 # Test using CMSG_LEN() to calculate ancillary buffer size.
3190 self.checkRecvmsgFDs(1,
3191 self.doRecvmsg(self.serv_sock, len(MSG),
3192 socket.CMSG_LEN(4 * SIZEOF_INT)),
3193 # RFC 3542 says implementations may set
3194 # MSG_CTRUNC if there isn't enough space
3195 # for trailing padding.
3196 ignoreflags=socket.MSG_CTRUNC)
3197
3198 def _testFDPassCMSG_LEN(self):
3199 self.createAndSendFDs(1)
3200
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003201 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003202 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003203 @requireAttrs(socket, "CMSG_SPACE")
3204 def testFDPassSeparate(self):
3205 # Pass two FDs in two separate arrays. Arrays may be combined
3206 # into a single control message by the OS.
3207 self.checkRecvmsgFDs(2,
3208 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3209 maxcmsgs=2)
3210
3211 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003212 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003213 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003214 def _testFDPassSeparate(self):
3215 fd0, fd1 = self.newFDs(2)
3216 self.assertEqual(
3217 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3218 socket.SCM_RIGHTS,
3219 array.array("i", [fd0])),
3220 (socket.SOL_SOCKET,
3221 socket.SCM_RIGHTS,
3222 array.array("i", [fd1]))]),
3223 len(MSG))
3224
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003225 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003226 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003227 @requireAttrs(socket, "CMSG_SPACE")
3228 def testFDPassSeparateMinSpace(self):
3229 # Pass two FDs in two separate arrays, receiving them into the
3230 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003231 num_fds = 2
3232 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003233 self.doRecvmsg(self.serv_sock, len(MSG),
3234 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003235 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003236 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3237
3238 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003239 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003240 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003241 def _testFDPassSeparateMinSpace(self):
3242 fd0, fd1 = self.newFDs(2)
3243 self.assertEqual(
3244 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3245 socket.SCM_RIGHTS,
3246 array.array("i", [fd0])),
3247 (socket.SOL_SOCKET,
3248 socket.SCM_RIGHTS,
3249 array.array("i", [fd1]))]),
3250 len(MSG))
3251
3252 def sendAncillaryIfPossible(self, msg, ancdata):
3253 # Try to send msg and ancdata to server, but if the system
3254 # call fails, just send msg with no ancillary data.
3255 try:
3256 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003257 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003258 # Check that it was the system call that failed
3259 self.assertIsInstance(e.errno, int)
3260 nbytes = self.sendmsgToServer([msg])
3261 self.assertEqual(nbytes, len(msg))
3262
Brett Cannon3bbad122015-12-28 17:21:44 -08003263 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003264 def testFDPassEmpty(self):
3265 # Try to pass an empty FD array. Can receive either no array
3266 # or an empty array.
3267 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3268 len(MSG), 10240),
3269 ignoreflags=socket.MSG_CTRUNC)
3270
3271 def _testFDPassEmpty(self):
3272 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3273 socket.SCM_RIGHTS,
3274 b"")])
3275
3276 def testFDPassPartialInt(self):
3277 # Try to pass a truncated FD array.
3278 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3279 len(MSG), 10240)
3280 self.assertEqual(msg, MSG)
3281 self.checkRecvmsgAddress(addr, self.cli_addr)
3282 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3283 self.assertLessEqual(len(ancdata), 1)
3284 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3285 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3286 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3287 self.assertLess(len(cmsg_data), SIZEOF_INT)
3288
3289 def _testFDPassPartialInt(self):
3290 self.sendAncillaryIfPossible(
3291 MSG,
3292 [(socket.SOL_SOCKET,
3293 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003294 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003295
3296 @requireAttrs(socket, "CMSG_SPACE")
3297 def testFDPassPartialIntInMiddle(self):
3298 # Try to pass two FD arrays, the first of which is truncated.
3299 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3300 len(MSG), 10240)
3301 self.assertEqual(msg, MSG)
3302 self.checkRecvmsgAddress(addr, self.cli_addr)
3303 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3304 self.assertLessEqual(len(ancdata), 2)
3305 fds = array.array("i")
3306 # Arrays may have been combined in a single control message
3307 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3308 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3309 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003310 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003311 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3312 self.assertLessEqual(len(fds), 2)
3313 self.checkFDs(fds)
3314
3315 @testFDPassPartialIntInMiddle.client_skip
3316 def _testFDPassPartialIntInMiddle(self):
3317 fd0, fd1 = self.newFDs(2)
3318 self.sendAncillaryIfPossible(
3319 MSG,
3320 [(socket.SOL_SOCKET,
3321 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003322 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003323 (socket.SOL_SOCKET,
3324 socket.SCM_RIGHTS,
3325 array.array("i", [fd1]))])
3326
3327 def checkTruncatedHeader(self, result, ignoreflags=0):
3328 # Check that no ancillary data items are returned when data is
3329 # truncated inside the cmsghdr structure.
3330 msg, ancdata, flags, addr = result
3331 self.assertEqual(msg, MSG)
3332 self.checkRecvmsgAddress(addr, self.cli_addr)
3333 self.assertEqual(ancdata, [])
3334 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3335 ignore=ignoreflags)
3336
3337 def testCmsgTruncNoBufSize(self):
3338 # Check that no ancillary data is received when no buffer size
3339 # is specified.
3340 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3341 # BSD seems to set MSG_CTRUNC only
3342 # if an item has been partially
3343 # received.
3344 ignoreflags=socket.MSG_CTRUNC)
3345
3346 def _testCmsgTruncNoBufSize(self):
3347 self.createAndSendFDs(1)
3348
3349 def testCmsgTrunc0(self):
3350 # Check that no ancillary data is received when buffer size is 0.
3351 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3352 ignoreflags=socket.MSG_CTRUNC)
3353
3354 def _testCmsgTrunc0(self):
3355 self.createAndSendFDs(1)
3356
3357 # Check that no ancillary data is returned for various non-zero
3358 # (but still too small) buffer sizes.
3359
3360 def testCmsgTrunc1(self):
3361 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3362
3363 def _testCmsgTrunc1(self):
3364 self.createAndSendFDs(1)
3365
3366 def testCmsgTrunc2Int(self):
3367 # The cmsghdr structure has at least three members, two of
3368 # which are ints, so we still shouldn't see any ancillary
3369 # data.
3370 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3371 SIZEOF_INT * 2))
3372
3373 def _testCmsgTrunc2Int(self):
3374 self.createAndSendFDs(1)
3375
3376 def testCmsgTruncLen0Minus1(self):
3377 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3378 socket.CMSG_LEN(0) - 1))
3379
3380 def _testCmsgTruncLen0Minus1(self):
3381 self.createAndSendFDs(1)
3382
3383 # The following tests try to truncate the control message in the
3384 # middle of the FD array.
3385
3386 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3387 # Check that file descriptor data is truncated to between
3388 # mindata and maxdata bytes when received with buffer size
3389 # ancbuf, and that any complete file descriptor numbers are
3390 # valid.
3391 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3392 len(MSG), ancbuf)
3393 self.assertEqual(msg, MSG)
3394 self.checkRecvmsgAddress(addr, self.cli_addr)
3395 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3396
3397 if mindata == 0 and ancdata == []:
3398 return
3399 self.assertEqual(len(ancdata), 1)
3400 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3401 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3402 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3403 self.assertGreaterEqual(len(cmsg_data), mindata)
3404 self.assertLessEqual(len(cmsg_data), maxdata)
3405 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003406 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003407 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3408 self.checkFDs(fds)
3409
3410 def testCmsgTruncLen0(self):
3411 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3412
3413 def _testCmsgTruncLen0(self):
3414 self.createAndSendFDs(1)
3415
3416 def testCmsgTruncLen0Plus1(self):
3417 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3418
3419 def _testCmsgTruncLen0Plus1(self):
3420 self.createAndSendFDs(2)
3421
3422 def testCmsgTruncLen1(self):
3423 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3424 maxdata=SIZEOF_INT)
3425
3426 def _testCmsgTruncLen1(self):
3427 self.createAndSendFDs(2)
3428
3429 def testCmsgTruncLen2Minus1(self):
3430 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3431 maxdata=(2 * SIZEOF_INT) - 1)
3432
3433 def _testCmsgTruncLen2Minus1(self):
3434 self.createAndSendFDs(2)
3435
3436
3437class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3438 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3439 # features of the RFC 3542 Advanced Sockets API for IPv6.
3440 # Currently we can only handle certain data items (e.g. traffic
3441 # class, hop limit, MTU discovery and fragmentation settings)
3442 # without resorting to unportable means such as the struct module,
3443 # but the tests here are aimed at testing the ancillary data
3444 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3445 # itself.
3446
3447 # Test value to use when setting hop limit of packet
3448 hop_limit = 2
3449
3450 # Test value to use when setting traffic class of packet.
3451 # -1 means "use kernel default".
3452 traffic_class = -1
3453
3454 def ancillaryMapping(self, ancdata):
3455 # Given ancillary data list ancdata, return a mapping from
3456 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3457 # Check that no (level, type) pair appears more than once.
3458 d = {}
3459 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3460 self.assertNotIn((cmsg_level, cmsg_type), d)
3461 d[(cmsg_level, cmsg_type)] = cmsg_data
3462 return d
3463
3464 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3465 # Receive hop limit into ancbufsize bytes of ancillary data
3466 # space. Check that data is MSG, ancillary data is not
3467 # truncated (but ignore any flags in ignoreflags), and hop
3468 # limit is between 0 and maxhop inclusive.
3469 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3470 socket.IPV6_RECVHOPLIMIT, 1)
3471 self.misc_event.set()
3472 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3473 len(MSG), ancbufsize)
3474
3475 self.assertEqual(msg, MSG)
3476 self.checkRecvmsgAddress(addr, self.cli_addr)
3477 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3478 ignore=ignoreflags)
3479
3480 self.assertEqual(len(ancdata), 1)
3481 self.assertIsInstance(ancdata[0], tuple)
3482 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3483 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3484 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3485 self.assertIsInstance(cmsg_data, bytes)
3486 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3487 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003488 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003489 self.assertGreaterEqual(a[0], 0)
3490 self.assertLessEqual(a[0], maxhop)
3491
3492 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3493 def testRecvHopLimit(self):
3494 # Test receiving the packet hop limit as ancillary data.
3495 self.checkHopLimit(ancbufsize=10240)
3496
3497 @testRecvHopLimit.client_skip
3498 def _testRecvHopLimit(self):
3499 # Need to wait until server has asked to receive ancillary
3500 # data, as implementations are not required to buffer it
3501 # otherwise.
3502 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3503 self.sendToServer(MSG)
3504
3505 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3506 def testRecvHopLimitCMSG_SPACE(self):
3507 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3508 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3509
3510 @testRecvHopLimitCMSG_SPACE.client_skip
3511 def _testRecvHopLimitCMSG_SPACE(self):
3512 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3513 self.sendToServer(MSG)
3514
3515 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3516 # 3542 says portable applications must provide space for trailing
3517 # padding. Implementations may set MSG_CTRUNC if there isn't
3518 # enough space for the padding.
3519
3520 @requireAttrs(socket.socket, "sendmsg")
3521 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3522 def testSetHopLimit(self):
3523 # Test setting hop limit on outgoing packet and receiving it
3524 # at the other end.
3525 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3526
3527 @testSetHopLimit.client_skip
3528 def _testSetHopLimit(self):
3529 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3530 self.assertEqual(
3531 self.sendmsgToServer([MSG],
3532 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3533 array.array("i", [self.hop_limit]))]),
3534 len(MSG))
3535
3536 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3537 ignoreflags=0):
3538 # Receive traffic class and hop limit into ancbufsize bytes of
3539 # ancillary data space. Check that data is MSG, ancillary
3540 # data is not truncated (but ignore any flags in ignoreflags),
3541 # and traffic class and hop limit are in range (hop limit no
3542 # more than maxhop).
3543 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3544 socket.IPV6_RECVHOPLIMIT, 1)
3545 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3546 socket.IPV6_RECVTCLASS, 1)
3547 self.misc_event.set()
3548 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3549 len(MSG), ancbufsize)
3550
3551 self.assertEqual(msg, MSG)
3552 self.checkRecvmsgAddress(addr, self.cli_addr)
3553 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3554 ignore=ignoreflags)
3555 self.assertEqual(len(ancdata), 2)
3556 ancmap = self.ancillaryMapping(ancdata)
3557
3558 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3559 self.assertEqual(len(tcdata), SIZEOF_INT)
3560 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003561 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003562 self.assertGreaterEqual(a[0], 0)
3563 self.assertLessEqual(a[0], 255)
3564
3565 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3566 self.assertEqual(len(hldata), SIZEOF_INT)
3567 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003568 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003569 self.assertGreaterEqual(a[0], 0)
3570 self.assertLessEqual(a[0], maxhop)
3571
3572 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3573 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3574 def testRecvTrafficClassAndHopLimit(self):
3575 # Test receiving traffic class and hop limit as ancillary data.
3576 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3577
3578 @testRecvTrafficClassAndHopLimit.client_skip
3579 def _testRecvTrafficClassAndHopLimit(self):
3580 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3581 self.sendToServer(MSG)
3582
3583 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3584 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3585 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3586 # Test receiving traffic class and hop limit, using
3587 # CMSG_SPACE() to calculate buffer size.
3588 self.checkTrafficClassAndHopLimit(
3589 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3590
3591 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3592 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3593 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3594 self.sendToServer(MSG)
3595
3596 @requireAttrs(socket.socket, "sendmsg")
3597 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3598 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3599 def testSetTrafficClassAndHopLimit(self):
3600 # Test setting traffic class and hop limit on outgoing packet,
3601 # and receiving them at the other end.
3602 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3603 maxhop=self.hop_limit)
3604
3605 @testSetTrafficClassAndHopLimit.client_skip
3606 def _testSetTrafficClassAndHopLimit(self):
3607 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3608 self.assertEqual(
3609 self.sendmsgToServer([MSG],
3610 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3611 array.array("i", [self.traffic_class])),
3612 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3613 array.array("i", [self.hop_limit]))]),
3614 len(MSG))
3615
3616 @requireAttrs(socket.socket, "sendmsg")
3617 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3618 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3619 def testOddCmsgSize(self):
3620 # Try to send ancillary data with first item one byte too
3621 # long. Fall back to sending with correct size if this fails,
3622 # and check that second item was handled correctly.
3623 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3624 maxhop=self.hop_limit)
3625
3626 @testOddCmsgSize.client_skip
3627 def _testOddCmsgSize(self):
3628 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3629 try:
3630 nbytes = self.sendmsgToServer(
3631 [MSG],
3632 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003633 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003634 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3635 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003636 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003637 self.assertIsInstance(e.errno, int)
3638 nbytes = self.sendmsgToServer(
3639 [MSG],
3640 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3641 array.array("i", [self.traffic_class])),
3642 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3643 array.array("i", [self.hop_limit]))])
3644 self.assertEqual(nbytes, len(MSG))
3645
3646 # Tests for proper handling of truncated ancillary data
3647
3648 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3649 # Receive hop limit into ancbufsize bytes of ancillary data
3650 # space, which should be too small to contain the ancillary
3651 # data header (if ancbufsize is None, pass no second argument
3652 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3653 # (unless included in ignoreflags), and no ancillary data is
3654 # returned.
3655 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3656 socket.IPV6_RECVHOPLIMIT, 1)
3657 self.misc_event.set()
3658 args = () if ancbufsize is None else (ancbufsize,)
3659 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3660 len(MSG), *args)
3661
3662 self.assertEqual(msg, MSG)
3663 self.checkRecvmsgAddress(addr, self.cli_addr)
3664 self.assertEqual(ancdata, [])
3665 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3666 ignore=ignoreflags)
3667
3668 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3669 def testCmsgTruncNoBufSize(self):
3670 # Check that no ancillary data is received when no ancillary
3671 # buffer size is provided.
3672 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3673 # BSD seems to set
3674 # MSG_CTRUNC only if an item
3675 # has been partially
3676 # received.
3677 ignoreflags=socket.MSG_CTRUNC)
3678
3679 @testCmsgTruncNoBufSize.client_skip
3680 def _testCmsgTruncNoBufSize(self):
3681 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3682 self.sendToServer(MSG)
3683
3684 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3685 def testSingleCmsgTrunc0(self):
3686 # Check that no ancillary data is received when ancillary
3687 # buffer size is zero.
3688 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3689 ignoreflags=socket.MSG_CTRUNC)
3690
3691 @testSingleCmsgTrunc0.client_skip
3692 def _testSingleCmsgTrunc0(self):
3693 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3694 self.sendToServer(MSG)
3695
3696 # Check that no ancillary data is returned for various non-zero
3697 # (but still too small) buffer sizes.
3698
3699 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3700 def testSingleCmsgTrunc1(self):
3701 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3702
3703 @testSingleCmsgTrunc1.client_skip
3704 def _testSingleCmsgTrunc1(self):
3705 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3706 self.sendToServer(MSG)
3707
3708 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3709 def testSingleCmsgTrunc2Int(self):
3710 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3711
3712 @testSingleCmsgTrunc2Int.client_skip
3713 def _testSingleCmsgTrunc2Int(self):
3714 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3715 self.sendToServer(MSG)
3716
3717 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3718 def testSingleCmsgTruncLen0Minus1(self):
3719 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3720
3721 @testSingleCmsgTruncLen0Minus1.client_skip
3722 def _testSingleCmsgTruncLen0Minus1(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 testSingleCmsgTruncInData(self):
3728 # Test truncation of a control message inside its associated
3729 # data. The message may be returned with its data truncated,
3730 # or not returned at all.
3731 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3732 socket.IPV6_RECVHOPLIMIT, 1)
3733 self.misc_event.set()
3734 msg, ancdata, flags, addr = self.doRecvmsg(
3735 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3736
3737 self.assertEqual(msg, MSG)
3738 self.checkRecvmsgAddress(addr, self.cli_addr)
3739 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3740
3741 self.assertLessEqual(len(ancdata), 1)
3742 if ancdata:
3743 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3744 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3745 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3746 self.assertLess(len(cmsg_data), SIZEOF_INT)
3747
3748 @testSingleCmsgTruncInData.client_skip
3749 def _testSingleCmsgTruncInData(self):
3750 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3751 self.sendToServer(MSG)
3752
3753 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3754 # Receive traffic class and hop limit into ancbufsize bytes of
3755 # ancillary data space, which should be large enough to
3756 # contain the first item, but too small to contain the header
3757 # of the second. Check that data is MSG, MSG_CTRUNC is set
3758 # (unless included in ignoreflags), and only one ancillary
3759 # data item is returned.
3760 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3761 socket.IPV6_RECVHOPLIMIT, 1)
3762 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3763 socket.IPV6_RECVTCLASS, 1)
3764 self.misc_event.set()
3765 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3766 len(MSG), ancbufsize)
3767
3768 self.assertEqual(msg, MSG)
3769 self.checkRecvmsgAddress(addr, self.cli_addr)
3770 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3771 ignore=ignoreflags)
3772
3773 self.assertEqual(len(ancdata), 1)
3774 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3775 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3776 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3777 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3778 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003779 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003780 self.assertGreaterEqual(a[0], 0)
3781 self.assertLessEqual(a[0], 255)
3782
3783 # Try the above test with various buffer sizes.
3784
3785 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3786 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3787 def testSecondCmsgTrunc0(self):
3788 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3789 ignoreflags=socket.MSG_CTRUNC)
3790
3791 @testSecondCmsgTrunc0.client_skip
3792 def _testSecondCmsgTrunc0(self):
3793 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3794 self.sendToServer(MSG)
3795
3796 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3797 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3798 def testSecondCmsgTrunc1(self):
3799 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3800
3801 @testSecondCmsgTrunc1.client_skip
3802 def _testSecondCmsgTrunc1(self):
3803 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3804 self.sendToServer(MSG)
3805
3806 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3807 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3808 def testSecondCmsgTrunc2Int(self):
3809 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3810 2 * SIZEOF_INT)
3811
3812 @testSecondCmsgTrunc2Int.client_skip
3813 def _testSecondCmsgTrunc2Int(self):
3814 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3815 self.sendToServer(MSG)
3816
3817 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3818 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3819 def testSecondCmsgTruncLen0Minus1(self):
3820 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3821 socket.CMSG_LEN(0) - 1)
3822
3823 @testSecondCmsgTruncLen0Minus1.client_skip
3824 def _testSecondCmsgTruncLen0Minus1(self):
3825 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3826 self.sendToServer(MSG)
3827
3828 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3829 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3830 def testSecomdCmsgTruncInData(self):
3831 # Test truncation of the second of two control messages inside
3832 # its associated data.
3833 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3834 socket.IPV6_RECVHOPLIMIT, 1)
3835 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3836 socket.IPV6_RECVTCLASS, 1)
3837 self.misc_event.set()
3838 msg, ancdata, flags, addr = self.doRecvmsg(
3839 self.serv_sock, len(MSG),
3840 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3841
3842 self.assertEqual(msg, MSG)
3843 self.checkRecvmsgAddress(addr, self.cli_addr)
3844 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3845
3846 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3847
3848 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3849 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3850 cmsg_types.remove(cmsg_type)
3851 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3852 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003853 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003854 self.assertGreaterEqual(a[0], 0)
3855 self.assertLessEqual(a[0], 255)
3856
3857 if ancdata:
3858 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3859 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3860 cmsg_types.remove(cmsg_type)
3861 self.assertLess(len(cmsg_data), SIZEOF_INT)
3862
3863 self.assertEqual(ancdata, [])
3864
3865 @testSecomdCmsgTruncInData.client_skip
3866 def _testSecomdCmsgTruncInData(self):
3867 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3868 self.sendToServer(MSG)
3869
3870
3871# Derive concrete test classes for different socket types.
3872
3873class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3874 SendrecvmsgConnectionlessBase,
3875 ThreadedSocketTestMixin, UDPTestBase):
3876 pass
3877
3878@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003879class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3880 pass
3881
3882@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003883class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3884 pass
3885
3886@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003887class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3888 pass
3889
3890
3891class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3892 SendrecvmsgConnectionlessBase,
3893 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003894
3895 def checkRecvmsgAddress(self, addr1, addr2):
3896 # Called to compare the received address with the address of
3897 # the peer, ignoring scope ID
3898 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003899
3900@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003901@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003902@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003903class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3904 pass
3905
3906@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003907@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003908@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003909class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3910 pass
3911
3912@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003913@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003914@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003915class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3916 pass
3917
3918@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003919@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003920@requireAttrs(socket, "IPPROTO_IPV6")
3921@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003922class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3923 SendrecvmsgUDP6TestBase):
3924 pass
3925
3926@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003927@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003928@requireAttrs(socket, "IPPROTO_IPV6")
3929@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003930class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3931 RFC3542AncillaryTest,
3932 SendrecvmsgUDP6TestBase):
3933 pass
3934
3935
3936class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3937 ConnectedStreamTestMixin, TCPTestBase):
3938 pass
3939
3940@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003941class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3942 pass
3943
3944@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003945class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3946 SendrecvmsgTCPTestBase):
3947 pass
3948
3949@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003950class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3951 SendrecvmsgTCPTestBase):
3952 pass
3953
3954
3955class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3956 SendrecvmsgConnectedBase,
3957 ConnectedStreamTestMixin, SCTPStreamBase):
3958 pass
3959
3960@requireAttrs(socket.socket, "sendmsg")
3961@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003962class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3963 pass
3964
3965@requireAttrs(socket.socket, "recvmsg")
3966@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003967class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3968 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003969
3970 def testRecvmsgEOF(self):
3971 try:
3972 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3973 except OSError as e:
3974 if e.errno != errno.ENOTCONN:
3975 raise
3976 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977
3978@requireAttrs(socket.socket, "recvmsg_into")
3979@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003980class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3981 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003982
3983 def testRecvmsgEOF(self):
3984 try:
3985 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3986 except OSError as e:
3987 if e.errno != errno.ENOTCONN:
3988 raise
3989 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003990
3991
3992class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3993 ConnectedStreamTestMixin, UnixStreamBase):
3994 pass
3995
3996@requireAttrs(socket.socket, "sendmsg")
3997@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003998class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3999 pass
4000
4001@requireAttrs(socket.socket, "recvmsg")
4002@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004003class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
4004 SendrecvmsgUnixStreamTestBase):
4005 pass
4006
4007@requireAttrs(socket.socket, "recvmsg_into")
4008@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004009class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4010 SendrecvmsgUnixStreamTestBase):
4011 pass
4012
4013@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4014@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004015class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4016 pass
4017
4018@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4019@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004020class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4021 SendrecvmsgUnixStreamTestBase):
4022 pass
4023
4024
4025# Test interrupting the interruptible send/receive methods with a
4026# signal when a timeout is set. These tests avoid having multiple
4027# threads alive during the test so that the OS cannot deliver the
4028# signal to the wrong one.
4029
4030class InterruptedTimeoutBase(unittest.TestCase):
4031 # Base class for interrupted send/receive tests. Installs an
4032 # empty handler for SIGALRM and removes it on teardown, along with
4033 # any scheduled alarms.
4034
4035 def setUp(self):
4036 super().setUp()
4037 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004038 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004039 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004040
4041 # Timeout for socket operations
4042 timeout = 4.0
4043
4044 # Provide setAlarm() method to schedule delivery of SIGALRM after
4045 # given number of seconds, or cancel it if zero, and an
4046 # appropriate time value to use. Use setitimer() if available.
4047 if hasattr(signal, "setitimer"):
4048 alarm_time = 0.05
4049
4050 def setAlarm(self, seconds):
4051 signal.setitimer(signal.ITIMER_REAL, seconds)
4052 else:
4053 # Old systems may deliver the alarm up to one second early
4054 alarm_time = 2
4055
4056 def setAlarm(self, seconds):
4057 signal.alarm(seconds)
4058
4059
4060# Require siginterrupt() in order to ensure that system calls are
4061# interrupted by default.
4062@requireAttrs(signal, "siginterrupt")
4063@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4064 "Don't have signal.alarm or signal.setitimer")
4065class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4066 # Test interrupting the recv*() methods with signals when a
4067 # timeout is set.
4068
4069 def setUp(self):
4070 super().setUp()
4071 self.serv.settimeout(self.timeout)
4072
4073 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004074 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004075 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004076 try:
4077 self.setAlarm(self.alarm_time)
4078 with self.assertRaises(ZeroDivisionError) as cm:
4079 func(*args, **kwargs)
4080 finally:
4081 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004082
4083 def testInterruptedRecvTimeout(self):
4084 self.checkInterruptedRecv(self.serv.recv, 1024)
4085
4086 def testInterruptedRecvIntoTimeout(self):
4087 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4088
4089 def testInterruptedRecvfromTimeout(self):
4090 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4091
4092 def testInterruptedRecvfromIntoTimeout(self):
4093 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4094
4095 @requireAttrs(socket.socket, "recvmsg")
4096 def testInterruptedRecvmsgTimeout(self):
4097 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4098
4099 @requireAttrs(socket.socket, "recvmsg_into")
4100 def testInterruptedRecvmsgIntoTimeout(self):
4101 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4102
4103
4104# Require siginterrupt() in order to ensure that system calls are
4105# interrupted by default.
4106@requireAttrs(signal, "siginterrupt")
4107@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4108 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004109class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4110 ThreadSafeCleanupTestCase,
4111 SocketListeningTestMixin, TCPTestBase):
4112 # Test interrupting the interruptible send*() methods with signals
4113 # when a timeout is set.
4114
4115 def setUp(self):
4116 super().setUp()
4117 self.serv_conn = self.newSocket()
4118 self.addCleanup(self.serv_conn.close)
4119 # Use a thread to complete the connection, but wait for it to
4120 # terminate before running the test, so that there is only one
4121 # thread to accept the signal.
4122 cli_thread = threading.Thread(target=self.doConnect)
4123 cli_thread.start()
4124 self.cli_conn, addr = self.serv.accept()
4125 self.addCleanup(self.cli_conn.close)
4126 cli_thread.join()
4127 self.serv_conn.settimeout(self.timeout)
4128
4129 def doConnect(self):
4130 self.serv_conn.connect(self.serv_addr)
4131
4132 def checkInterruptedSend(self, func, *args, **kwargs):
4133 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004134 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004135 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004136 try:
4137 with self.assertRaises(ZeroDivisionError) as cm:
4138 while True:
4139 self.setAlarm(self.alarm_time)
4140 func(*args, **kwargs)
4141 finally:
4142 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004143
Ned Deilyc5640382014-02-03 13:58:31 -08004144 # Issue #12958: The following tests have problems on OS X prior to 10.7
4145 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004146 def testInterruptedSendTimeout(self):
4147 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4148
Ned Deilyc5640382014-02-03 13:58:31 -08004149 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004150 def testInterruptedSendtoTimeout(self):
4151 # Passing an actual address here as Python's wrapper for
4152 # sendto() doesn't allow passing a zero-length one; POSIX
4153 # requires that the address is ignored since the socket is
4154 # connection-mode, however.
4155 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4156 self.serv_addr)
4157
Ned Deilyc5640382014-02-03 13:58:31 -08004158 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004159 @requireAttrs(socket.socket, "sendmsg")
4160 def testInterruptedSendmsgTimeout(self):
4161 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4162
4163
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004164class TCPCloserTest(ThreadedTCPSocketTest):
4165
4166 def testClose(self):
4167 conn, addr = self.serv.accept()
4168 conn.close()
4169
4170 sd = self.cli
4171 read, write, err = select.select([sd], [], [], 1.0)
4172 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004173 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004174
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004175 # Calling close() many times should be safe.
4176 conn.close()
4177 conn.close()
4178
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004179 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004180 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004181 time.sleep(1.0)
4182
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004183
Dave Cole331708b2004-08-09 04:51:41 +00004184class BasicSocketPairTest(SocketPairTest):
4185
4186 def __init__(self, methodName='runTest'):
4187 SocketPairTest.__init__(self, methodName=methodName)
4188
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004189 def _check_defaults(self, sock):
4190 self.assertIsInstance(sock, socket.socket)
4191 if hasattr(socket, 'AF_UNIX'):
4192 self.assertEqual(sock.family, socket.AF_UNIX)
4193 else:
4194 self.assertEqual(sock.family, socket.AF_INET)
4195 self.assertEqual(sock.type, socket.SOCK_STREAM)
4196 self.assertEqual(sock.proto, 0)
4197
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004198 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004199 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004200
4201 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004202 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004203
Dave Cole331708b2004-08-09 04:51:41 +00004204 def testRecv(self):
4205 msg = self.serv.recv(1024)
4206 self.assertEqual(msg, MSG)
4207
4208 def _testRecv(self):
4209 self.cli.send(MSG)
4210
4211 def testSend(self):
4212 self.serv.send(MSG)
4213
4214 def _testSend(self):
4215 msg = self.cli.recv(1024)
4216 self.assertEqual(msg, MSG)
4217
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004218
Guido van Rossum24e4af82002-06-12 19:18:08 +00004219class NonBlockingTCPTests(ThreadedTCPSocketTest):
4220
4221 def __init__(self, methodName='runTest'):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004222 self.event = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004223 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4224
Victor Stinner304315d2018-11-30 13:22:44 +01004225 def assert_sock_timeout(self, sock, timeout):
4226 self.assertEqual(self.serv.gettimeout(), timeout)
4227
4228 blocking = (timeout != 0.0)
4229 self.assertEqual(sock.getblocking(), blocking)
4230
4231 if fcntl is not None:
4232 # When a Python socket has a non-zero timeout, it's switched
4233 # internally to a non-blocking mode. Later, sock.sendall(),
4234 # sock.recv(), and other socket operations use a select() call and
4235 # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
4236 # timeouts are enforced.
4237 fd_blocking = (timeout is None)
4238
4239 flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
4240 self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
4241
Guido van Rossum24e4af82002-06-12 19:18:08 +00004242 def testSetBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004243 # Test setblocking() and settimeout() methods
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004244 self.serv.setblocking(True)
Victor Stinner304315d2018-11-30 13:22:44 +01004245 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004246
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004247 self.serv.setblocking(False)
Victor Stinner304315d2018-11-30 13:22:44 +01004248 self.assert_sock_timeout(self.serv, 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004249
4250 self.serv.settimeout(None)
Victor Stinner304315d2018-11-30 13:22:44 +01004251 self.assert_sock_timeout(self.serv, None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004252
4253 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004254 self.assert_sock_timeout(self.serv, 0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004255
4256 self.serv.settimeout(10)
Victor Stinner304315d2018-11-30 13:22:44 +01004257 self.assert_sock_timeout(self.serv, 10)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004258
4259 self.serv.settimeout(0)
Victor Stinner304315d2018-11-30 13:22:44 +01004260 self.assert_sock_timeout(self.serv, 0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004261
4262 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004263 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004264
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004265 @support.cpython_only
4266 def testSetBlocking_overflow(self):
4267 # Issue 15989
4268 import _testcapi
4269 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4270 self.skipTest('needs UINT_MAX < ULONG_MAX')
Victor Stinner304315d2018-11-30 13:22:44 +01004271
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004272 self.serv.setblocking(False)
4273 self.assertEqual(self.serv.gettimeout(), 0.0)
Victor Stinner304315d2018-11-30 13:22:44 +01004274
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004275 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4276 self.assertIsNone(self.serv.gettimeout())
4277
4278 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4279
Serhiy Storchaka43767632013-11-03 21:31:38 +02004280 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4281 'test needs socket.SOCK_NONBLOCK')
4282 @support.requires_linux_version(2, 6, 28)
4283 def testInitNonBlocking(self):
Victor Stinner304315d2018-11-30 13:22:44 +01004284 # create a socket with SOCK_NONBLOCK
Serhiy Storchaka43767632013-11-03 21:31:38 +02004285 self.serv.close()
Victor Stinner304315d2018-11-30 13:22:44 +01004286 self.serv = socket.socket(socket.AF_INET,
4287 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
4288 self.assert_sock_timeout(self.serv, 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004289
4290 def _testInitNonBlocking(self):
4291 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004292
Victor Stinner304315d2018-11-30 13:22:44 +01004293 def testInheritFlagsBlocking(self):
4294 # bpo-7995: accept() on a listening socket with a timeout and the
4295 # default timeout is None, the resulting socket must be blocking.
4296 with socket_setdefaulttimeout(None):
4297 self.serv.settimeout(10)
Antoine Pitrou600232b2011-01-05 21:03:42 +00004298 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004299 self.addCleanup(conn.close)
4300 self.assertIsNone(conn.gettimeout())
Antoine Pitrou600232b2011-01-05 21:03:42 +00004301
Victor Stinner304315d2018-11-30 13:22:44 +01004302 def _testInheritFlagsBlocking(self):
Antoine Pitrou600232b2011-01-05 21:03:42 +00004303 self.cli.connect((HOST, self.port))
Victor Stinner304315d2018-11-30 13:22:44 +01004304
4305 def testInheritFlagsTimeout(self):
4306 # bpo-7995: accept() on a listening socket with a timeout and the
4307 # default timeout is None, the resulting socket must inherit
4308 # the default timeout.
4309 default_timeout = 20.0
4310 with socket_setdefaulttimeout(default_timeout):
4311 self.serv.settimeout(10)
4312 conn, addr = self.serv.accept()
4313 self.addCleanup(conn.close)
4314 self.assertEqual(conn.gettimeout(), default_timeout)
4315
4316 def _testInheritFlagsTimeout(self):
4317 self.cli.connect((HOST, self.port))
Antoine Pitrou600232b2011-01-05 21:03:42 +00004318
Guido van Rossum24e4af82002-06-12 19:18:08 +00004319 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004320 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004321 self.serv.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004322
4323 # connect() didn't start: non-blocking accept() fails
Victor Stinner304315d2018-11-30 13:22:44 +01004324 start_time = time.monotonic()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004325 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004326 conn, addr = self.serv.accept()
Victor Stinner304315d2018-11-30 13:22:44 +01004327 dt = time.monotonic() - start_time
4328 self.assertLess(dt, 1.0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004329
4330 self.event.set()
4331
4332 read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT)
4333 if self.serv not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004334 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004335
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004336 # connect() completed: non-blocking accept() doesn't block
4337 conn, addr = self.serv.accept()
4338 self.addCleanup(conn.close)
4339 self.assertIsNone(conn.gettimeout())
4340
Guido van Rossum24e4af82002-06-12 19:18:08 +00004341 def _testAccept(self):
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004342 # don't connect before event is set to check
4343 # that non-blocking accept() raises BlockingIOError
4344 self.event.wait()
4345
Christian Heimes5e696852008-04-09 08:37:03 +00004346 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004347
Guido van Rossum24e4af82002-06-12 19:18:08 +00004348 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004349 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004350 conn, addr = self.serv.accept()
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004351 self.addCleanup(conn.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004352 conn.setblocking(0)
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004353
4354 # the server didn't send data yet: non-blocking recv() fails
4355 with self.assertRaises(BlockingIOError):
Guido van Rossum24e4af82002-06-12 19:18:08 +00004356 msg = conn.recv(len(MSG))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004357
4358 self.event.set()
4359
4360 read, write, err = select.select([conn], [], [], MAIN_TIMEOUT)
4361 if conn not in read:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004362 self.fail("Error during select call to non-blocking socket.")
4363
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004364 # the server sent data yet: non-blocking recv() doesn't block
4365 msg = conn.recv(len(MSG))
4366 self.assertEqual(msg, MSG)
4367
Guido van Rossum24e4af82002-06-12 19:18:08 +00004368 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004369 self.cli.connect((HOST, self.port))
Victor Stinnerebd5d6d2018-11-30 12:29:25 +01004370
4371 # don't send anything before event is set to check
4372 # that non-blocking recv() raises BlockingIOError
4373 self.event.wait()
4374
4375 # send data: recv() will no longer block
4376 self.cli.sendall(MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004377
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004378
Guido van Rossum24e4af82002-06-12 19:18:08 +00004379class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004380 """Unit tests for the object returned by socket.makefile()
4381
Antoine Pitrou834bd812010-10-13 16:17:14 +00004382 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004383 the client connection. You can read from this file to
4384 get output from the server.
4385
Antoine Pitrou834bd812010-10-13 16:17:14 +00004386 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004387 server connection. You can write to this file to send output
4388 to the client.
4389 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004390
Guido van Rossume9f66142002-08-07 15:46:19 +00004391 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004392 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004393 errors = 'strict'
4394 newline = None
4395
4396 read_mode = 'rb'
4397 read_msg = MSG
4398 write_mode = 'wb'
4399 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004400
Guido van Rossum24e4af82002-06-12 19:18:08 +00004401 def __init__(self, methodName='runTest'):
4402 SocketConnectedTest.__init__(self, methodName=methodName)
4403
4404 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004405 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4406 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004407 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004408 self.read_file = self.cli_conn.makefile(
4409 self.read_mode, self.bufsize,
4410 encoding = self.encoding,
4411 errors = self.errors,
4412 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004413
4414 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004415 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004416 self.read_file.close()
4417 self.assertTrue(self.read_file.closed)
4418 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004419 SocketConnectedTest.tearDown(self)
4420
4421 def clientSetUp(self):
4422 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004423 self.write_file = self.serv_conn.makefile(
4424 self.write_mode, self.bufsize,
4425 encoding = self.encoding,
4426 errors = self.errors,
4427 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004428
4429 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004430 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004431 self.write_file.close()
4432 self.assertTrue(self.write_file.closed)
4433 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004434 SocketConnectedTest.clientTearDown(self)
4435
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004436 def testReadAfterTimeout(self):
4437 # Issue #7322: A file object must disallow further reads
4438 # after a timeout has occurred.
4439 self.cli_conn.settimeout(1)
4440 self.read_file.read(3)
4441 # First read raises a timeout
4442 self.assertRaises(socket.timeout, self.read_file.read, 1)
4443 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004444 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004445 self.read_file.read(1)
4446 self.assertIn("cannot read from timed out object", str(ctx.exception))
4447
4448 def _testReadAfterTimeout(self):
4449 self.write_file.write(self.write_msg[0:3])
4450 self.write_file.flush()
4451 self.serv_finished.wait()
4452
Guido van Rossum24e4af82002-06-12 19:18:08 +00004453 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004454 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004455 first_seg = self.read_file.read(len(self.read_msg)-3)
4456 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004457 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004458 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004459
4460 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004461 self.write_file.write(self.write_msg)
4462 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004463
Guido van Rossum8c943832002-08-08 01:00:28 +00004464 def testFullRead(self):
4465 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004466 msg = self.read_file.read()
4467 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004468
4469 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004470 self.write_file.write(self.write_msg)
4471 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004472
Guido van Rossum24e4af82002-06-12 19:18:08 +00004473 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004474 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004475 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004476 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004477 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004478 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004479 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004480 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004481 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004482
4483 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004484 self.write_file.write(self.write_msg)
4485 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004486
4487 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004488 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004489 line = self.read_file.readline()
4490 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004491
4492 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004493 self.write_file.write(self.write_msg)
4494 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004495
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004496 def testCloseAfterMakefile(self):
4497 # The file returned by makefile should keep the socket open.
4498 self.cli_conn.close()
4499 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004500 msg = self.read_file.read()
4501 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004502
4503 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004504 self.write_file.write(self.write_msg)
4505 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004506
4507 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004508 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004509 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004510 if isinstance(self.read_msg, str):
4511 msg = msg.decode()
4512 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004513
4514 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004515 self.write_file.write(self.write_msg)
4516 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004517
Tim Peters116d83c2004-03-28 02:20:45 +00004518 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004519 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004520
4521 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004522 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004523
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004524 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004525 self.assertEqual(self.read_file.mode, self.read_mode)
4526 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004527
4528 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004529 self.assertEqual(self.write_file.mode, self.write_mode)
4530 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004531
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004532 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004533 self.read_file.close()
4534 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004535 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004536 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004537
4538 def _testRealClose(self):
4539 pass
4540
4541
Guido van Rossume9f66142002-08-07 15:46:19 +00004542class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4543
4544 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004545
Guido van Rossume9f66142002-08-07 15:46:19 +00004546 In this case (and in this case only), it should be possible to
4547 create a file object, read a line from it, create another file
4548 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004549 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004550 when reading multiple requests from the same socket."""
4551
4552 bufsize = 0 # Use unbuffered mode
4553
4554 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004555 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004556 line = self.read_file.readline() # first line
4557 self.assertEqual(line, b"A. " + self.write_msg) # first line
4558 self.read_file = self.cli_conn.makefile('rb', 0)
4559 line = self.read_file.readline() # second line
4560 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004561
4562 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004563 self.write_file.write(b"A. " + self.write_msg)
4564 self.write_file.write(b"B. " + self.write_msg)
4565 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004566
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004567 def testMakefileClose(self):
4568 # The file returned by makefile should keep the socket open...
4569 self.cli_conn.close()
4570 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004571 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004572 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004573 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004574 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004575
4576 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004577 self.write_file.write(self.write_msg)
4578 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004579
4580 def testMakefileCloseSocketDestroy(self):
4581 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004582 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004583 refcount_after = sys.getrefcount(self.cli_conn)
4584 self.assertEqual(refcount_before - 1, refcount_after)
4585
4586 def _testMakefileCloseSocketDestroy(self):
4587 pass
4588
Antoine Pitrou98b46702010-09-18 22:59:00 +00004589 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004590 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004591 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4592
4593 def testSmallReadNonBlocking(self):
4594 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004595 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4596 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004597 self.evt1.set()
4598 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004599 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004600 if first_seg is None:
4601 # Data not arrived (can happen under Windows), wait a bit
4602 time.sleep(0.5)
4603 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004604 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004605 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004606 self.assertEqual(n, 3)
4607 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004608 self.assertEqual(msg, self.read_msg)
4609 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4610 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004611
4612 def _testSmallReadNonBlocking(self):
4613 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004614 self.write_file.write(self.write_msg)
4615 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004616 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004617 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004618 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4619 self.serv_finished.wait(5.0)
4620
4621 def testWriteNonBlocking(self):
4622 self.cli_finished.wait(5.0)
4623 # The client thread can't skip directly - the SkipTest exception
4624 # would appear as a failure.
4625 if self.serv_skipped:
4626 self.skipTest(self.serv_skipped)
4627
4628 def _testWriteNonBlocking(self):
4629 self.serv_skipped = None
4630 self.serv_conn.setblocking(False)
4631 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004632 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004633 LIMIT = 10
4634 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004635 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004636 self.assertGreater(n, 0)
4637 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004638 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004639 if n is None:
4640 # Succeeded
4641 break
4642 self.assertGreater(n, 0)
4643 else:
4644 # Let us know that this test didn't manage to establish
4645 # the expected conditions. This is not a failure in itself but,
4646 # if it happens repeatedly, the test should be fixed.
4647 self.serv_skipped = "failed to saturate the socket buffer"
4648
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004649
Guido van Rossum8c943832002-08-08 01:00:28 +00004650class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4651
4652 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4653
4654
4655class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4656
4657 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004658
Thomas Woutersb2137042007-02-01 18:02:27 +00004659
Antoine Pitrou834bd812010-10-13 16:17:14 +00004660class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4661 """Tests for socket.makefile() in text mode (rather than binary)"""
4662
4663 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004664 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004665 write_mode = 'wb'
4666 write_msg = MSG
4667 newline = ''
4668
4669
4670class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4671 """Tests for socket.makefile() in text mode (rather than binary)"""
4672
4673 read_mode = 'rb'
4674 read_msg = MSG
4675 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004676 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004677 newline = ''
4678
4679
4680class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4681 """Tests for socket.makefile() in text mode (rather than binary)"""
4682
4683 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004684 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004685 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004686 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004687 newline = ''
4688
4689
Guido van Rossumd8faa362007-04-27 19:54:29 +00004690class NetworkConnectionTest(object):
4691 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004692
Guido van Rossumd8faa362007-04-27 19:54:29 +00004693 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004694 # We're inherited below by BasicTCPTest2, which also inherits
4695 # BasicTCPTest, which defines self.port referenced below.
4696 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004697 self.serv_conn = self.cli
4698
4699class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4700 """Tests that NetworkConnection does not break existing TCP functionality.
4701 """
4702
4703class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004704
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004705 class MockSocket(socket.socket):
4706 def connect(self, *args):
4707 raise socket.timeout('timed out')
4708
4709 @contextlib.contextmanager
4710 def mocked_socket_module(self):
4711 """Return a socket which times out on connect"""
4712 old_socket = socket.socket
4713 socket.socket = self.MockSocket
4714 try:
4715 yield
4716 finally:
4717 socket.socket = old_socket
4718
4719 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004720 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004721 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004722 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004723 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004724 cli.connect((HOST, port))
4725 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4726
4727 def test_create_connection(self):
4728 # Issue #9792: errors raised by create_connection() should have
4729 # a proper errno attribute.
4730 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004731 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004732 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004733
4734 # Issue #16257: create_connection() calls getaddrinfo() against
4735 # 'localhost'. This may result in an IPV6 addr being returned
4736 # as well as an IPV4 one:
4737 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4738 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4739 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4740 #
4741 # create_connection() enumerates through all the addresses returned
4742 # and if it doesn't successfully bind to any of them, it propagates
4743 # the last exception it encountered.
4744 #
4745 # On Solaris, ENETUNREACH is returned in this circumstance instead
4746 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4747 # expected errnos.
4748 expected_errnos = [ errno.ECONNREFUSED, ]
4749 if hasattr(errno, 'ENETUNREACH'):
4750 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004751 if hasattr(errno, 'EADDRNOTAVAIL'):
4752 # bpo-31910: socket.create_connection() fails randomly
4753 # with EADDRNOTAVAIL on Travis CI
4754 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004755
4756 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004757
4758 def test_create_connection_timeout(self):
4759 # Issue #9792: create_connection() should not recast timeout errors
4760 # as generic socket errors.
4761 with self.mocked_socket_module():
4762 with self.assertRaises(socket.timeout):
4763 socket.create_connection((HOST, 1234))
4764
Guido van Rossumd8faa362007-04-27 19:54:29 +00004765
4766class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4767
4768 def __init__(self, methodName='runTest'):
4769 SocketTCPTest.__init__(self, methodName=methodName)
4770 ThreadableTest.__init__(self)
4771
4772 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004773 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004774
4775 def clientTearDown(self):
4776 self.cli.close()
4777 self.cli = None
4778 ThreadableTest.clientTearDown(self)
4779
4780 def _justAccept(self):
4781 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004782 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004783
4784 testFamily = _justAccept
4785 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004786 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004787 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004788 self.assertEqual(self.cli.family, 2)
4789
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004790 testSourceAddress = _justAccept
4791 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004792 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4793 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004794 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004795 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004796 # The port number being used is sufficient to show that the bind()
4797 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004798
Guido van Rossumd8faa362007-04-27 19:54:29 +00004799 testTimeoutDefault = _justAccept
4800 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004801 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004802 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004803 socket.setdefaulttimeout(42)
4804 try:
4805 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004806 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004807 finally:
4808 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004809 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004810
4811 testTimeoutNone = _justAccept
4812 def _testTimeoutNone(self):
4813 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004814 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004815 socket.setdefaulttimeout(30)
4816 try:
4817 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004818 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004819 finally:
4820 socket.setdefaulttimeout(None)
4821 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004822
4823 testTimeoutValueNamed = _justAccept
4824 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004825 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004826 self.assertEqual(self.cli.gettimeout(), 30)
4827
4828 testTimeoutValueNonamed = _justAccept
4829 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004830 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004831 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004832 self.assertEqual(self.cli.gettimeout(), 30)
4833
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004834
Guido van Rossumd8faa362007-04-27 19:54:29 +00004835class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4836
4837 def __init__(self, methodName='runTest'):
4838 SocketTCPTest.__init__(self, methodName=methodName)
4839 ThreadableTest.__init__(self)
4840
4841 def clientSetUp(self):
4842 pass
4843
4844 def clientTearDown(self):
4845 self.cli.close()
4846 self.cli = None
4847 ThreadableTest.clientTearDown(self)
4848
4849 def testInsideTimeout(self):
4850 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004851 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004852 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004853 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004854 testOutsideTimeout = testInsideTimeout
4855
4856 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004857 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004858 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004859 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004860
4861 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004862 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004863 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004864
4865
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004866class TCPTimeoutTest(SocketTCPTest):
4867
4868 def testTCPTimeout(self):
4869 def raise_timeout(*args, **kwargs):
4870 self.serv.settimeout(1.0)
4871 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004872 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004873 "Error generating a timeout exception (TCP)")
4874
4875 def testTimeoutZero(self):
4876 ok = False
4877 try:
4878 self.serv.settimeout(0.0)
4879 foo = self.serv.accept()
4880 except socket.timeout:
4881 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004882 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004883 ok = True
4884 except:
4885 self.fail("caught unexpected exception (TCP)")
4886 if not ok:
4887 self.fail("accept() returned success when we did not expect it")
4888
Serhiy Storchaka43767632013-11-03 21:31:38 +02004889 @unittest.skipUnless(hasattr(signal, 'alarm'),
4890 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004891 def testInterruptedTimeout(self):
4892 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004893 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004894 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004895 self.serv.settimeout(5.0) # must be longer than alarm
4896 class Alarm(Exception):
4897 pass
4898 def alarm_handler(signal, frame):
4899 raise Alarm
4900 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4901 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004902 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004903 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004904 foo = self.serv.accept()
4905 except socket.timeout:
4906 self.fail("caught timeout instead of Alarm")
4907 except Alarm:
4908 pass
4909 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004910 self.fail("caught other exception instead of Alarm:"
4911 " %s(%s):\n%s" %
4912 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004913 else:
4914 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004915 finally:
4916 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004917 except Alarm:
4918 self.fail("got Alarm in wrong place")
4919 finally:
4920 # no alarm can be pending. Safe to restore old handler.
4921 signal.signal(signal.SIGALRM, old_alarm)
4922
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004923class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004924
4925 def testUDPTimeout(self):
4926 def raise_timeout(*args, **kwargs):
4927 self.serv.settimeout(1.0)
4928 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004929 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004930 "Error generating a timeout exception (UDP)")
4931
4932 def testTimeoutZero(self):
4933 ok = False
4934 try:
4935 self.serv.settimeout(0.0)
4936 foo = self.serv.recv(1024)
4937 except socket.timeout:
4938 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004939 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004940 ok = True
4941 except:
4942 self.fail("caught unexpected exception (UDP)")
4943 if not ok:
4944 self.fail("recv() returned success when we did not expect it")
4945
4946class TestExceptions(unittest.TestCase):
4947
4948 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004949 self.assertTrue(issubclass(OSError, Exception))
4950 self.assertTrue(issubclass(socket.herror, OSError))
4951 self.assertTrue(issubclass(socket.gaierror, OSError))
4952 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004953
Yury Selivanovfa22b292016-10-18 16:03:52 -04004954 def test_setblocking_invalidfd(self):
4955 # Regression test for issue #28471
4956
4957 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4958 sock = socket.socket(
4959 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4960 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004961 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004962
4963 with self.assertRaises(OSError):
4964 sock.setblocking(False)
4965
4966
Serhiy Storchaka43767632013-11-03 21:31:38 +02004967@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004968class TestLinuxAbstractNamespace(unittest.TestCase):
4969
4970 UNIX_PATH_MAX = 108
4971
4972 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004973 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004974 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4975 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004976 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004977 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4978 s2.connect(s1.getsockname())
4979 with s1.accept()[0] as s3:
4980 self.assertEqual(s1.getsockname(), address)
4981 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004982
4983 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004984 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004985 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4986 s.bind(address)
4987 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004988
4989 def testNameOverflow(self):
4990 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004991 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004992 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004993
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004994 def testStrName(self):
4995 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004996 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4997 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004998 s.bind("\x00python\x00test\x00")
4999 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005000 finally:
5001 s.close()
5002
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005003 def testBytearrayName(self):
5004 # Check that an abstract name can be passed as a bytearray.
5005 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5006 s.bind(bytearray(b"\x00python\x00test\x00"))
5007 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5008
Serhiy Storchaka43767632013-11-03 21:31:38 +02005009@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005010class TestUnixDomain(unittest.TestCase):
5011
5012 def setUp(self):
5013 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5014
5015 def tearDown(self):
5016 self.sock.close()
5017
5018 def encoded(self, path):
5019 # Return the given path encoded in the file system encoding,
5020 # or skip the test if this is not possible.
5021 try:
5022 return os.fsencode(path)
5023 except UnicodeEncodeError:
5024 self.skipTest(
5025 "Pathname {0!a} cannot be represented in file "
5026 "system encoding {1!r}".format(
5027 path, sys.getfilesystemencoding()))
5028
Antoine Pitrou16374872011-12-16 15:04:12 +01005029 def bind(self, sock, path):
5030 # Bind the socket
5031 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005032 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005033 except OSError as e:
5034 if str(e) == "AF_UNIX path too long":
5035 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005036 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005037 .format(path))
5038 else:
5039 raise
5040
Antoine Pitrou495b5022017-05-02 17:20:00 +02005041 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005042 # Issue #30205 (note getsockname() can return None on OS X)
5043 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005044
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005045 def testStrAddr(self):
5046 # Test binding to and retrieving a normal string pathname.
5047 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005048 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005049 self.addCleanup(support.unlink, path)
5050 self.assertEqual(self.sock.getsockname(), path)
5051
5052 def testBytesAddr(self):
5053 # Test binding to a bytes pathname.
5054 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005055 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005056 self.addCleanup(support.unlink, path)
5057 self.assertEqual(self.sock.getsockname(), path)
5058
5059 def testSurrogateescapeBind(self):
5060 # Test binding to a valid non-ASCII pathname, with the
5061 # non-ASCII bytes supplied using surrogateescape encoding.
5062 path = os.path.abspath(support.TESTFN_UNICODE)
5063 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005064 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005065 self.addCleanup(support.unlink, path)
5066 self.assertEqual(self.sock.getsockname(), path)
5067
5068 def testUnencodableAddr(self):
5069 # Test binding to a pathname that cannot be encoded in the
5070 # file system encoding.
5071 if support.TESTFN_UNENCODABLE is None:
5072 self.skipTest("No unencodable filename available")
5073 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005074 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005075 self.addCleanup(support.unlink, path)
5076 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005077
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005078
Thomas Wouters477c8d52006-05-27 19:21:47 +00005079class BufferIOTest(SocketConnectedTest):
5080 """
5081 Test the buffer versions of socket.recv() and socket.send().
5082 """
5083 def __init__(self, methodName='runTest'):
5084 SocketConnectedTest.__init__(self, methodName=methodName)
5085
Antoine Pitrou25480782010-03-17 22:50:28 +00005086 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005087 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005088 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005089 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005090 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005091 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005092 self.assertEqual(msg, MSG)
5093
Antoine Pitrou25480782010-03-17 22:50:28 +00005094 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005095 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005096 self.serv_conn.send(buf)
5097
Antoine Pitrou25480782010-03-17 22:50:28 +00005098 def testRecvIntoBytearray(self):
5099 buf = bytearray(1024)
5100 nbytes = self.cli_conn.recv_into(buf)
5101 self.assertEqual(nbytes, len(MSG))
5102 msg = buf[:len(MSG)]
5103 self.assertEqual(msg, MSG)
5104
5105 _testRecvIntoBytearray = _testRecvIntoArray
5106
5107 def testRecvIntoMemoryview(self):
5108 buf = bytearray(1024)
5109 nbytes = self.cli_conn.recv_into(memoryview(buf))
5110 self.assertEqual(nbytes, len(MSG))
5111 msg = buf[:len(MSG)]
5112 self.assertEqual(msg, MSG)
5113
5114 _testRecvIntoMemoryview = _testRecvIntoArray
5115
5116 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005117 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005118 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005119 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005120 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005121 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005122 self.assertEqual(msg, MSG)
5123
Antoine Pitrou25480782010-03-17 22:50:28 +00005124 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005125 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005126 self.serv_conn.send(buf)
5127
Antoine Pitrou25480782010-03-17 22:50:28 +00005128 def testRecvFromIntoBytearray(self):
5129 buf = bytearray(1024)
5130 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5131 self.assertEqual(nbytes, len(MSG))
5132 msg = buf[:len(MSG)]
5133 self.assertEqual(msg, MSG)
5134
5135 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5136
5137 def testRecvFromIntoMemoryview(self):
5138 buf = bytearray(1024)
5139 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5140 self.assertEqual(nbytes, len(MSG))
5141 msg = buf[:len(MSG)]
5142 self.assertEqual(msg, MSG)
5143
5144 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5145
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005146 def testRecvFromIntoSmallBuffer(self):
5147 # See issue #20246.
5148 buf = bytearray(8)
5149 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5150
5151 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005152 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005153
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005154 def testRecvFromIntoEmptyBuffer(self):
5155 buf = bytearray()
5156 self.cli_conn.recvfrom_into(buf)
5157 self.cli_conn.recvfrom_into(buf, 0)
5158
5159 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5160
Christian Heimes043d6f62008-01-07 17:19:16 +00005161
5162TIPC_STYPE = 2000
5163TIPC_LOWER = 200
5164TIPC_UPPER = 210
5165
5166def isTipcAvailable():
5167 """Check if the TIPC module is loaded
5168
5169 The TIPC module is not loaded automatically on Ubuntu and probably
5170 other Linux distros.
5171 """
5172 if not hasattr(socket, "AF_TIPC"):
5173 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005174 try:
5175 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005176 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005177 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005178 # have not the permission to read it.
5179 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005180 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005181 for line in f:
5182 if line.startswith("tipc "):
5183 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005184 return False
5185
Serhiy Storchaka43767632013-11-03 21:31:38 +02005186@unittest.skipUnless(isTipcAvailable(),
5187 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005188class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005189 def testRDM(self):
5190 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5191 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005192 self.addCleanup(srv.close)
5193 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005194
5195 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5196 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5197 TIPC_LOWER, TIPC_UPPER)
5198 srv.bind(srvaddr)
5199
5200 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5201 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5202 cli.sendto(MSG, sendaddr)
5203
5204 msg, recvaddr = srv.recvfrom(1024)
5205
5206 self.assertEqual(cli.getsockname(), recvaddr)
5207 self.assertEqual(msg, MSG)
5208
5209
Serhiy Storchaka43767632013-11-03 21:31:38 +02005210@unittest.skipUnless(isTipcAvailable(),
5211 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005212class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005213 def __init__(self, methodName = 'runTest'):
5214 unittest.TestCase.__init__(self, methodName = methodName)
5215 ThreadableTest.__init__(self)
5216
5217 def setUp(self):
5218 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005219 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005220 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5221 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5222 TIPC_LOWER, TIPC_UPPER)
5223 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005224 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005225 self.serverExplicitReady()
5226 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005227 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005228
5229 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005230 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005231 # accept() call; sleep a little while to avoid it, otherwise
5232 # we could get an exception
5233 time.sleep(0.1)
5234 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005235 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005236 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5237 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5238 self.cli.connect(addr)
5239 self.cliaddr = self.cli.getsockname()
5240
5241 def testStream(self):
5242 msg = self.conn.recv(1024)
5243 self.assertEqual(msg, MSG)
5244 self.assertEqual(self.cliaddr, self.connaddr)
5245
5246 def _testStream(self):
5247 self.cli.send(MSG)
5248 self.cli.close()
5249
5250
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005251class ContextManagersTest(ThreadedTCPSocketTest):
5252
5253 def _testSocketClass(self):
5254 # base test
5255 with socket.socket() as sock:
5256 self.assertFalse(sock._closed)
5257 self.assertTrue(sock._closed)
5258 # close inside with block
5259 with socket.socket() as sock:
5260 sock.close()
5261 self.assertTrue(sock._closed)
5262 # exception inside with block
5263 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005264 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005265 self.assertTrue(sock._closed)
5266
5267 def testCreateConnectionBase(self):
5268 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005269 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005270 data = conn.recv(1024)
5271 conn.sendall(data)
5272
5273 def _testCreateConnectionBase(self):
5274 address = self.serv.getsockname()
5275 with socket.create_connection(address) as sock:
5276 self.assertFalse(sock._closed)
5277 sock.sendall(b'foo')
5278 self.assertEqual(sock.recv(1024), b'foo')
5279 self.assertTrue(sock._closed)
5280
5281 def testCreateConnectionClose(self):
5282 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005283 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005284 data = conn.recv(1024)
5285 conn.sendall(data)
5286
5287 def _testCreateConnectionClose(self):
5288 address = self.serv.getsockname()
5289 with socket.create_connection(address) as sock:
5290 sock.close()
5291 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005292 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005293
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005294
Victor Stinnerdaf45552013-08-28 00:53:59 +02005295class InheritanceTest(unittest.TestCase):
5296 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5297 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005298 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005299 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005300 with socket.socket(socket.AF_INET,
5301 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005302 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005303 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005304
5305 def test_default_inheritable(self):
5306 sock = socket.socket()
5307 with sock:
5308 self.assertEqual(sock.get_inheritable(), False)
5309
5310 def test_dup(self):
5311 sock = socket.socket()
5312 with sock:
5313 newsock = sock.dup()
5314 sock.close()
5315 with newsock:
5316 self.assertEqual(newsock.get_inheritable(), False)
5317
5318 def test_set_inheritable(self):
5319 sock = socket.socket()
5320 with sock:
5321 sock.set_inheritable(True)
5322 self.assertEqual(sock.get_inheritable(), True)
5323
5324 sock.set_inheritable(False)
5325 self.assertEqual(sock.get_inheritable(), False)
5326
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005327 @unittest.skipIf(fcntl is None, "need fcntl")
5328 def test_get_inheritable_cloexec(self):
5329 sock = socket.socket()
5330 with sock:
5331 fd = sock.fileno()
5332 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005333
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005334 # clear FD_CLOEXEC flag
5335 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5336 flags &= ~fcntl.FD_CLOEXEC
5337 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005338
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005339 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005340
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005341 @unittest.skipIf(fcntl is None, "need fcntl")
5342 def test_set_inheritable_cloexec(self):
5343 sock = socket.socket()
5344 with sock:
5345 fd = sock.fileno()
5346 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5347 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005348
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005349 sock.set_inheritable(True)
5350 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5351 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005352
5353
Victor Stinnerdaf45552013-08-28 00:53:59 +02005354 def test_socketpair(self):
5355 s1, s2 = socket.socketpair()
5356 self.addCleanup(s1.close)
5357 self.addCleanup(s2.close)
5358 self.assertEqual(s1.get_inheritable(), False)
5359 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005360
5361
5362@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5363 "SOCK_NONBLOCK not defined")
5364class NonblockConstantTest(unittest.TestCase):
5365 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5366 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005367 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005368 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005369 self.assertTrue(
5370 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005371 if timeout == 0:
5372 # timeout == 0: means that getblocking() must be False.
5373 self.assertFalse(s.getblocking())
5374 else:
5375 # If timeout > 0, the socket will be in a "blocking" mode
5376 # from the standpoint of the Python API. For Python socket
5377 # object, "blocking" means that operations like 'sock.recv()'
5378 # will block. Internally, file descriptors for
5379 # "blocking" Python sockets *with timeouts* are in a
5380 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5381 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5382 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005383 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005384 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005385 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005386 self.assertFalse(
5387 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005388 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005389
Charles-François Natali239bb962011-06-03 12:55:15 +02005390 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005391 def test_SOCK_NONBLOCK(self):
5392 # a lot of it seems silly and redundant, but I wanted to test that
5393 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005394 with socket.socket(socket.AF_INET,
5395 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5396 self.checkNonblock(s)
5397 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005398 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005399 s.setblocking(0)
5400 self.checkNonblock(s)
5401 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005402 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005403 s.settimeout(2.0)
5404 self.checkNonblock(s, timeout=2.0)
5405 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005406 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005407 # defaulttimeout
5408 t = socket.getdefaulttimeout()
5409 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005410 with socket.socket() as s:
5411 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005412 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005413 with socket.socket() as s:
5414 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005415 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005416 with socket.socket() as s:
5417 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005418 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005419 with socket.socket() as s:
5420 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005421 socket.setdefaulttimeout(t)
5422
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005423
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005424@unittest.skipUnless(os.name == "nt", "Windows specific")
5425@unittest.skipUnless(multiprocessing, "need multiprocessing")
5426class TestSocketSharing(SocketTCPTest):
5427 # This must be classmethod and not staticmethod or multiprocessing
5428 # won't be able to bootstrap it.
5429 @classmethod
5430 def remoteProcessServer(cls, q):
5431 # Recreate socket from shared data
5432 sdata = q.get()
5433 message = q.get()
5434
5435 s = socket.fromshare(sdata)
5436 s2, c = s.accept()
5437
5438 # Send the message
5439 s2.sendall(message)
5440 s2.close()
5441 s.close()
5442
5443 def testShare(self):
5444 # Transfer the listening server socket to another process
5445 # and service it from there.
5446
5447 # Create process:
5448 q = multiprocessing.Queue()
5449 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5450 p.start()
5451
5452 # Get the shared socket data
5453 data = self.serv.share(p.pid)
5454
5455 # Pass the shared socket to the other process
5456 addr = self.serv.getsockname()
5457 self.serv.close()
5458 q.put(data)
5459
5460 # The data that the server will send us
5461 message = b"slapmahfro"
5462 q.put(message)
5463
5464 # Connect
5465 s = socket.create_connection(addr)
5466 # listen for the data
5467 m = []
5468 while True:
5469 data = s.recv(100)
5470 if not data:
5471 break
5472 m.append(data)
5473 s.close()
5474 received = b"".join(m)
5475 self.assertEqual(received, message)
5476 p.join()
5477
5478 def testShareLength(self):
5479 data = self.serv.share(os.getpid())
5480 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5481 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5482
5483 def compareSockets(self, org, other):
5484 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005485 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005486 self.assertEqual(org.gettimeout(), None)
5487 self.assertEqual(org.gettimeout(), other.gettimeout())
5488
5489 self.assertEqual(org.family, other.family)
5490 self.assertEqual(org.type, other.type)
5491 # If the user specified "0" for proto, then
5492 # internally windows will have picked the correct value.
5493 # Python introspection on the socket however will still return
5494 # 0. For the shared socket, the python value is recreated
5495 # from the actual value, so it may not compare correctly.
5496 if org.proto != 0:
5497 self.assertEqual(org.proto, other.proto)
5498
5499 def testShareLocal(self):
5500 data = self.serv.share(os.getpid())
5501 s = socket.fromshare(data)
5502 try:
5503 self.compareSockets(self.serv, s)
5504 finally:
5505 s.close()
5506
5507 def testTypes(self):
5508 families = [socket.AF_INET, socket.AF_INET6]
5509 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5510 for f in families:
5511 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005512 try:
5513 source = socket.socket(f, t)
5514 except OSError:
5515 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005516 try:
5517 data = source.share(os.getpid())
5518 shared = socket.fromshare(data)
5519 try:
5520 self.compareSockets(source, shared)
5521 finally:
5522 shared.close()
5523 finally:
5524 source.close()
5525
5526
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005527class SendfileUsingSendTest(ThreadedTCPSocketTest):
5528 """
5529 Test the send() implementation of socket.sendfile().
5530 """
5531
Victor Stinner8c663fd2017-11-08 14:44:44 -08005532 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005533 BUFSIZE = 8192
5534 FILEDATA = b""
5535 TIMEOUT = 2
5536
5537 @classmethod
5538 def setUpClass(cls):
5539 def chunks(total, step):
5540 assert total >= step
5541 while total > step:
5542 yield step
5543 total -= step
5544 if total:
5545 yield total
5546
5547 chunk = b"".join([random.choice(string.ascii_letters).encode()
5548 for i in range(cls.BUFSIZE)])
5549 with open(support.TESTFN, 'wb') as f:
5550 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5551 f.write(chunk)
5552 with open(support.TESTFN, 'rb') as f:
5553 cls.FILEDATA = f.read()
5554 assert len(cls.FILEDATA) == cls.FILESIZE
5555
5556 @classmethod
5557 def tearDownClass(cls):
5558 support.unlink(support.TESTFN)
5559
5560 def accept_conn(self):
5561 self.serv.settimeout(self.TIMEOUT)
5562 conn, addr = self.serv.accept()
5563 conn.settimeout(self.TIMEOUT)
5564 self.addCleanup(conn.close)
5565 return conn
5566
5567 def recv_data(self, conn):
5568 received = []
5569 while True:
5570 chunk = conn.recv(self.BUFSIZE)
5571 if not chunk:
5572 break
5573 received.append(chunk)
5574 return b''.join(received)
5575
5576 def meth_from_sock(self, sock):
5577 # Depending on the mixin class being run return either send()
5578 # or sendfile() method implementation.
5579 return getattr(sock, "_sendfile_use_send")
5580
5581 # regular file
5582
5583 def _testRegularFile(self):
5584 address = self.serv.getsockname()
5585 file = open(support.TESTFN, 'rb')
5586 with socket.create_connection(address) as sock, file as file:
5587 meth = self.meth_from_sock(sock)
5588 sent = meth(file)
5589 self.assertEqual(sent, self.FILESIZE)
5590 self.assertEqual(file.tell(), self.FILESIZE)
5591
5592 def testRegularFile(self):
5593 conn = self.accept_conn()
5594 data = self.recv_data(conn)
5595 self.assertEqual(len(data), self.FILESIZE)
5596 self.assertEqual(data, self.FILEDATA)
5597
5598 # non regular file
5599
5600 def _testNonRegularFile(self):
5601 address = self.serv.getsockname()
5602 file = io.BytesIO(self.FILEDATA)
5603 with socket.create_connection(address) as sock, file as file:
5604 sent = sock.sendfile(file)
5605 self.assertEqual(sent, self.FILESIZE)
5606 self.assertEqual(file.tell(), self.FILESIZE)
5607 self.assertRaises(socket._GiveupOnSendfile,
5608 sock._sendfile_use_sendfile, file)
5609
5610 def testNonRegularFile(self):
5611 conn = self.accept_conn()
5612 data = self.recv_data(conn)
5613 self.assertEqual(len(data), self.FILESIZE)
5614 self.assertEqual(data, self.FILEDATA)
5615
5616 # empty file
5617
5618 def _testEmptyFileSend(self):
5619 address = self.serv.getsockname()
5620 filename = support.TESTFN + "2"
5621 with open(filename, 'wb'):
5622 self.addCleanup(support.unlink, filename)
5623 file = open(filename, 'rb')
5624 with socket.create_connection(address) as sock, file as file:
5625 meth = self.meth_from_sock(sock)
5626 sent = meth(file)
5627 self.assertEqual(sent, 0)
5628 self.assertEqual(file.tell(), 0)
5629
5630 def testEmptyFileSend(self):
5631 conn = self.accept_conn()
5632 data = self.recv_data(conn)
5633 self.assertEqual(data, b"")
5634
5635 # offset
5636
5637 def _testOffset(self):
5638 address = self.serv.getsockname()
5639 file = open(support.TESTFN, 'rb')
5640 with socket.create_connection(address) as sock, file as file:
5641 meth = self.meth_from_sock(sock)
5642 sent = meth(file, offset=5000)
5643 self.assertEqual(sent, self.FILESIZE - 5000)
5644 self.assertEqual(file.tell(), self.FILESIZE)
5645
5646 def testOffset(self):
5647 conn = self.accept_conn()
5648 data = self.recv_data(conn)
5649 self.assertEqual(len(data), self.FILESIZE - 5000)
5650 self.assertEqual(data, self.FILEDATA[5000:])
5651
5652 # count
5653
5654 def _testCount(self):
5655 address = self.serv.getsockname()
5656 file = open(support.TESTFN, 'rb')
5657 with socket.create_connection(address, timeout=2) as sock, file as file:
5658 count = 5000007
5659 meth = self.meth_from_sock(sock)
5660 sent = meth(file, count=count)
5661 self.assertEqual(sent, count)
5662 self.assertEqual(file.tell(), count)
5663
5664 def testCount(self):
5665 count = 5000007
5666 conn = self.accept_conn()
5667 data = self.recv_data(conn)
5668 self.assertEqual(len(data), count)
5669 self.assertEqual(data, self.FILEDATA[:count])
5670
5671 # count small
5672
5673 def _testCountSmall(self):
5674 address = self.serv.getsockname()
5675 file = open(support.TESTFN, 'rb')
5676 with socket.create_connection(address, timeout=2) as sock, file as file:
5677 count = 1
5678 meth = self.meth_from_sock(sock)
5679 sent = meth(file, count=count)
5680 self.assertEqual(sent, count)
5681 self.assertEqual(file.tell(), count)
5682
5683 def testCountSmall(self):
5684 count = 1
5685 conn = self.accept_conn()
5686 data = self.recv_data(conn)
5687 self.assertEqual(len(data), count)
5688 self.assertEqual(data, self.FILEDATA[:count])
5689
5690 # count + offset
5691
5692 def _testCountWithOffset(self):
5693 address = self.serv.getsockname()
5694 file = open(support.TESTFN, 'rb')
5695 with socket.create_connection(address, timeout=2) as sock, file as file:
5696 count = 100007
5697 meth = self.meth_from_sock(sock)
5698 sent = meth(file, offset=2007, count=count)
5699 self.assertEqual(sent, count)
5700 self.assertEqual(file.tell(), count + 2007)
5701
5702 def testCountWithOffset(self):
5703 count = 100007
5704 conn = self.accept_conn()
5705 data = self.recv_data(conn)
5706 self.assertEqual(len(data), count)
5707 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5708
5709 # non blocking sockets are not supposed to work
5710
5711 def _testNonBlocking(self):
5712 address = self.serv.getsockname()
5713 file = open(support.TESTFN, 'rb')
5714 with socket.create_connection(address) as sock, file as file:
5715 sock.setblocking(False)
5716 meth = self.meth_from_sock(sock)
5717 self.assertRaises(ValueError, meth, file)
5718 self.assertRaises(ValueError, sock.sendfile, file)
5719
5720 def testNonBlocking(self):
5721 conn = self.accept_conn()
5722 if conn.recv(8192):
5723 self.fail('was not supposed to receive any data')
5724
5725 # timeout (non-triggered)
5726
5727 def _testWithTimeout(self):
5728 address = self.serv.getsockname()
5729 file = open(support.TESTFN, 'rb')
5730 with socket.create_connection(address, timeout=2) as sock, file as file:
5731 meth = self.meth_from_sock(sock)
5732 sent = meth(file)
5733 self.assertEqual(sent, self.FILESIZE)
5734
5735 def testWithTimeout(self):
5736 conn = self.accept_conn()
5737 data = self.recv_data(conn)
5738 self.assertEqual(len(data), self.FILESIZE)
5739 self.assertEqual(data, self.FILEDATA)
5740
5741 # timeout (triggered)
5742
5743 def _testWithTimeoutTriggeredSend(self):
5744 address = self.serv.getsockname()
5745 file = open(support.TESTFN, 'rb')
5746 with socket.create_connection(address, timeout=0.01) as sock, \
5747 file as file:
5748 meth = self.meth_from_sock(sock)
5749 self.assertRaises(socket.timeout, meth, file)
5750
5751 def testWithTimeoutTriggeredSend(self):
5752 conn = self.accept_conn()
5753 conn.recv(88192)
5754
5755 # errors
5756
5757 def _test_errors(self):
5758 pass
5759
5760 def test_errors(self):
5761 with open(support.TESTFN, 'rb') as file:
5762 with socket.socket(type=socket.SOCK_DGRAM) as s:
5763 meth = self.meth_from_sock(s)
5764 self.assertRaisesRegex(
5765 ValueError, "SOCK_STREAM", meth, file)
5766 with open(support.TESTFN, 'rt') as file:
5767 with socket.socket() as s:
5768 meth = self.meth_from_sock(s)
5769 self.assertRaisesRegex(
5770 ValueError, "binary mode", meth, file)
5771 with open(support.TESTFN, 'rb') as file:
5772 with socket.socket() as s:
5773 meth = self.meth_from_sock(s)
5774 self.assertRaisesRegex(TypeError, "positive integer",
5775 meth, file, count='2')
5776 self.assertRaisesRegex(TypeError, "positive integer",
5777 meth, file, count=0.1)
5778 self.assertRaisesRegex(ValueError, "positive integer",
5779 meth, file, count=0)
5780 self.assertRaisesRegex(ValueError, "positive integer",
5781 meth, file, count=-1)
5782
5783
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005784@unittest.skipUnless(hasattr(os, "sendfile"),
5785 'os.sendfile() required for this test.')
5786class SendfileUsingSendfileTest(SendfileUsingSendTest):
5787 """
5788 Test the sendfile() implementation of socket.sendfile().
5789 """
5790 def meth_from_sock(self, sock):
5791 return getattr(sock, "_sendfile_use_sendfile")
5792
Christian Heimes48371412016-09-06 00:37:46 +02005793
5794@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005795class LinuxKernelCryptoAPI(unittest.TestCase):
5796 # tests for AF_ALG
5797 def create_alg(self, typ, name):
5798 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005799 try:
5800 sock.bind((typ, name))
5801 except FileNotFoundError as e:
5802 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005803 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005804 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005805 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005806 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005807
Victor Stinner86afc1f2017-11-30 13:58:43 +01005808 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5809 # at least on ppc64le architecture
5810 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005811 def test_sha256(self):
5812 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5813 "177a9cb410ff61f20015ad")
5814 with self.create_alg('hash', 'sha256') as algo:
5815 op, _ = algo.accept()
5816 with op:
5817 op.sendall(b"abc")
5818 self.assertEqual(op.recv(512), expected)
5819
5820 op, _ = algo.accept()
5821 with op:
5822 op.send(b'a', socket.MSG_MORE)
5823 op.send(b'b', socket.MSG_MORE)
5824 op.send(b'c', socket.MSG_MORE)
5825 op.send(b'')
5826 self.assertEqual(op.recv(512), expected)
5827
5828 def test_hmac_sha1(self):
5829 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5830 with self.create_alg('hash', 'hmac(sha1)') as algo:
5831 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5832 op, _ = algo.accept()
5833 with op:
5834 op.sendall(b"what do ya want for nothing?")
5835 self.assertEqual(op.recv(512), expected)
5836
Christian Heimese084f842016-09-11 20:11:30 +02005837 # Although it should work with 3.19 and newer the test blocks on
5838 # Ubuntu 15.10 with Kernel 4.2.0-19.
5839 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005840 def test_aes_cbc(self):
5841 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5842 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5843 msg = b"Single block msg"
5844 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5845 msglen = len(msg)
5846 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5847 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5848 op, _ = algo.accept()
5849 with op:
5850 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5851 flags=socket.MSG_MORE)
5852 op.sendall(msg)
5853 self.assertEqual(op.recv(msglen), ciphertext)
5854
5855 op, _ = algo.accept()
5856 with op:
5857 op.sendmsg_afalg([ciphertext],
5858 op=socket.ALG_OP_DECRYPT, iv=iv)
5859 self.assertEqual(op.recv(msglen), msg)
5860
5861 # long message
5862 multiplier = 1024
5863 longmsg = [msg] * multiplier
5864 op, _ = algo.accept()
5865 with op:
5866 op.sendmsg_afalg(longmsg,
5867 op=socket.ALG_OP_ENCRYPT, iv=iv)
5868 enc = op.recv(msglen * multiplier)
5869 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05005870 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005871
5872 op, _ = algo.accept()
5873 with op:
5874 op.sendmsg_afalg([enc],
5875 op=socket.ALG_OP_DECRYPT, iv=iv)
5876 dec = op.recv(msglen * multiplier)
5877 self.assertEqual(len(dec), msglen * multiplier)
5878 self.assertEqual(dec, msg * multiplier)
5879
matejcik9764c152017-02-16 14:41:31 +01005880 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005881 def test_aead_aes_gcm(self):
5882 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5883 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5884 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5885 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5886 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5887 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5888
5889 taglen = len(expected_tag)
5890 assoclen = len(assoc)
5891
5892 with self.create_alg('aead', 'gcm(aes)') as algo:
5893 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5894 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5895 None, taglen)
5896
5897 # send assoc, plain and tag buffer in separate steps
5898 op, _ = algo.accept()
5899 with op:
5900 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5901 assoclen=assoclen, flags=socket.MSG_MORE)
5902 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005903 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005904 res = op.recv(assoclen + len(plain) + taglen)
5905 self.assertEqual(expected_ct, res[assoclen:-taglen])
5906 self.assertEqual(expected_tag, res[-taglen:])
5907
5908 # now with msg
5909 op, _ = algo.accept()
5910 with op:
matejcik9764c152017-02-16 14:41:31 +01005911 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005912 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5913 assoclen=assoclen)
5914 res = op.recv(assoclen + len(plain) + taglen)
5915 self.assertEqual(expected_ct, res[assoclen:-taglen])
5916 self.assertEqual(expected_tag, res[-taglen:])
5917
5918 # create anc data manually
5919 pack_uint32 = struct.Struct('I').pack
5920 op, _ = algo.accept()
5921 with op:
matejcik9764c152017-02-16 14:41:31 +01005922 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005923 op.sendmsg(
5924 [msg],
5925 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5926 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5927 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5928 )
5929 )
matejcik9764c152017-02-16 14:41:31 +01005930 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005931 self.assertEqual(expected_ct, res[assoclen:-taglen])
5932 self.assertEqual(expected_tag, res[-taglen:])
5933
5934 # decrypt and verify
5935 op, _ = algo.accept()
5936 with op:
5937 msg = assoc + expected_ct + expected_tag
5938 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5939 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005940 res = op.recv(len(msg) - taglen)
5941 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005942
Christian Heimese084f842016-09-11 20:11:30 +02005943 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005944 def test_drbg_pr_sha256(self):
5945 # deterministic random bit generator, prediction resistance, sha256
5946 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5947 extra_seed = os.urandom(32)
5948 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5949 op, _ = algo.accept()
5950 with op:
5951 rn = op.recv(32)
5952 self.assertEqual(len(rn), 32)
5953
5954 def test_sendmsg_afalg_args(self):
5955 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005956 with sock:
5957 with self.assertRaises(TypeError):
5958 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005959
Christian Heimes02b30352016-09-11 19:49:56 +02005960 with self.assertRaises(TypeError):
5961 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005962
Christian Heimes02b30352016-09-11 19:49:56 +02005963 with self.assertRaises(TypeError):
5964 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005965
Christian Heimes02b30352016-09-11 19:49:56 +02005966 with self.assertRaises(TypeError):
5967 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005968
Christian Heimes02b30352016-09-11 19:49:56 +02005969 with self.assertRaises(TypeError):
5970 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5971
Christian Heimes2eb6ad82018-12-10 11:22:37 +01005972 def test_length_restriction(self):
5973 # bpo-35050, off-by-one error in length check
5974 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
5975 self.addCleanup(sock.close)
5976
5977 # salg_type[14]
5978 with self.assertRaises(FileNotFoundError):
5979 sock.bind(("t" * 13, "name"))
5980 with self.assertRaisesRegex(ValueError, "type too long"):
5981 sock.bind(("t" * 14, "name"))
5982
5983 # salg_name[64]
5984 with self.assertRaises(FileNotFoundError):
5985 sock.bind(("type", "n" * 63))
5986 with self.assertRaisesRegex(ValueError, "name too long"):
5987 sock.bind(("type", "n" * 64))
5988
5989
animalize19e7d482018-02-27 02:10:36 +08005990@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
5991class TestMSWindowsTCPFlags(unittest.TestCase):
5992 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03005993 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08005994 'TCP_MAXSEG',
5995 'TCP_NODELAY',
5996 # available starting with Windows 10 1607
5997 'TCP_FASTOPEN',
5998 # available starting with Windows 10 1703
5999 'TCP_KEEPCNT',
6000 # available starting with Windows 10 1709
6001 'TCP_KEEPIDLE',
6002 'TCP_KEEPINTVL'
6003 }
6004
6005 def test_new_tcp_flags(self):
6006 provided = [s for s in dir(socket) if s.startswith('TCP')]
6007 unknown = [s for s in provided if s not in self.knownTCPFlags]
6008
6009 self.assertEqual([], unknown,
6010 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006011
Guido van Rossumb995eb72002-07-31 16:08:40 +00006012def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006013 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00006014 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00006015
6016 tests.extend([
6017 NonBlockingTCPTests,
6018 FileObjectClassTestCase,
6019 UnbufferedFileObjectClassTestCase,
6020 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006021 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006022 UnicodeReadFileObjectClassTestCase,
6023 UnicodeWriteFileObjectClassTestCase,
6024 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006025 NetworkConnectionNoServer,
6026 NetworkConnectionAttributesTest,
6027 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006028 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006029 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006030 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006031 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006032 tests.append(BasicSocketPairTest)
6033 tests.append(TestUnixDomain)
6034 tests.append(TestLinuxAbstractNamespace)
6035 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006036 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006037 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006038 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006039 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006040 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006041 BasicVSOCKTest,
6042 ThreadedVSOCKSocketStreamTest,
6043 ])
6044 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006045 CmsgMacroTests,
6046 SendmsgUDPTest,
6047 RecvmsgUDPTest,
6048 RecvmsgIntoUDPTest,
6049 SendmsgUDP6Test,
6050 RecvmsgUDP6Test,
6051 RecvmsgRFC3542AncillaryUDP6Test,
6052 RecvmsgIntoRFC3542AncillaryUDP6Test,
6053 RecvmsgIntoUDP6Test,
6054 SendmsgTCPTest,
6055 RecvmsgTCPTest,
6056 RecvmsgIntoTCPTest,
6057 SendmsgSCTPStreamTest,
6058 RecvmsgSCTPStreamTest,
6059 RecvmsgIntoSCTPStreamTest,
6060 SendmsgUnixStreamTest,
6061 RecvmsgUnixStreamTest,
6062 RecvmsgIntoUnixStreamTest,
6063 RecvmsgSCMRightsStreamTest,
6064 RecvmsgIntoSCMRightsStreamTest,
6065 # These are slow when setitimer() is not available
6066 InterruptedRecvTimeoutTest,
6067 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006068 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006069 SendfileUsingSendTest,
6070 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006071 ])
animalize19e7d482018-02-27 02:10:36 +08006072 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006073
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006074 thread_info = support.threading_setup()
6075 support.run_unittest(*tests)
6076 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006077
6078if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006079 test_main()