blob: 663a018dcfda0a1bdb28ea7c176dcadb168085ff [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
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000037MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000038
caaveryeffc12f2017-09-06 18:18:10 -040039VSOCKPORT = 1234
40
Victor Stinner45df8202010-04-28 22:31:17 +000041try:
Victor Stinnere254e532014-07-26 14:36:55 +020042 import _socket
43except ImportError:
44 _socket = None
45
caaveryeffc12f2017-09-06 18:18:10 -040046def get_cid():
47 if fcntl is None:
48 return None
49 try:
50 with open("/dev/vsock", "rb") as f:
51 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
52 except OSError:
53 return None
54 else:
55 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000056
Charles-François Natali47413c12011-10-06 19:47:44 +020057def _have_socket_can():
58 """Check whether CAN sockets are supported on this host."""
59 try:
60 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020061 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020062 return False
63 else:
64 s.close()
65 return True
66
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040067def _have_socket_can_isotp():
68 """Check whether CAN ISOTP sockets are supported on this host."""
69 try:
70 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
71 except (AttributeError, OSError):
72 return False
73 else:
74 s.close()
75 return True
76
Charles-François Natali10b8cf42011-11-10 19:21:37 +010077def _have_socket_rds():
78 """Check whether RDS sockets are supported on this host."""
79 try:
80 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
81 except (AttributeError, OSError):
82 return False
83 else:
84 s.close()
85 return True
86
Christian Heimes48371412016-09-06 00:37:46 +020087def _have_socket_alg():
88 """Check whether AF_ALG sockets are supported on this host."""
89 try:
90 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
91 except (AttributeError, OSError):
92 return False
93 else:
94 s.close()
95 return True
96
Bjorn Anderssonbb816512018-09-26 06:47:52 -070097def _have_socket_qipcrtr():
98 """Check whether AF_QIPCRTR sockets are supported on this host."""
99 try:
100 s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
101 except (AttributeError, OSError):
102 return False
103 else:
104 s.close()
105 return True
106
caaveryeffc12f2017-09-06 18:18:10 -0400107def _have_socket_vsock():
108 """Check whether AF_VSOCK sockets are supported on this host."""
109 ret = get_cid() is not None
110 return ret
111
Yury Selivanovf11b4602018-01-28 17:27:38 -0500112
113def _is_fd_in_blocking_mode(sock):
114 return not bool(
115 fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
116
117
Charles-François Natali47413c12011-10-06 19:47:44 +0200118HAVE_SOCKET_CAN = _have_socket_can()
119
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400120HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
121
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100122HAVE_SOCKET_RDS = _have_socket_rds()
123
Christian Heimes48371412016-09-06 00:37:46 +0200124HAVE_SOCKET_ALG = _have_socket_alg()
125
Bjorn Anderssonbb816512018-09-26 06:47:52 -0700126HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
127
caaveryeffc12f2017-09-06 18:18:10 -0400128HAVE_SOCKET_VSOCK = _have_socket_vsock()
129
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000130# Size in bytes of the int type
131SIZEOF_INT = array.array("i").itemsize
132
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000134
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135 def setUp(self):
136 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000137 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100138 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000139
Guido van Rossum24e4af82002-06-12 19:18:08 +0000140 def tearDown(self):
141 self.serv.close()
142 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000143
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144class SocketUDPTest(unittest.TestCase):
145
146 def setUp(self):
147 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000148 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149
150 def tearDown(self):
151 self.serv.close()
152 self.serv = None
153
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000154class ThreadSafeCleanupTestCase(unittest.TestCase):
155 """Subclass of unittest.TestCase with thread-safe cleanup methods.
156
157 This subclass protects the addCleanup() and doCleanups() methods
158 with a recursive lock.
159 """
160
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200161 def __init__(self, *args, **kwargs):
162 super().__init__(*args, **kwargs)
163 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000164
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200165 def addCleanup(self, *args, **kwargs):
166 with self._cleanup_lock:
167 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000168
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200169 def doCleanups(self, *args, **kwargs):
170 with self._cleanup_lock:
171 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000172
Charles-François Natali47413c12011-10-06 19:47:44 +0200173class SocketCANTest(unittest.TestCase):
174
175 """To be able to run this test, a `vcan0` CAN interface can be created with
176 the following commands:
177 # modprobe vcan
178 # ip link add dev vcan0 type vcan
179 # ifconfig vcan0 up
180 """
181 interface = 'vcan0'
182 bufsize = 128
183
Charles-François Natali773e42d2013-02-05 19:42:01 +0100184 """The CAN frame structure is defined in <linux/can.h>:
185
186 struct can_frame {
187 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
188 __u8 can_dlc; /* data length code: 0 .. 8 */
189 __u8 data[8] __attribute__((aligned(8)));
190 };
191 """
192 can_frame_fmt = "=IB3x8s"
193 can_frame_size = struct.calcsize(can_frame_fmt)
194
195 """The Broadcast Management Command frame structure is defined
196 in <linux/can/bcm.h>:
197
198 struct bcm_msg_head {
199 __u32 opcode;
200 __u32 flags;
201 __u32 count;
202 struct timeval ival1, ival2;
203 canid_t can_id;
204 __u32 nframes;
205 struct can_frame frames[0];
206 }
207
208 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
209 `struct can_frame` definition). Must use native not standard types for packing.
210 """
211 bcm_cmd_msg_fmt = "@3I4l2I"
212 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
213
Charles-François Natali47413c12011-10-06 19:47:44 +0200214 def setUp(self):
215 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200216 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200217 try:
218 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200219 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200220 self.skipTest('network interface `%s` does not exist' %
221 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200222
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100223
224class SocketRDSTest(unittest.TestCase):
225
226 """To be able to run this test, the `rds` kernel module must be loaded:
227 # modprobe rds
228 """
229 bufsize = 8192
230
231 def setUp(self):
232 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
233 self.addCleanup(self.serv.close)
234 try:
235 self.port = support.bind_port(self.serv)
236 except OSError:
237 self.skipTest('unable to bind RDS socket')
238
239
Guido van Rossum24e4af82002-06-12 19:18:08 +0000240class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000241 """Threadable Test class
242
243 The ThreadableTest class makes it easy to create a threaded
244 client/server pair from an existing unit test. To create a
245 new threaded class from an existing unit test, use multiple
246 inheritance:
247
248 class NewClass (OldClass, ThreadableTest):
249 pass
250
251 This class defines two new fixture functions with obvious
252 purposes for overriding:
253
254 clientSetUp ()
255 clientTearDown ()
256
257 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000258 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000259 '_' to indicate the client portion of the test. Ex:
260
261 def testFoo(self):
262 # Server portion
263
264 def _testFoo(self):
265 # Client portion
266
267 Any exceptions raised by the clients during their tests
268 are caught and transferred to the main thread to alert
269 the testing framework.
270
271 Note, the server setup function cannot call any blocking
272 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000274 the blocking call (such as in setting up a client/server
275 connection and performing the accept() in setUp().
276 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277
278 def __init__(self):
279 # Swap the true setup function
280 self.__setUp = self.setUp
281 self.__tearDown = self.tearDown
282 self.setUp = self._setUp
283 self.tearDown = self._tearDown
284
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000285 def serverExplicitReady(self):
286 """This method allows the server to explicitly indicate that
287 it wants the client thread to proceed. This is useful if the
288 server is about to execute a blocking routine that is
289 dependent upon the client thread during its setup routine."""
290 self.server_ready.set()
291
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700293 self.wait_threads = support.wait_threads_exit()
294 self.wait_threads.__enter__()
295
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000296 self.server_ready = threading.Event()
297 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000298 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000299 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200300 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000301
302 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000303 methodname = self.id()
304 i = methodname.rfind('.')
305 methodname = methodname[i+1:]
306 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000307 self.client_thread = thread.start_new_thread(
308 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000309
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200310 try:
311 self.__setUp()
312 except:
313 self.server_crashed = True
314 raise
315 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000316 self.server_ready.set()
317 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318
319 def _tearDown(self):
320 self.__tearDown()
321 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700322 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000323
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000324 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000325 exc = self.queue.get()
326 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327
328 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000329 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100330 try:
331 self.clientSetUp()
332 except BaseException as e:
333 self.queue.put(e)
334 self.clientTearDown()
335 return
336 finally:
337 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200338 if self.server_crashed:
339 self.clientTearDown()
340 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000341 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000342 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343 try:
344 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000345 except BaseException as e:
346 self.queue.put(e)
347 finally:
348 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349
350 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000351 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000352
353 def clientTearDown(self):
354 self.done.set()
355 thread.exit()
356
357class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
358
359 def __init__(self, methodName='runTest'):
360 SocketTCPTest.__init__(self, methodName=methodName)
361 ThreadableTest.__init__(self)
362
363 def clientSetUp(self):
364 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
365
366 def clientTearDown(self):
367 self.cli.close()
368 self.cli = None
369 ThreadableTest.clientTearDown(self)
370
371class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
372
373 def __init__(self, methodName='runTest'):
374 SocketUDPTest.__init__(self, methodName=methodName)
375 ThreadableTest.__init__(self)
376
377 def clientSetUp(self):
378 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
379
Brian Curtin3beb38f2010-11-04 03:41:43 +0000380 def clientTearDown(self):
381 self.cli.close()
382 self.cli = None
383 ThreadableTest.clientTearDown(self)
384
Charles-François Natali47413c12011-10-06 19:47:44 +0200385class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
386
387 def __init__(self, methodName='runTest'):
388 SocketCANTest.__init__(self, methodName=methodName)
389 ThreadableTest.__init__(self)
390
391 def clientSetUp(self):
392 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
393 try:
394 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200395 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200396 # skipTest should not be called here, and will be called in the
397 # server instead
398 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200399
400 def clientTearDown(self):
401 self.cli.close()
402 self.cli = None
403 ThreadableTest.clientTearDown(self)
404
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100405class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
406
407 def __init__(self, methodName='runTest'):
408 SocketRDSTest.__init__(self, methodName=methodName)
409 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100410
411 def clientSetUp(self):
412 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
413 try:
414 # RDS sockets must be bound explicitly to send or receive data
415 self.cli.bind((HOST, 0))
416 self.cli_addr = self.cli.getsockname()
417 except OSError:
418 # skipTest should not be called here, and will be called in the
419 # server instead
420 pass
421
422 def clientTearDown(self):
423 self.cli.close()
424 self.cli = None
425 ThreadableTest.clientTearDown(self)
426
caaveryeffc12f2017-09-06 18:18:10 -0400427@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400428@unittest.skipUnless(HAVE_SOCKET_VSOCK,
429 'VSOCK sockets required for this test.')
430@unittest.skipUnless(get_cid() != 2,
431 "This test can only be run on a virtual guest.")
432class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
433
434 def __init__(self, methodName='runTest'):
435 unittest.TestCase.__init__(self, methodName=methodName)
436 ThreadableTest.__init__(self)
437
438 def setUp(self):
439 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
440 self.addCleanup(self.serv.close)
441 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
442 self.serv.listen()
443 self.serverExplicitReady()
444 self.conn, self.connaddr = self.serv.accept()
445 self.addCleanup(self.conn.close)
446
447 def clientSetUp(self):
448 time.sleep(0.1)
449 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
450 self.addCleanup(self.cli.close)
451 cid = get_cid()
452 self.cli.connect((cid, VSOCKPORT))
453
454 def testStream(self):
455 msg = self.conn.recv(1024)
456 self.assertEqual(msg, MSG)
457
458 def _testStream(self):
459 self.cli.send(MSG)
460 self.cli.close()
461
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000463 """Socket tests for client-server connection.
464
465 self.cli_conn is a client socket connected to the server. The
466 setUp() method guarantees that it is connected to the server.
467 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000468
469 def __init__(self, methodName='runTest'):
470 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
471
472 def setUp(self):
473 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000474 # Indicate explicitly we're ready for the client thread to
475 # proceed and then perform the blocking call to accept
476 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477 conn, addr = self.serv.accept()
478 self.cli_conn = conn
479
480 def tearDown(self):
481 self.cli_conn.close()
482 self.cli_conn = None
483 ThreadedTCPSocketTest.tearDown(self)
484
485 def clientSetUp(self):
486 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000487 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488 self.serv_conn = self.cli
489
490 def clientTearDown(self):
491 self.serv_conn.close()
492 self.serv_conn = None
493 ThreadedTCPSocketTest.clientTearDown(self)
494
Dave Cole331708b2004-08-09 04:51:41 +0000495class SocketPairTest(unittest.TestCase, ThreadableTest):
496
497 def __init__(self, methodName='runTest'):
498 unittest.TestCase.__init__(self, methodName=methodName)
499 ThreadableTest.__init__(self)
500
501 def setUp(self):
502 self.serv, self.cli = socket.socketpair()
503
504 def tearDown(self):
505 self.serv.close()
506 self.serv = None
507
508 def clientSetUp(self):
509 pass
510
511 def clientTearDown(self):
512 self.cli.close()
513 self.cli = None
514 ThreadableTest.clientTearDown(self)
515
Tim Peters494aaee2004-08-09 18:54:11 +0000516
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000517# The following classes are used by the sendmsg()/recvmsg() tests.
518# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
519# gives a drop-in replacement for SocketConnectedTest, but different
520# address families can be used, and the attributes serv_addr and
521# cli_addr will be set to the addresses of the endpoints.
522
523class SocketTestBase(unittest.TestCase):
524 """A base class for socket tests.
525
526 Subclasses must provide methods newSocket() to return a new socket
527 and bindSock(sock) to bind it to an unused address.
528
529 Creates a socket self.serv and sets self.serv_addr to its address.
530 """
531
532 def setUp(self):
533 self.serv = self.newSocket()
534 self.bindServer()
535
536 def bindServer(self):
537 """Bind server socket and set self.serv_addr to its address."""
538 self.bindSock(self.serv)
539 self.serv_addr = self.serv.getsockname()
540
541 def tearDown(self):
542 self.serv.close()
543 self.serv = None
544
545
546class SocketListeningTestMixin(SocketTestBase):
547 """Mixin to listen on the server socket."""
548
549 def setUp(self):
550 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100551 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000552
553
554class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
555 ThreadableTest):
556 """Mixin to add client socket and allow client/server tests.
557
558 Client socket is self.cli and its address is self.cli_addr. See
559 ThreadableTest for usage information.
560 """
561
562 def __init__(self, *args, **kwargs):
563 super().__init__(*args, **kwargs)
564 ThreadableTest.__init__(self)
565
566 def clientSetUp(self):
567 self.cli = self.newClientSocket()
568 self.bindClient()
569
570 def newClientSocket(self):
571 """Return a new socket for use as client."""
572 return self.newSocket()
573
574 def bindClient(self):
575 """Bind client socket and set self.cli_addr to its address."""
576 self.bindSock(self.cli)
577 self.cli_addr = self.cli.getsockname()
578
579 def clientTearDown(self):
580 self.cli.close()
581 self.cli = None
582 ThreadableTest.clientTearDown(self)
583
584
585class ConnectedStreamTestMixin(SocketListeningTestMixin,
586 ThreadedSocketTestMixin):
587 """Mixin to allow client/server stream tests with connected client.
588
589 Server's socket representing connection to client is self.cli_conn
590 and client's connection to server is self.serv_conn. (Based on
591 SocketConnectedTest.)
592 """
593
594 def setUp(self):
595 super().setUp()
596 # Indicate explicitly we're ready for the client thread to
597 # proceed and then perform the blocking call to accept
598 self.serverExplicitReady()
599 conn, addr = self.serv.accept()
600 self.cli_conn = conn
601
602 def tearDown(self):
603 self.cli_conn.close()
604 self.cli_conn = None
605 super().tearDown()
606
607 def clientSetUp(self):
608 super().clientSetUp()
609 self.cli.connect(self.serv_addr)
610 self.serv_conn = self.cli
611
612 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100613 try:
614 self.serv_conn.close()
615 self.serv_conn = None
616 except AttributeError:
617 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000618 super().clientTearDown()
619
620
621class UnixSocketTestBase(SocketTestBase):
622 """Base class for Unix-domain socket tests."""
623
624 # This class is used for file descriptor passing tests, so we
625 # create the sockets in a private directory so that other users
626 # can't send anything that might be problematic for a privileged
627 # user running the tests.
628
629 def setUp(self):
630 self.dir_path = tempfile.mkdtemp()
631 self.addCleanup(os.rmdir, self.dir_path)
632 super().setUp()
633
634 def bindSock(self, sock):
635 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100636 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000637 self.addCleanup(support.unlink, path)
638
639class UnixStreamBase(UnixSocketTestBase):
640 """Base class for Unix-domain SOCK_STREAM tests."""
641
642 def newSocket(self):
643 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
644
645
646class InetTestBase(SocketTestBase):
647 """Base class for IPv4 socket tests."""
648
649 host = HOST
650
651 def setUp(self):
652 super().setUp()
653 self.port = self.serv_addr[1]
654
655 def bindSock(self, sock):
656 support.bind_port(sock, host=self.host)
657
658class TCPTestBase(InetTestBase):
659 """Base class for TCP-over-IPv4 tests."""
660
661 def newSocket(self):
662 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
663
664class UDPTestBase(InetTestBase):
665 """Base class for UDP-over-IPv4 tests."""
666
667 def newSocket(self):
668 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
669
670class SCTPStreamBase(InetTestBase):
671 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
672
673 def newSocket(self):
674 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
675 socket.IPPROTO_SCTP)
676
677
678class Inet6TestBase(InetTestBase):
679 """Base class for IPv6 socket tests."""
680
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200681 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000682
683class UDP6TestBase(Inet6TestBase):
684 """Base class for UDP-over-IPv6 tests."""
685
686 def newSocket(self):
687 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
688
689
690# Test-skipping decorators for use with ThreadableTest.
691
692def skipWithClientIf(condition, reason):
693 """Skip decorated test if condition is true, add client_skip decorator.
694
695 If the decorated object is not a class, sets its attribute
696 "client_skip" to a decorator which will return an empty function
697 if the test is to be skipped, or the original function if it is
698 not. This can be used to avoid running the client part of a
699 skipped test when using ThreadableTest.
700 """
701 def client_pass(*args, **kwargs):
702 pass
703 def skipdec(obj):
704 retval = unittest.skip(reason)(obj)
705 if not isinstance(obj, type):
706 retval.client_skip = lambda f: client_pass
707 return retval
708 def noskipdec(obj):
709 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
710 obj.client_skip = lambda f: f
711 return obj
712 return skipdec if condition else noskipdec
713
714
715def requireAttrs(obj, *attributes):
716 """Skip decorated test if obj is missing any of the given attributes.
717
718 Sets client_skip attribute as skipWithClientIf() does.
719 """
720 missing = [name for name in attributes if not hasattr(obj, name)]
721 return skipWithClientIf(
722 missing, "don't have " + ", ".join(name for name in missing))
723
724
725def requireSocket(*args):
726 """Skip decorated test if a socket cannot be created with given arguments.
727
728 When an argument is given as a string, will use the value of that
729 attribute of the socket module, or skip the test if it doesn't
730 exist. Sets client_skip attribute as skipWithClientIf() does.
731 """
732 err = None
733 missing = [obj for obj in args if
734 isinstance(obj, str) and not hasattr(socket, obj)]
735 if missing:
736 err = "don't have " + ", ".join(name for name in missing)
737 else:
738 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
739 for obj in args]
740 try:
741 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200742 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000743 # XXX: check errno?
744 err = str(e)
745 else:
746 s.close()
747 return skipWithClientIf(
748 err is not None,
749 "can't create socket({0}): {1}".format(
750 ", ".join(str(o) for o in args), err))
751
752
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753#######################################################################
754## Begin Tests
755
756class GeneralModuleTests(unittest.TestCase):
757
Ethan Furman7184bac2014-10-14 18:56:53 -0700758 def test_SocketType_is_socketobject(self):
759 import _socket
760 self.assertTrue(socket.SocketType is _socket.socket)
761 s = socket.socket()
762 self.assertIsInstance(s, socket.SocketType)
763 s.close()
764
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000765 def test_repr(self):
766 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200767 with s:
768 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000769 self.assertIn('family=%s' % socket.AF_INET, repr(s))
770 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200771 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200772 self.assertNotIn('raddr', repr(s))
773 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200774 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200775 self.assertIn(str(s.getsockname()), repr(s))
776 self.assertIn('[closed]', repr(s))
777 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000778
Victor Stinnere254e532014-07-26 14:36:55 +0200779 @unittest.skipUnless(_socket is not None, 'need _socket module')
780 def test_csocket_repr(self):
781 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
782 try:
783 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
784 % (s.fileno(), s.family, s.type, s.proto))
785 self.assertEqual(repr(s), expected)
786 finally:
787 s.close()
788 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
789 % (s.family, s.type, s.proto))
790 self.assertEqual(repr(s), expected)
791
Raymond Hettinger027bb632004-05-31 03:09:25 +0000792 def test_weakref(self):
793 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
794 p = proxy(s)
795 self.assertEqual(p.fileno(), s.fileno())
796 s.close()
797 s = None
798 try:
799 p.fileno()
800 except ReferenceError:
801 pass
802 else:
803 self.fail('Socket proxy still exists')
804
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000806 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300807 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200808 with self.assertRaises(OSError, msg=msg % 'OSError'):
809 raise OSError
810 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200812 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814
Ezio Melotti63e42302011-05-07 19:47:48 +0300815 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000816 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300817 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
818 self.addCleanup(s.close)
819 s.bind(('', 0))
820 sockname = s.getsockname()
821 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300822 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300823 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300824 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400825 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300826 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300827 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300828 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400829 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300830 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300831 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300832 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300833 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300834 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300835 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300836 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400837 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300838 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300839 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300840 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400841 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300842 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300843 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300844 self.assertIn('not NoneType', str(cm.exception))
845 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300846 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300847 self.assertIn('an integer is required', str(cm.exception))
848 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300849 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300850 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300851 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300852 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300853 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300854 self.assertIn('(1 given)', str(cm.exception))
855 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300856 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300857 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300858
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000860 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861 socket.AF_INET
862 socket.SOCK_STREAM
863 socket.SOCK_DGRAM
864 socket.SOCK_RAW
865 socket.SOCK_RDM
866 socket.SOCK_SEQPACKET
867 socket.SOL_SOCKET
868 socket.SO_REUSEADDR
869
Guido van Rossum654c11e2002-06-13 20:24:17 +0000870 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000871 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000872 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000873 try:
874 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200875 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000876 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600877 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000878 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000879 try:
880 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200881 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000882 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600883 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000884 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000885 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000886 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000887 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000888
Charles-François Natali0cc86852013-09-13 19:53:08 +0200889 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700890 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200891 self.assertEqual(socket.gethostbyname(addr), addr)
892
893 # we don't test support.HOSTv6 because there's a chance it doesn't have
894 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700895 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200896 self.assertIn(host, socket.gethostbyaddr(host)[2])
897
Xiang Zhangd36a7162017-03-07 11:06:09 +0800898 def test_host_resolution_bad_address(self):
899 # These are all malformed IP addresses and expected not to resolve to
900 # any result. But some ISPs, e.g. AWS, may successfully resolve these
901 # IPs.
902 explanation = (
903 "resolving an invalid IP address did not raise OSError; "
904 "can be caused by a broken DNS server"
905 )
906 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
907 '1:1:1:1:1:1:1:1:1']:
Barry Warsaw273f51f2018-05-17 11:54:01 -0400908 with self.assertRaises(OSError, msg=addr):
Xiang Zhangd36a7162017-03-07 11:06:09 +0800909 socket.gethostbyname(addr)
910 with self.assertRaises(OSError, msg=explanation):
911 socket.gethostbyaddr(addr)
912
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000913 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
914 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
915 def test_sethostname(self):
916 oldhn = socket.gethostname()
917 try:
918 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200919 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000920 if e.errno == errno.EPERM:
921 self.skipTest("test should be run as root")
922 else:
923 raise
924 try:
925 # running test as root!
926 self.assertEqual(socket.gethostname(), 'new')
927 # Should work with bytes objects too
928 socket.sethostname(b'bar')
929 self.assertEqual(socket.gethostname(), 'bar')
930 finally:
931 socket.sethostname(oldhn)
932
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700933 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
934 'socket.if_nameindex() not available.')
935 def testInterfaceNameIndex(self):
936 interfaces = socket.if_nameindex()
937 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200938 self.assertIsInstance(index, int)
939 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700940 # interface indices are non-zero integers
941 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200942 _index = socket.if_nametoindex(name)
943 self.assertIsInstance(_index, int)
944 self.assertEqual(index, _index)
945 _name = socket.if_indextoname(index)
946 self.assertIsInstance(_name, str)
947 self.assertEqual(name, _name)
948
949 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
950 'socket.if_nameindex() not available.')
951 def testInvalidInterfaceNameIndex(self):
952 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200953 self.assertRaises(OSError, socket.if_indextoname, 0)
954 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200955 # test with invalid values
956 self.assertRaises(TypeError, socket.if_nametoindex, 0)
957 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700958
Serhiy Storchaka43767632013-11-03 21:31:38 +0200959 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
960 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000961 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000962 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200963 try:
964 # On some versions, this loses a reference
965 orig = sys.getrefcount(__name__)
966 socket.getnameinfo(__name__,0)
967 except TypeError:
968 if sys.getrefcount(__name__) != orig:
969 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000970
Guido van Rossum24e4af82002-06-12 19:18:08 +0000971 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000972 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000973 try:
974 # On some versions, this crashes the interpreter.
975 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200976 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000978
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000979 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000980 # This just checks that htons etc. are their own inverse,
981 # when looking at the lower 16 or 32 bits.
982 sizes = {socket.htonl: 32, socket.ntohl: 32,
983 socket.htons: 16, socket.ntohs: 16}
984 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000985 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000986 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
987 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000988
Guido van Rossuma2627af2002-09-14 00:58:46 +0000989 swapped = func(mask)
990 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000991 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000992
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200993 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000994 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300995 import _testcapi
996 s_good_values = [0, 1, 2, 0xffff]
997 l_good_values = s_good_values + [0xffffffff]
998 l_bad_values = [-1, -2, 1<<32, 1<<1000]
999 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
1000 _testcapi.INT_MAX + 1]
1001 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
1002 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001003 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001004 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001005 for k in l_good_values:
1006 socket.ntohl(k)
1007 socket.htonl(k)
1008 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +00001009 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001010 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03001011 for k in l_bad_values:
1012 self.assertRaises(OverflowError, socket.ntohl, k)
1013 self.assertRaises(OverflowError, socket.htonl, k)
1014 for k in s_deprecated_values:
1015 self.assertWarns(DeprecationWarning, socket.ntohs, k)
1016 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001017
Barry Warsaw11b91a02004-06-28 00:50:43 +00001018 def testGetServBy(self):
1019 eq = self.assertEqual
1020 # Find one service that exists, then check all the related interfaces.
1021 # I've ordered this by protocols that have both a tcp and udp
1022 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001023 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001024 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001025 # avoid the 'echo' service on this platform, as there is an
1026 # assumption breaking non-standard port/protocol entry
1027 services = ('daytime', 'qotd', 'domain')
1028 else:
1029 services = ('echo', 'daytime', 'domain')
1030 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001031 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001032 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001033 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001034 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001035 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001036 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001037 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001038 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001039 # Issue #26936: Android getservbyname() was broken before API 23.
1040 if (not hasattr(sys, 'getandroidapilevel') or
1041 sys.getandroidapilevel() >= 23):
1042 port2 = socket.getservbyname(service)
1043 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001044 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001045 try:
1046 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001047 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001048 udpport = None
1049 else:
1050 eq(udpport, port)
1051 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001052 # Issue #26936: Android getservbyport() is broken.
Victor Stinner937ee9e2018-06-26 02:11:06 +02001053 if not support.is_android:
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001054 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001055 eq(socket.getservbyport(port, 'tcp'), service)
1056 if udpport is not None:
1057 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001058 # Make sure getservbyport does not accept out of range ports.
1059 self.assertRaises(OverflowError, socket.getservbyport, -1)
1060 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001062 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001063 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001064 # The default timeout should initially be None
1065 self.assertEqual(socket.getdefaulttimeout(), None)
1066 s = socket.socket()
1067 self.assertEqual(s.gettimeout(), None)
1068 s.close()
1069
1070 # Set the default timeout to 10, and see if it propagates
1071 socket.setdefaulttimeout(10)
1072 self.assertEqual(socket.getdefaulttimeout(), 10)
1073 s = socket.socket()
1074 self.assertEqual(s.gettimeout(), 10)
1075 s.close()
1076
1077 # Reset the default timeout to None, and see if it propagates
1078 socket.setdefaulttimeout(None)
1079 self.assertEqual(socket.getdefaulttimeout(), None)
1080 s = socket.socket()
1081 self.assertEqual(s.gettimeout(), None)
1082 s.close()
1083
1084 # Check that setting it to an invalid value raises ValueError
1085 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1086
1087 # Check that setting it to an invalid type raises TypeError
1088 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1089
Serhiy Storchaka43767632013-11-03 21:31:38 +02001090 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1091 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001092 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001093 # Test that issue1008086 and issue767150 are fixed.
1094 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001095 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1096 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001097
Serhiy Storchaka43767632013-11-03 21:31:38 +02001098 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1099 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001100 def testIPv4toString(self):
1101 from socket import inet_aton as f, inet_pton, AF_INET
1102 g = lambda a: inet_pton(AF_INET, a)
1103
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001104 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001105 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001106 )
1107
Ezio Melottib3aedd42010-11-20 19:04:17 +00001108 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1109 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1110 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1111 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1112 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001113 # bpo-29972: inet_pton() doesn't fail on AIX
1114 if not sys.platform.startswith('aix'):
1115 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001116 assertInvalid(f, '300.0.0.0')
1117 assertInvalid(f, 'a.0.0.0')
1118 assertInvalid(f, '1.2.3.4.5')
1119 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001120
Ezio Melottib3aedd42010-11-20 19:04:17 +00001121 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1122 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1123 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1124 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001125 assertInvalid(g, '0.0.0.')
1126 assertInvalid(g, '300.0.0.0')
1127 assertInvalid(g, 'a.0.0.0')
1128 assertInvalid(g, '1.2.3.4.5')
1129 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001130
Serhiy Storchaka43767632013-11-03 21:31:38 +02001131 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1132 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001133 def testIPv6toString(self):
1134 try:
1135 from socket import inet_pton, AF_INET6, has_ipv6
1136 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001137 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001138 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001139 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001140
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001141 if sys.platform == "win32":
1142 try:
1143 inet_pton(AF_INET6, '::')
1144 except OSError as e:
1145 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001146 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001147
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001148 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001149 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001150 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001151 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001152
Ezio Melottib3aedd42010-11-20 19:04:17 +00001153 self.assertEqual(b'\x00' * 16, f('::'))
1154 self.assertEqual(b'\x00' * 16, f('0::0'))
1155 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1156 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001157 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 +00001158 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1159 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001160 self.assertEqual(
1161 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1162 f('ad42:abc::127:0:254:2')
1163 )
1164 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1165 assertInvalid('0x20::')
1166 assertInvalid(':::')
1167 assertInvalid('::0::')
1168 assertInvalid('1::abc::')
1169 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001170 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001171 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001172 # bpo-29972: inet_pton() doesn't fail on AIX
1173 if not sys.platform.startswith('aix'):
1174 assertInvalid('1:2:3:4:5:6:')
1175 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001176
1177 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1178 f('::254.42.23.64')
1179 )
1180 self.assertEqual(
1181 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1182 f('42::a29b:254.42.23.64')
1183 )
1184 self.assertEqual(
1185 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1186 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1187 )
1188 assertInvalid('255.254.253.252')
1189 assertInvalid('1::260.2.3.0')
1190 assertInvalid('1::0.be.e.0')
1191 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1192 assertInvalid('::1.2.3.4:0')
1193 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001194
Serhiy Storchaka43767632013-11-03 21:31:38 +02001195 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1196 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001197 def testStringToIPv4(self):
1198 from socket import inet_ntoa as f, inet_ntop, AF_INET
1199 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001200 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001201 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001202 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001203
Ezio Melottib3aedd42010-11-20 19:04:17 +00001204 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1205 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1206 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1207 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001208 assertInvalid(f, b'\x00' * 3)
1209 assertInvalid(f, b'\x00' * 5)
1210 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001211 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001212
Ezio Melottib3aedd42010-11-20 19:04:17 +00001213 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1214 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1215 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001216 assertInvalid(g, b'\x00' * 3)
1217 assertInvalid(g, b'\x00' * 5)
1218 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001219 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001220
Serhiy Storchaka43767632013-11-03 21:31:38 +02001221 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1222 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001223 def testStringToIPv6(self):
1224 try:
1225 from socket import inet_ntop, AF_INET6, has_ipv6
1226 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001227 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001228 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001229 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001230
1231 if sys.platform == "win32":
1232 try:
1233 inet_ntop(AF_INET6, b'\x00' * 16)
1234 except OSError as e:
1235 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001236 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001237
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001238 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001239 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001240 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001241 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001242
Ezio Melottib3aedd42010-11-20 19:04:17 +00001243 self.assertEqual('::', f(b'\x00' * 16))
1244 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1245 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001246 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001247 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 +00001248 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001249 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001250
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001251 assertInvalid(b'\x12' * 15)
1252 assertInvalid(b'\x12' * 17)
1253 assertInvalid(b'\x12' * 4)
1254
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001255 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001256
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001257 def testSockName(self):
1258 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001259 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001260 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001261 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001262 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001263 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001264 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1265 # it reasonable to get the host's addr in addition to 0.0.0.0.
1266 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001267 try:
1268 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001269 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001270 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001271 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001272 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001273 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001274
1275 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001276 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001277 # We know a socket should start without reuse==0
1278 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001279 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001280 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001281 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001282
1283 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001284 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001285 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001286 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001287 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1288 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001289 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001290
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001291 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001292 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001293 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1294 sock.settimeout(1)
1295 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001296 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001297
Martin Panter50ab1a32016-04-11 00:38:12 +00001298 def testCloseException(self):
1299 sock = socket.socket()
Christian Heimesb6e43af2018-01-29 22:37:58 +01001300 sock.bind((socket._LOCALHOST, 0))
Martin Panter50ab1a32016-04-11 00:38:12 +00001301 socket.socket(fileno=sock.fileno()).close()
1302 try:
1303 sock.close()
1304 except OSError as err:
1305 # Winsock apparently raises ENOTSOCK
1306 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1307 else:
1308 self.fail("close() should raise EBADF/ENOTSOCK")
1309
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001310 def testNewAttributes(self):
1311 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001312
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001313 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1314 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001315 if hasattr(socket, 'SOCK_CLOEXEC'):
1316 self.assertIn(sock.type,
1317 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1318 socket.SOCK_STREAM))
1319 else:
1320 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001321 self.assertEqual(sock.proto, 0)
1322 sock.close()
1323
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001324 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001325 sock = socket.socket()
1326 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001327 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001328 big_port = port + 65536
1329 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001330 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1331 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1332 # Since find_unused_port() is inherently subject to race conditions, we
1333 # call it a couple times if necessary.
1334 for i in itertools.count():
1335 port = support.find_unused_port()
1336 try:
1337 sock.bind((HOST, port))
1338 except OSError as e:
1339 if e.errno != errno.EADDRINUSE or i == 5:
1340 raise
1341 else:
1342 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001343
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001344 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001345 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001346 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1347 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1348 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1349 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001350 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1351 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001352 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001353 self.assertRaises(ValueError, s.ioctl, -1, None)
1354 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001355
Steve Dowerea93ac02016-06-17 12:52:18 -07001356 @unittest.skipUnless(os.name == "nt", "Windows specific")
1357 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1358 'Loopback fast path support required for this test')
1359 def test_sio_loopback_fast_path(self):
1360 s = socket.socket()
1361 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001362 try:
1363 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1364 except OSError as exc:
1365 WSAEOPNOTSUPP = 10045
1366 if exc.winerror == WSAEOPNOTSUPP:
1367 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1368 "doesn't implemented in this Windows version")
1369 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001370 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1371
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001372 def testGetaddrinfo(self):
1373 try:
1374 socket.getaddrinfo('localhost', 80)
1375 except socket.gaierror as err:
1376 if err.errno == socket.EAI_SERVICE:
1377 # see http://bugs.python.org/issue1282647
1378 self.skipTest("buggy libc version")
1379 raise
1380 # len of every sequence is supposed to be == 5
1381 for info in socket.getaddrinfo(HOST, None):
1382 self.assertEqual(len(info), 5)
1383 # host can be a domain name, a string representation of an
1384 # IPv4/v6 address or None
1385 socket.getaddrinfo('localhost', 80)
1386 socket.getaddrinfo('127.0.0.1', 80)
1387 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001388 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001389 socket.getaddrinfo('::1', 80)
1390 # port can be a string service name such as "http", a numeric
1391 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001392 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1393 if (not hasattr(sys, 'getandroidapilevel') or
1394 sys.getandroidapilevel() >= 23):
1395 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001396 socket.getaddrinfo(HOST, 80)
1397 socket.getaddrinfo(HOST, None)
1398 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001399 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1400 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001401 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001402 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1403 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001404 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001405 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1406 for _, socktype, _, _, _ in infos:
1407 self.assertEqual(socktype, socket.SOCK_STREAM)
1408 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001409 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001410 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1411 # a server willing to support both IPv4 and IPv6 will
1412 # usually do this
1413 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1414 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001415 # test keyword arguments
1416 a = socket.getaddrinfo(HOST, None)
1417 b = socket.getaddrinfo(host=HOST, port=None)
1418 self.assertEqual(a, b)
1419 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1420 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1421 self.assertEqual(a, b)
1422 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1423 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1424 self.assertEqual(a, b)
1425 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1426 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1427 self.assertEqual(a, b)
1428 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1429 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1430 self.assertEqual(a, b)
1431 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1432 socket.AI_PASSIVE)
1433 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1434 type=socket.SOCK_STREAM, proto=0,
1435 flags=socket.AI_PASSIVE)
1436 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001437 # Issue #6697.
1438 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001439
Ned Deilyb24f4812014-02-13 22:50:42 -08001440 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001441 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001442 try:
1443 # The arguments here are undefined and the call may succeed
1444 # or fail. All we care here is that it doesn't segfault.
1445 socket.getaddrinfo("localhost", None, 0, 0, 0,
1446 socket.AI_NUMERICSERV)
1447 except socket.gaierror:
1448 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001449
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001450 def test_getnameinfo(self):
1451 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001452 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001453
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001454 @unittest.skipUnless(support.is_resource_enabled('network'),
1455 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001456 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001457 # Check for internet access before running test
1458 # (issue #12804, issue #25138).
1459 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001460 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001461
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001462 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001463 domain = 'испытание.pythontest.net'
1464 socket.gethostbyname(domain)
1465 socket.gethostbyname_ex(domain)
1466 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001467 # 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 +00001468 # have a reverse entry yet
1469 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001470
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001471 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001472 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001473 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1474 self.skipTest("signal.alarm and socket.socketpair required for this test")
1475 # Our signal handlers clobber the C errno by calling a math function
1476 # with an invalid domain value.
1477 def ok_handler(*args):
1478 self.assertRaises(ValueError, math.acosh, 0)
1479 def raising_handler(*args):
1480 self.assertRaises(ValueError, math.acosh, 0)
1481 1 // 0
1482 c, s = socket.socketpair()
1483 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1484 try:
1485 if with_timeout:
1486 # Just above the one second minimum for signal.alarm
1487 c.settimeout(1.5)
1488 with self.assertRaises(ZeroDivisionError):
1489 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001490 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001491 if with_timeout:
1492 signal.signal(signal.SIGALRM, ok_handler)
1493 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001494 self.assertRaises(socket.timeout, c.sendall,
1495 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001496 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001497 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001498 signal.signal(signal.SIGALRM, old_alarm)
1499 c.close()
1500 s.close()
1501
1502 def test_sendall_interrupted(self):
1503 self.check_sendall_interrupted(False)
1504
1505 def test_sendall_interrupted_with_timeout(self):
1506 self.check_sendall_interrupted(True)
1507
Antoine Pitroue033e062010-10-29 10:38:18 +00001508 def test_dealloc_warn(self):
1509 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1510 r = repr(sock)
1511 with self.assertWarns(ResourceWarning) as cm:
1512 sock = None
1513 support.gc_collect()
1514 self.assertIn(r, str(cm.warning.args[0]))
1515 # An open socket file object gets dereferenced after the socket
1516 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1517 f = sock.makefile('rb')
1518 r = repr(sock)
1519 sock = None
1520 support.gc_collect()
1521 with self.assertWarns(ResourceWarning):
1522 f = None
1523 support.gc_collect()
1524
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001525 def test_name_closed_socketio(self):
1526 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1527 fp = sock.makefile("rb")
1528 fp.close()
1529 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1530
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001531 def test_unusable_closed_socketio(self):
1532 with socket.socket() as sock:
1533 fp = sock.makefile("rb", buffering=0)
1534 self.assertTrue(fp.readable())
1535 self.assertFalse(fp.writable())
1536 self.assertFalse(fp.seekable())
1537 fp.close()
1538 self.assertRaises(ValueError, fp.readable)
1539 self.assertRaises(ValueError, fp.writable)
1540 self.assertRaises(ValueError, fp.seekable)
1541
Christian Heimesd0e31b92018-01-27 09:54:13 +01001542 def test_socket_close(self):
1543 sock = socket.socket()
1544 try:
1545 sock.bind((HOST, 0))
1546 socket.close(sock.fileno())
1547 with self.assertRaises(OSError):
1548 sock.listen(1)
1549 finally:
1550 with self.assertRaises(OSError):
1551 # sock.close() fails with EBADF
1552 sock.close()
1553 with self.assertRaises(TypeError):
1554 socket.close(None)
1555 with self.assertRaises(OSError):
1556 socket.close(-1)
1557
Berker Peksag3fe64d02016-02-18 17:34:00 +02001558 def test_makefile_mode(self):
1559 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1560 with self.subTest(mode=mode):
1561 with socket.socket() as sock:
1562 with sock.makefile(mode) as fp:
1563 self.assertEqual(fp.mode, mode)
1564
1565 def test_makefile_invalid_mode(self):
1566 for mode in 'rt', 'x', '+', 'a':
1567 with self.subTest(mode=mode):
1568 with socket.socket() as sock:
1569 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1570 sock.makefile(mode)
1571
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001572 def test_pickle(self):
1573 sock = socket.socket()
1574 with sock:
1575 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1576 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001577 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1578 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1579 self.assertEqual(family, socket.AF_INET)
1580 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1581 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001582
Serhiy Storchaka78980432013-01-15 01:12:17 +02001583 def test_listen_backlog(self):
1584 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001585 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1586 srv.bind((HOST, 0))
1587 srv.listen(backlog)
1588
1589 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001590 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001591 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001592
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001593 @support.cpython_only
1594 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001595 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001596 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001597 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1598 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001599 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001600 srv.close()
1601
Charles-François Natali42663332012-01-02 15:57:30 +01001602 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001603 def test_flowinfo(self):
1604 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001605 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001606 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001607 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001608
Коренберг Марк7766b962018-02-13 00:47:42 +05001609 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1610 def test_getaddrinfo_ipv6_basic(self):
1611 ((*_, sockaddr),) = socket.getaddrinfo(
1612 'ff02::1de:c0:face:8D', # Note capital letter `D`.
1613 1234, socket.AF_INET6,
1614 socket.SOCK_DGRAM,
1615 socket.IPPROTO_UDP
1616 )
1617 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
1618
1619 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1620 @unittest.skipUnless(
1621 hasattr(socket, 'if_nameindex'),
1622 'if_nameindex is not supported')
1623 def test_getaddrinfo_ipv6_scopeid_symbolic(self):
1624 # Just pick up any network interface (Linux, Mac OS X)
1625 (ifindex, test_interface) = socket.if_nameindex()[0]
1626 ((*_, sockaddr),) = socket.getaddrinfo(
1627 'ff02::1de:c0:face:8D%' + test_interface,
1628 1234, socket.AF_INET6,
1629 socket.SOCK_DGRAM,
1630 socket.IPPROTO_UDP
1631 )
1632 # Note missing interface name part in IPv6 address
1633 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1634
1635 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1636 @unittest.skipUnless(
1637 sys.platform == 'win32',
1638 'Numeric scope id does not work or undocumented')
1639 def test_getaddrinfo_ipv6_scopeid_numeric(self):
1640 # Also works on Linux and Mac OS X, but is not documented (?)
1641 # Windows, Linux and Max OS X allow nonexistent interface numbers here.
1642 ifindex = 42
1643 ((*_, sockaddr),) = socket.getaddrinfo(
1644 'ff02::1de:c0:face:8D%' + str(ifindex),
1645 1234, socket.AF_INET6,
1646 socket.SOCK_DGRAM,
1647 socket.IPPROTO_UDP
1648 )
1649 # Note missing interface name part in IPv6 address
1650 self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
1651
1652 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1653 @unittest.skipUnless(
1654 hasattr(socket, 'if_nameindex'),
1655 'if_nameindex is not supported')
1656 def test_getnameinfo_ipv6_scopeid_symbolic(self):
1657 # Just pick up any network interface.
1658 (ifindex, test_interface) = socket.if_nameindex()[0]
1659 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1660 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1661 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
1662
1663 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
1664 @unittest.skipUnless(
1665 sys.platform == 'win32',
1666 'Numeric scope id does not work or undocumented')
1667 def test_getnameinfo_ipv6_scopeid_numeric(self):
1668 # Also works on Linux (undocumented), but does not work on Mac OS X
1669 # Windows and Linux allow nonexistent interface numbers here.
1670 ifindex = 42
1671 sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
1672 nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
1673 self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
1674
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001675 def test_str_for_enums(self):
1676 # Make sure that the AF_* and SOCK_* constants have enum-like string
1677 # reprs.
1678 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1679 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001680 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001681
Yury Selivanov98181422017-12-18 20:02:54 -05001682 def test_socket_consistent_sock_type(self):
1683 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1684 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1685 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1686
1687 with socket.socket(socket.AF_INET, sock_type) as s:
1688 self.assertEqual(s.type, socket.SOCK_STREAM)
1689 s.settimeout(1)
1690 self.assertEqual(s.type, socket.SOCK_STREAM)
1691 s.settimeout(0)
1692 self.assertEqual(s.type, socket.SOCK_STREAM)
1693 s.setblocking(True)
1694 self.assertEqual(s.type, socket.SOCK_STREAM)
1695 s.setblocking(False)
1696 self.assertEqual(s.type, socket.SOCK_STREAM)
1697
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001698 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001699 def test_unknown_socket_family_repr(self):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001700 # Test that when created with a family that's not one of the known
1701 # AF_*/SOCK_* constants, socket.family just returns the number.
1702 #
1703 # To do this we fool socket.socket into believing it already has an
1704 # open fd because on this path it doesn't actually verify the family and
1705 # type and populates the socket object.
1706 #
1707 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001708 fd, path = tempfile.mkstemp()
1709 self.addCleanup(os.unlink, path)
Yury Selivanov98181422017-12-18 20:02:54 -05001710 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1711
1712 unknown_type = max(
1713 kind
1714 for name, kind in socket.SocketKind.__members__.items()
1715 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1716 ) + 1
1717
1718 with socket.socket(
Christian Heimesb6e43af2018-01-29 22:37:58 +01001719 family=unknown_family, type=unknown_type, proto=23,
1720 fileno=fd) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05001721 self.assertEqual(s.family, unknown_family)
1722 self.assertEqual(s.type, unknown_type)
Christian Heimes2e0ecde2018-01-30 08:55:46 +01001723 # some OS like macOS ignore proto
1724 self.assertIn(s.proto, {0, 23})
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001725
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001726 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1727 def test__sendfile_use_sendfile(self):
1728 class File:
1729 def __init__(self, fd):
1730 self.fd = fd
1731
1732 def fileno(self):
1733 return self.fd
1734 with socket.socket() as sock:
1735 fd = os.open(os.curdir, os.O_RDONLY)
1736 os.close(fd)
1737 with self.assertRaises(socket._GiveupOnSendfile):
1738 sock._sendfile_use_sendfile(File(fd))
1739 with self.assertRaises(OverflowError):
1740 sock._sendfile_use_sendfile(File(2**1000))
1741 with self.assertRaises(TypeError):
1742 sock._sendfile_use_sendfile(File(None))
1743
Christian Heimesb6e43af2018-01-29 22:37:58 +01001744 def _test_socket_fileno(self, s, family, stype):
1745 self.assertEqual(s.family, family)
1746 self.assertEqual(s.type, stype)
1747
1748 fd = s.fileno()
1749 s2 = socket.socket(fileno=fd)
1750 self.addCleanup(s2.close)
1751 # detach old fd to avoid double close
1752 s.detach()
1753 self.assertEqual(s2.family, family)
1754 self.assertEqual(s2.type, stype)
1755 self.assertEqual(s2.fileno(), fd)
1756
1757 def test_socket_fileno(self):
1758 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1759 self.addCleanup(s.close)
1760 s.bind((support.HOST, 0))
1761 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
1762
1763 if hasattr(socket, "SOCK_DGRAM"):
1764 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1765 self.addCleanup(s.close)
1766 s.bind((support.HOST, 0))
1767 self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
1768
1769 if support.IPV6_ENABLED:
1770 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
1771 self.addCleanup(s.close)
1772 s.bind((support.HOSTv6, 0, 0, 0))
1773 self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
1774
1775 if hasattr(socket, "AF_UNIX"):
1776 tmpdir = tempfile.mkdtemp()
1777 self.addCleanup(shutil.rmtree, tmpdir)
1778 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1779 self.addCleanup(s.close)
1780 s.bind(os.path.join(tmpdir, 'socket'))
1781 self._test_socket_fileno(s, socket.AF_UNIX, socket.SOCK_STREAM)
1782
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001783
Charles-François Natali47413c12011-10-06 19:47:44 +02001784@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1785class BasicCANTest(unittest.TestCase):
1786
1787 def testCrucialConstants(self):
1788 socket.AF_CAN
1789 socket.PF_CAN
1790 socket.CAN_RAW
1791
Charles-François Natali773e42d2013-02-05 19:42:01 +01001792 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1793 'socket.CAN_BCM required for this test.')
1794 def testBCMConstants(self):
1795 socket.CAN_BCM
1796
1797 # opcodes
1798 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1799 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1800 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1801 socket.CAN_BCM_TX_SEND # send one CAN frame
1802 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1803 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1804 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1805 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1806 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1807 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1808 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1809 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1810
Charles-François Natali47413c12011-10-06 19:47:44 +02001811 def testCreateSocket(self):
1812 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1813 pass
1814
Charles-François Natali773e42d2013-02-05 19:42:01 +01001815 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1816 'socket.CAN_BCM required for this test.')
1817 def testCreateBCMSocket(self):
1818 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1819 pass
1820
Charles-François Natali47413c12011-10-06 19:47:44 +02001821 def testBindAny(self):
1822 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1823 s.bind(('', ))
1824
1825 def testTooLongInterfaceName(self):
1826 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1827 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001828 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001829 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001830
1831 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1832 'socket.CAN_RAW_LOOPBACK required for this test.')
1833 def testLoopback(self):
1834 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1835 for loopback in (0, 1):
1836 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1837 loopback)
1838 self.assertEqual(loopback,
1839 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1840
1841 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1842 'socket.CAN_RAW_FILTER required for this test.')
1843 def testFilter(self):
1844 can_id, can_mask = 0x200, 0x700
1845 can_filter = struct.pack("=II", can_id, can_mask)
1846 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1847 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1848 self.assertEqual(can_filter,
1849 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001850 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001851
1852
1853@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001854class CANTest(ThreadedCANSocketTest):
1855
Charles-François Natali47413c12011-10-06 19:47:44 +02001856 def __init__(self, methodName='runTest'):
1857 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1858
1859 @classmethod
1860 def build_can_frame(cls, can_id, data):
1861 """Build a CAN frame."""
1862 can_dlc = len(data)
1863 data = data.ljust(8, b'\x00')
1864 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1865
1866 @classmethod
1867 def dissect_can_frame(cls, frame):
1868 """Dissect a CAN frame."""
1869 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1870 return (can_id, can_dlc, data[:can_dlc])
1871
1872 def testSendFrame(self):
1873 cf, addr = self.s.recvfrom(self.bufsize)
1874 self.assertEqual(self.cf, cf)
1875 self.assertEqual(addr[0], self.interface)
1876 self.assertEqual(addr[1], socket.AF_CAN)
1877
1878 def _testSendFrame(self):
1879 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1880 self.cli.send(self.cf)
1881
1882 def testSendMaxFrame(self):
1883 cf, addr = self.s.recvfrom(self.bufsize)
1884 self.assertEqual(self.cf, cf)
1885
1886 def _testSendMaxFrame(self):
1887 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1888 self.cli.send(self.cf)
1889
1890 def testSendMultiFrames(self):
1891 cf, addr = self.s.recvfrom(self.bufsize)
1892 self.assertEqual(self.cf1, cf)
1893
1894 cf, addr = self.s.recvfrom(self.bufsize)
1895 self.assertEqual(self.cf2, cf)
1896
1897 def _testSendMultiFrames(self):
1898 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1899 self.cli.send(self.cf1)
1900
1901 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1902 self.cli.send(self.cf2)
1903
Charles-François Natali773e42d2013-02-05 19:42:01 +01001904 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1905 'socket.CAN_BCM required for this test.')
1906 def _testBCM(self):
1907 cf, addr = self.cli.recvfrom(self.bufsize)
1908 self.assertEqual(self.cf, cf)
1909 can_id, can_dlc, data = self.dissect_can_frame(cf)
1910 self.assertEqual(self.can_id, can_id)
1911 self.assertEqual(self.data, data)
1912
1913 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1914 'socket.CAN_BCM required for this test.')
1915 def testBCM(self):
1916 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1917 self.addCleanup(bcm.close)
1918 bcm.connect((self.interface,))
1919 self.can_id = 0x123
1920 self.data = bytes([0xc0, 0xff, 0xee])
1921 self.cf = self.build_can_frame(self.can_id, self.data)
1922 opcode = socket.CAN_BCM_TX_SEND
1923 flags = 0
1924 count = 0
1925 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1926 bcm_can_id = 0x0222
1927 nframes = 1
1928 assert len(self.cf) == 16
1929 header = struct.pack(self.bcm_cmd_msg_fmt,
1930 opcode,
1931 flags,
1932 count,
1933 ival1_seconds,
1934 ival1_usec,
1935 ival2_seconds,
1936 ival2_usec,
1937 bcm_can_id,
1938 nframes,
1939 )
1940 header_plus_frame = header + self.cf
1941 bytes_sent = bcm.send(header_plus_frame)
1942 self.assertEqual(bytes_sent, len(header_plus_frame))
1943
Charles-François Natali47413c12011-10-06 19:47:44 +02001944
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001945@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1946class ISOTPTest(unittest.TestCase):
1947
1948 def __init__(self, *args, **kwargs):
1949 super().__init__(*args, **kwargs)
1950 self.interface = "vcan0"
1951
1952 def testCrucialConstants(self):
1953 socket.AF_CAN
1954 socket.PF_CAN
1955 socket.CAN_ISOTP
1956 socket.SOCK_DGRAM
1957
1958 def testCreateSocket(self):
1959 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1960 pass
1961
1962 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1963 'socket.CAN_ISOTP required for this test.')
1964 def testCreateISOTPSocket(self):
1965 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1966 pass
1967
1968 def testTooLongInterfaceName(self):
1969 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1970 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1971 with self.assertRaisesRegex(OSError, 'interface name too long'):
1972 s.bind(('x' * 1024, 1, 2))
1973
1974 def testBind(self):
1975 try:
1976 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1977 addr = self.interface, 0x123, 0x456
1978 s.bind(addr)
1979 self.assertEqual(s.getsockname(), addr)
1980 except OSError as e:
1981 if e.errno == errno.ENODEV:
1982 self.skipTest('network interface `%s` does not exist' %
1983 self.interface)
1984 else:
1985 raise
1986
1987
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001988@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1989class BasicRDSTest(unittest.TestCase):
1990
1991 def testCrucialConstants(self):
1992 socket.AF_RDS
1993 socket.PF_RDS
1994
1995 def testCreateSocket(self):
1996 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1997 pass
1998
1999 def testSocketBufferSize(self):
2000 bufsize = 16384
2001 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
2002 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
2003 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
2004
2005
2006@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002007class RDSTest(ThreadedRDSSocketTest):
2008
2009 def __init__(self, methodName='runTest'):
2010 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
2011
Charles-François Natali240c55f2011-11-10 20:33:36 +01002012 def setUp(self):
2013 super().setUp()
2014 self.evt = threading.Event()
2015
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002016 def testSendAndRecv(self):
2017 data, addr = self.serv.recvfrom(self.bufsize)
2018 self.assertEqual(self.data, data)
2019 self.assertEqual(self.cli_addr, addr)
2020
2021 def _testSendAndRecv(self):
2022 self.data = b'spam'
2023 self.cli.sendto(self.data, 0, (HOST, self.port))
2024
2025 def testPeek(self):
2026 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
2027 self.assertEqual(self.data, data)
2028 data, addr = self.serv.recvfrom(self.bufsize)
2029 self.assertEqual(self.data, data)
2030
2031 def _testPeek(self):
2032 self.data = b'spam'
2033 self.cli.sendto(self.data, 0, (HOST, self.port))
2034
2035 @requireAttrs(socket.socket, 'recvmsg')
2036 def testSendAndRecvMsg(self):
2037 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
2038 self.assertEqual(self.data, data)
2039
2040 @requireAttrs(socket.socket, 'sendmsg')
2041 def _testSendAndRecvMsg(self):
2042 self.data = b'hello ' * 10
2043 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
2044
2045 def testSendAndRecvMulti(self):
2046 data, addr = self.serv.recvfrom(self.bufsize)
2047 self.assertEqual(self.data1, data)
2048
2049 data, addr = self.serv.recvfrom(self.bufsize)
2050 self.assertEqual(self.data2, data)
2051
2052 def _testSendAndRecvMulti(self):
2053 self.data1 = b'bacon'
2054 self.cli.sendto(self.data1, 0, (HOST, self.port))
2055
2056 self.data2 = b'egg'
2057 self.cli.sendto(self.data2, 0, (HOST, self.port))
2058
2059 def testSelect(self):
2060 r, w, x = select.select([self.serv], [], [], 3.0)
2061 self.assertIn(self.serv, r)
2062 data, addr = self.serv.recvfrom(self.bufsize)
2063 self.assertEqual(self.data, data)
2064
2065 def _testSelect(self):
2066 self.data = b'select'
2067 self.cli.sendto(self.data, 0, (HOST, self.port))
2068
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002069@unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
2070 'QIPCRTR sockets required for this test.')
2071class BasicQIPCRTRTest(unittest.TestCase):
2072
2073 def testCrucialConstants(self):
2074 socket.AF_QIPCRTR
2075
2076 def testCreateSocket(self):
2077 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2078 pass
2079
2080 def testUnbound(self):
2081 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2082 self.assertEqual(s.getsockname()[1], 0)
2083
2084 def testBindSock(self):
2085 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2086 support.bind_port(s, host=s.getsockname()[0])
2087 self.assertNotEqual(s.getsockname()[1], 0)
2088
2089 def testInvalidBindSock(self):
2090 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2091 self.assertRaises(OSError, support.bind_port, s, host=-2)
2092
2093 def testAutoBindSock(self):
2094 with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
2095 s.connect((123, 123))
2096 self.assertNotEqual(s.getsockname()[1], 0)
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002097
caaveryeffc12f2017-09-06 18:18:10 -04002098@unittest.skipIf(fcntl is None, "need fcntl")
2099@unittest.skipUnless(HAVE_SOCKET_VSOCK,
2100 'VSOCK sockets required for this test.')
2101class BasicVSOCKTest(unittest.TestCase):
2102
2103 def testCrucialConstants(self):
2104 socket.AF_VSOCK
2105
2106 def testVSOCKConstants(self):
2107 socket.SO_VM_SOCKETS_BUFFER_SIZE
2108 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
2109 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
2110 socket.VMADDR_CID_ANY
2111 socket.VMADDR_PORT_ANY
2112 socket.VMADDR_CID_HOST
2113 socket.VM_SOCKETS_INVALID_VERSION
2114 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
2115
2116 def testCreateSocket(self):
2117 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2118 pass
2119
2120 def testSocketBufferSize(self):
2121 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
2122 orig_max = s.getsockopt(socket.AF_VSOCK,
2123 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
2124 orig = s.getsockopt(socket.AF_VSOCK,
2125 socket.SO_VM_SOCKETS_BUFFER_SIZE)
2126 orig_min = s.getsockopt(socket.AF_VSOCK,
2127 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
2128
2129 s.setsockopt(socket.AF_VSOCK,
2130 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
2131 s.setsockopt(socket.AF_VSOCK,
2132 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
2133 s.setsockopt(socket.AF_VSOCK,
2134 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
2135
2136 self.assertEqual(orig_max * 2,
2137 s.getsockopt(socket.AF_VSOCK,
2138 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
2139 self.assertEqual(orig * 2,
2140 s.getsockopt(socket.AF_VSOCK,
2141 socket.SO_VM_SOCKETS_BUFFER_SIZE))
2142 self.assertEqual(orig_min * 2,
2143 s.getsockopt(socket.AF_VSOCK,
2144 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2145
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002146
Guido van Rossum24e4af82002-06-12 19:18:08 +00002147class BasicTCPTest(SocketConnectedTest):
2148
2149 def __init__(self, methodName='runTest'):
2150 SocketConnectedTest.__init__(self, methodName=methodName)
2151
2152 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002153 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002154 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002155 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002156
2157 def _testRecv(self):
2158 self.serv_conn.send(MSG)
2159
2160 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002161 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002162 seg1 = self.cli_conn.recv(len(MSG) - 3)
2163 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002164 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002165 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002166
2167 def _testOverFlowRecv(self):
2168 self.serv_conn.send(MSG)
2169
2170 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002171 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002172 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002173 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002174
2175 def _testRecvFrom(self):
2176 self.serv_conn.send(MSG)
2177
2178 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002179 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002180 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2181 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002182 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002183 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002184
2185 def _testOverFlowRecvFrom(self):
2186 self.serv_conn.send(MSG)
2187
2188 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002189 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002190 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002191 while 1:
2192 read = self.cli_conn.recv(1024)
2193 if not read:
2194 break
Guido van Rossume531e292002-08-08 20:28:34 +00002195 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002196 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002197
2198 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002199 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002200 self.serv_conn.sendall(big_chunk)
2201
2202 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002203 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002204 fd = self.cli_conn.fileno()
2205 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002206 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002207 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002208 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002209 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002210
2211 def _testFromFd(self):
2212 self.serv_conn.send(MSG)
2213
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002214 def testDup(self):
2215 # Testing dup()
2216 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002217 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002218 msg = sock.recv(1024)
2219 self.assertEqual(msg, MSG)
2220
2221 def _testDup(self):
2222 self.serv_conn.send(MSG)
2223
Guido van Rossum24e4af82002-06-12 19:18:08 +00002224 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002225 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002226 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002227 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002228 # wait for _testShutdown to finish: on OS X, when the server
2229 # closes the connection the client also becomes disconnected,
2230 # and the client's shutdown call will fail. (Issue #4397.)
2231 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002232
2233 def _testShutdown(self):
2234 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002235 self.serv_conn.shutdown(2)
2236
2237 testShutdown_overflow = support.cpython_only(testShutdown)
2238
2239 @support.cpython_only
2240 def _testShutdown_overflow(self):
2241 import _testcapi
2242 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002243 # Issue 15989
2244 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2245 _testcapi.INT_MAX + 1)
2246 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2247 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002248 self.serv_conn.shutdown(2)
2249
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002250 def testDetach(self):
2251 # Testing detach()
2252 fileno = self.cli_conn.fileno()
2253 f = self.cli_conn.detach()
2254 self.assertEqual(f, fileno)
2255 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002256 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002257 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002258 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002259 # ...but we can create another socket using the (still open)
2260 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002261 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002262 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002263 msg = sock.recv(1024)
2264 self.assertEqual(msg, MSG)
2265
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002266 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002267 self.serv_conn.send(MSG)
2268
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002269
Guido van Rossum24e4af82002-06-12 19:18:08 +00002270class BasicUDPTest(ThreadedUDPSocketTest):
2271
2272 def __init__(self, methodName='runTest'):
2273 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2274
2275 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002276 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002277 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002278 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002279
2280 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002281 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002282
Guido van Rossum1c938012002-06-12 21:17:20 +00002283 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002284 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002285 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002286 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002287
Guido van Rossum1c938012002-06-12 21:17:20 +00002288 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002289 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002290
Guido van Rossumd8faa362007-04-27 19:54:29 +00002291 def testRecvFromNegative(self):
2292 # Negative lengths passed to recvfrom should give ValueError.
2293 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2294
2295 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002296 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002297
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002298# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2299# same test code is used with different families and types of socket
2300# (e.g. stream, datagram), and tests using recvmsg() are repeated
2301# using recvmsg_into().
2302#
2303# The generic test classes such as SendmsgTests and
2304# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2305# supplied with sockets cli_sock and serv_sock representing the
2306# client's and the server's end of the connection respectively, and
2307# attributes cli_addr and serv_addr holding their (numeric where
2308# appropriate) addresses.
2309#
2310# The final concrete test classes combine these with subclasses of
2311# SocketTestBase which set up client and server sockets of a specific
2312# type, and with subclasses of SendrecvmsgBase such as
2313# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2314# sockets to cli_sock and serv_sock and override the methods and
2315# attributes of SendrecvmsgBase to fill in destination addresses if
2316# needed when sending, check for specific flags in msg_flags, etc.
2317#
2318# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2319# recvmsg_into().
2320
2321# XXX: like the other datagram (UDP) tests in this module, the code
2322# here assumes that datagram delivery on the local machine will be
2323# reliable.
2324
2325class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2326 # Base class for sendmsg()/recvmsg() tests.
2327
2328 # Time in seconds to wait before considering a test failed, or
2329 # None for no timeout. Not all tests actually set a timeout.
2330 fail_timeout = 3.0
2331
2332 def setUp(self):
2333 self.misc_event = threading.Event()
2334 super().setUp()
2335
2336 def sendToServer(self, msg):
2337 # Send msg to the server.
2338 return self.cli_sock.send(msg)
2339
2340 # Tuple of alternative default arguments for sendmsg() when called
2341 # via sendmsgToServer() (e.g. to include a destination address).
2342 sendmsg_to_server_defaults = ()
2343
2344 def sendmsgToServer(self, *args):
2345 # Call sendmsg() on self.cli_sock with the given arguments,
2346 # filling in any arguments which are not supplied with the
2347 # corresponding items of self.sendmsg_to_server_defaults, if
2348 # any.
2349 return self.cli_sock.sendmsg(
2350 *(args + self.sendmsg_to_server_defaults[len(args):]))
2351
2352 def doRecvmsg(self, sock, bufsize, *args):
2353 # Call recvmsg() on sock with given arguments and return its
2354 # result. Should be used for tests which can use either
2355 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2356 # this method with one which emulates it using recvmsg_into(),
2357 # thus allowing the same test to be used for both methods.
2358 result = sock.recvmsg(bufsize, *args)
2359 self.registerRecvmsgResult(result)
2360 return result
2361
2362 def registerRecvmsgResult(self, result):
2363 # Called by doRecvmsg() with the return value of recvmsg() or
2364 # recvmsg_into(). Can be overridden to arrange cleanup based
2365 # on the returned ancillary data, for instance.
2366 pass
2367
2368 def checkRecvmsgAddress(self, addr1, addr2):
2369 # Called to compare the received address with the address of
2370 # the peer.
2371 self.assertEqual(addr1, addr2)
2372
2373 # Flags that are normally unset in msg_flags
2374 msg_flags_common_unset = 0
2375 for name in ("MSG_CTRUNC", "MSG_OOB"):
2376 msg_flags_common_unset |= getattr(socket, name, 0)
2377
2378 # Flags that are normally set
2379 msg_flags_common_set = 0
2380
2381 # Flags set when a complete record has been received (e.g. MSG_EOR
2382 # for SCTP)
2383 msg_flags_eor_indicator = 0
2384
2385 # Flags set when a complete record has not been received
2386 # (e.g. MSG_TRUNC for datagram sockets)
2387 msg_flags_non_eor_indicator = 0
2388
2389 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2390 # Method to check the value of msg_flags returned by recvmsg[_into]().
2391 #
2392 # Checks that all bits in msg_flags_common_set attribute are
2393 # set in "flags" and all bits in msg_flags_common_unset are
2394 # unset.
2395 #
2396 # The "eor" argument specifies whether the flags should
2397 # indicate that a full record (or datagram) has been received.
2398 # If "eor" is None, no checks are done; otherwise, checks
2399 # that:
2400 #
2401 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2402 # set and all bits in msg_flags_non_eor_indicator are unset
2403 #
2404 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2405 # are set and all bits in msg_flags_eor_indicator are unset
2406 #
2407 # If "checkset" and/or "checkunset" are supplied, they require
2408 # the given bits to be set or unset respectively, overriding
2409 # what the attributes require for those bits.
2410 #
2411 # If any bits are set in "ignore", they will not be checked,
2412 # regardless of the other inputs.
2413 #
2414 # Will raise Exception if the inputs require a bit to be both
2415 # set and unset, and it is not ignored.
2416
2417 defaultset = self.msg_flags_common_set
2418 defaultunset = self.msg_flags_common_unset
2419
2420 if eor:
2421 defaultset |= self.msg_flags_eor_indicator
2422 defaultunset |= self.msg_flags_non_eor_indicator
2423 elif eor is not None:
2424 defaultset |= self.msg_flags_non_eor_indicator
2425 defaultunset |= self.msg_flags_eor_indicator
2426
2427 # Function arguments override defaults
2428 defaultset &= ~checkunset
2429 defaultunset &= ~checkset
2430
2431 # Merge arguments with remaining defaults, and check for conflicts
2432 checkset |= defaultset
2433 checkunset |= defaultunset
2434 inboth = checkset & checkunset & ~ignore
2435 if inboth:
2436 raise Exception("contradictory set, unset requirements for flags "
2437 "{0:#x}".format(inboth))
2438
2439 # Compare with given msg_flags value
2440 mask = (checkset | checkunset) & ~ignore
2441 self.assertEqual(flags & mask, checkset & mask)
2442
2443
2444class RecvmsgIntoMixin(SendrecvmsgBase):
2445 # Mixin to implement doRecvmsg() using recvmsg_into().
2446
2447 def doRecvmsg(self, sock, bufsize, *args):
2448 buf = bytearray(bufsize)
2449 result = sock.recvmsg_into([buf], *args)
2450 self.registerRecvmsgResult(result)
2451 self.assertGreaterEqual(result[0], 0)
2452 self.assertLessEqual(result[0], bufsize)
2453 return (bytes(buf[:result[0]]),) + result[1:]
2454
2455
2456class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2457 # Defines flags to be checked in msg_flags for datagram sockets.
2458
2459 @property
2460 def msg_flags_non_eor_indicator(self):
2461 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2462
2463
2464class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2465 # Defines flags to be checked in msg_flags for SCTP sockets.
2466
2467 @property
2468 def msg_flags_eor_indicator(self):
2469 return super().msg_flags_eor_indicator | socket.MSG_EOR
2470
2471
2472class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2473 # Base class for tests on connectionless-mode sockets. Users must
2474 # supply sockets on attributes cli and serv to be mapped to
2475 # cli_sock and serv_sock respectively.
2476
2477 @property
2478 def serv_sock(self):
2479 return self.serv
2480
2481 @property
2482 def cli_sock(self):
2483 return self.cli
2484
2485 @property
2486 def sendmsg_to_server_defaults(self):
2487 return ([], [], 0, self.serv_addr)
2488
2489 def sendToServer(self, msg):
2490 return self.cli_sock.sendto(msg, self.serv_addr)
2491
2492
2493class SendrecvmsgConnectedBase(SendrecvmsgBase):
2494 # Base class for tests on connected sockets. Users must supply
2495 # sockets on attributes serv_conn and cli_conn (representing the
2496 # connections *to* the server and the client), to be mapped to
2497 # cli_sock and serv_sock respectively.
2498
2499 @property
2500 def serv_sock(self):
2501 return self.cli_conn
2502
2503 @property
2504 def cli_sock(self):
2505 return self.serv_conn
2506
2507 def checkRecvmsgAddress(self, addr1, addr2):
2508 # Address is currently "unspecified" for a connected socket,
2509 # so we don't examine it
2510 pass
2511
2512
2513class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2514 # Base class to set a timeout on server's socket.
2515
2516 def setUp(self):
2517 super().setUp()
2518 self.serv_sock.settimeout(self.fail_timeout)
2519
2520
2521class SendmsgTests(SendrecvmsgServerTimeoutBase):
2522 # Tests for sendmsg() which can use any socket type and do not
2523 # involve recvmsg() or recvmsg_into().
2524
2525 def testSendmsg(self):
2526 # Send a simple message with sendmsg().
2527 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2528
2529 def _testSendmsg(self):
2530 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2531
2532 def testSendmsgDataGenerator(self):
2533 # Send from buffer obtained from a generator (not a sequence).
2534 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2535
2536 def _testSendmsgDataGenerator(self):
2537 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2538 len(MSG))
2539
2540 def testSendmsgAncillaryGenerator(self):
2541 # Gather (empty) ancillary data from a generator.
2542 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2543
2544 def _testSendmsgAncillaryGenerator(self):
2545 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2546 len(MSG))
2547
2548 def testSendmsgArray(self):
2549 # Send data from an array instead of the usual bytes object.
2550 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2551
2552 def _testSendmsgArray(self):
2553 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2554 len(MSG))
2555
2556 def testSendmsgGather(self):
2557 # Send message data from more than one buffer (gather write).
2558 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2559
2560 def _testSendmsgGather(self):
2561 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2562
2563 def testSendmsgBadArgs(self):
2564 # Check that sendmsg() rejects invalid arguments.
2565 self.assertEqual(self.serv_sock.recv(1000), b"done")
2566
2567 def _testSendmsgBadArgs(self):
2568 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2569 self.assertRaises(TypeError, self.sendmsgToServer,
2570 b"not in an iterable")
2571 self.assertRaises(TypeError, self.sendmsgToServer,
2572 object())
2573 self.assertRaises(TypeError, self.sendmsgToServer,
2574 [object()])
2575 self.assertRaises(TypeError, self.sendmsgToServer,
2576 [MSG, object()])
2577 self.assertRaises(TypeError, self.sendmsgToServer,
2578 [MSG], object())
2579 self.assertRaises(TypeError, self.sendmsgToServer,
2580 [MSG], [], object())
2581 self.assertRaises(TypeError, self.sendmsgToServer,
2582 [MSG], [], 0, object())
2583 self.sendToServer(b"done")
2584
2585 def testSendmsgBadCmsg(self):
2586 # Check that invalid ancillary data items are rejected.
2587 self.assertEqual(self.serv_sock.recv(1000), b"done")
2588
2589 def _testSendmsgBadCmsg(self):
2590 self.assertRaises(TypeError, self.sendmsgToServer,
2591 [MSG], [object()])
2592 self.assertRaises(TypeError, self.sendmsgToServer,
2593 [MSG], [(object(), 0, b"data")])
2594 self.assertRaises(TypeError, self.sendmsgToServer,
2595 [MSG], [(0, object(), b"data")])
2596 self.assertRaises(TypeError, self.sendmsgToServer,
2597 [MSG], [(0, 0, object())])
2598 self.assertRaises(TypeError, self.sendmsgToServer,
2599 [MSG], [(0, 0)])
2600 self.assertRaises(TypeError, self.sendmsgToServer,
2601 [MSG], [(0, 0, b"data", 42)])
2602 self.sendToServer(b"done")
2603
2604 @requireAttrs(socket, "CMSG_SPACE")
2605 def testSendmsgBadMultiCmsg(self):
2606 # Check that invalid ancillary data items are rejected when
2607 # more than one item is present.
2608 self.assertEqual(self.serv_sock.recv(1000), b"done")
2609
2610 @testSendmsgBadMultiCmsg.client_skip
2611 def _testSendmsgBadMultiCmsg(self):
2612 self.assertRaises(TypeError, self.sendmsgToServer,
2613 [MSG], [0, 0, b""])
2614 self.assertRaises(TypeError, self.sendmsgToServer,
2615 [MSG], [(0, 0, b""), object()])
2616 self.sendToServer(b"done")
2617
2618 def testSendmsgExcessCmsgReject(self):
2619 # Check that sendmsg() rejects excess ancillary data items
2620 # when the number that can be sent is limited.
2621 self.assertEqual(self.serv_sock.recv(1000), b"done")
2622
2623 def _testSendmsgExcessCmsgReject(self):
2624 if not hasattr(socket, "CMSG_SPACE"):
2625 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002626 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002627 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2628 self.assertIsNone(cm.exception.errno)
2629 self.sendToServer(b"done")
2630
2631 def testSendmsgAfterClose(self):
2632 # Check that sendmsg() fails on a closed socket.
2633 pass
2634
2635 def _testSendmsgAfterClose(self):
2636 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002637 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002638
2639
2640class SendmsgStreamTests(SendmsgTests):
2641 # Tests for sendmsg() which require a stream socket and do not
2642 # involve recvmsg() or recvmsg_into().
2643
2644 def testSendmsgExplicitNoneAddr(self):
2645 # Check that peer address can be specified as None.
2646 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2647
2648 def _testSendmsgExplicitNoneAddr(self):
2649 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2650
2651 def testSendmsgTimeout(self):
2652 # Check that timeout works with sendmsg().
2653 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2654 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2655
2656 def _testSendmsgTimeout(self):
2657 try:
2658 self.cli_sock.settimeout(0.03)
Victor Stinner46f40be2018-09-25 08:30:15 -07002659 try:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002660 while True:
2661 self.sendmsgToServer([b"a"*512])
Victor Stinner46f40be2018-09-25 08:30:15 -07002662 except socket.timeout:
2663 pass
2664 except OSError as exc:
2665 if exc.errno != errno.ENOMEM:
2666 raise
2667 # bpo-33937 the test randomly fails on Travis CI with
2668 # "OSError: [Errno 12] Cannot allocate memory"
2669 else:
2670 self.fail("socket.timeout not raised")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002671 finally:
2672 self.misc_event.set()
2673
2674 # XXX: would be nice to have more tests for sendmsg flags argument.
2675
2676 # Linux supports MSG_DONTWAIT when sending, but in general, it
2677 # only works when receiving. Could add other platforms if they
2678 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002679 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002680 "MSG_DONTWAIT not known to work on this platform when "
2681 "sending")
2682 def testSendmsgDontWait(self):
2683 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2684 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2685 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2686
2687 @testSendmsgDontWait.client_skip
2688 def _testSendmsgDontWait(self):
2689 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002690 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002691 while True:
2692 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
Victor Stinner46f40be2018-09-25 08:30:15 -07002693 # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
2694 # with "OSError: [Errno 12] Cannot allocate memory"
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002695 self.assertIn(cm.exception.errno,
Victor Stinner46f40be2018-09-25 08:30:15 -07002696 (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002697 finally:
2698 self.misc_event.set()
2699
2700
2701class SendmsgConnectionlessTests(SendmsgTests):
2702 # Tests for sendmsg() which require a connectionless-mode
2703 # (e.g. datagram) socket, and do not involve recvmsg() or
2704 # recvmsg_into().
2705
2706 def testSendmsgNoDestAddr(self):
2707 # Check that sendmsg() fails when no destination address is
2708 # given for unconnected socket.
2709 pass
2710
2711 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002712 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002713 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002714 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002715 [MSG], [], 0, None)
2716
2717
2718class RecvmsgGenericTests(SendrecvmsgBase):
2719 # Tests for recvmsg() which can also be emulated using
2720 # recvmsg_into(), and can use any socket type.
2721
2722 def testRecvmsg(self):
2723 # Receive a simple message with recvmsg[_into]().
2724 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2725 self.assertEqual(msg, MSG)
2726 self.checkRecvmsgAddress(addr, self.cli_addr)
2727 self.assertEqual(ancdata, [])
2728 self.checkFlags(flags, eor=True)
2729
2730 def _testRecvmsg(self):
2731 self.sendToServer(MSG)
2732
2733 def testRecvmsgExplicitDefaults(self):
2734 # Test recvmsg[_into]() with default arguments provided explicitly.
2735 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2736 len(MSG), 0, 0)
2737 self.assertEqual(msg, MSG)
2738 self.checkRecvmsgAddress(addr, self.cli_addr)
2739 self.assertEqual(ancdata, [])
2740 self.checkFlags(flags, eor=True)
2741
2742 def _testRecvmsgExplicitDefaults(self):
2743 self.sendToServer(MSG)
2744
2745 def testRecvmsgShorter(self):
2746 # Receive a message smaller than buffer.
2747 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2748 len(MSG) + 42)
2749 self.assertEqual(msg, MSG)
2750 self.checkRecvmsgAddress(addr, self.cli_addr)
2751 self.assertEqual(ancdata, [])
2752 self.checkFlags(flags, eor=True)
2753
2754 def _testRecvmsgShorter(self):
2755 self.sendToServer(MSG)
2756
2757 def testRecvmsgTrunc(self):
2758 # Receive part of message, check for truncation indicators.
2759 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2760 len(MSG) - 3)
2761 self.assertEqual(msg, MSG[:-3])
2762 self.checkRecvmsgAddress(addr, self.cli_addr)
2763 self.assertEqual(ancdata, [])
2764 self.checkFlags(flags, eor=False)
2765
2766 def _testRecvmsgTrunc(self):
2767 self.sendToServer(MSG)
2768
2769 def testRecvmsgShortAncillaryBuf(self):
2770 # Test ancillary data buffer too small to hold any ancillary data.
2771 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2772 len(MSG), 1)
2773 self.assertEqual(msg, MSG)
2774 self.checkRecvmsgAddress(addr, self.cli_addr)
2775 self.assertEqual(ancdata, [])
2776 self.checkFlags(flags, eor=True)
2777
2778 def _testRecvmsgShortAncillaryBuf(self):
2779 self.sendToServer(MSG)
2780
2781 def testRecvmsgLongAncillaryBuf(self):
2782 # Test large ancillary data buffer.
2783 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2784 len(MSG), 10240)
2785 self.assertEqual(msg, MSG)
2786 self.checkRecvmsgAddress(addr, self.cli_addr)
2787 self.assertEqual(ancdata, [])
2788 self.checkFlags(flags, eor=True)
2789
2790 def _testRecvmsgLongAncillaryBuf(self):
2791 self.sendToServer(MSG)
2792
2793 def testRecvmsgAfterClose(self):
2794 # Check that recvmsg[_into]() fails on a closed socket.
2795 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002796 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002797
2798 def _testRecvmsgAfterClose(self):
2799 pass
2800
2801 def testRecvmsgTimeout(self):
2802 # Check that timeout works.
2803 try:
2804 self.serv_sock.settimeout(0.03)
2805 self.assertRaises(socket.timeout,
2806 self.doRecvmsg, self.serv_sock, len(MSG))
2807 finally:
2808 self.misc_event.set()
2809
2810 def _testRecvmsgTimeout(self):
2811 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2812
2813 @requireAttrs(socket, "MSG_PEEK")
2814 def testRecvmsgPeek(self):
2815 # Check that MSG_PEEK in flags enables examination of pending
2816 # data without consuming it.
2817
2818 # Receive part of data with MSG_PEEK.
2819 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2820 len(MSG) - 3, 0,
2821 socket.MSG_PEEK)
2822 self.assertEqual(msg, MSG[:-3])
2823 self.checkRecvmsgAddress(addr, self.cli_addr)
2824 self.assertEqual(ancdata, [])
2825 # Ignoring MSG_TRUNC here (so this test is the same for stream
2826 # and datagram sockets). Some wording in POSIX seems to
2827 # suggest that it needn't be set when peeking, but that may
2828 # just be a slip.
2829 self.checkFlags(flags, eor=False,
2830 ignore=getattr(socket, "MSG_TRUNC", 0))
2831
2832 # Receive all data with MSG_PEEK.
2833 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2834 len(MSG), 0,
2835 socket.MSG_PEEK)
2836 self.assertEqual(msg, MSG)
2837 self.checkRecvmsgAddress(addr, self.cli_addr)
2838 self.assertEqual(ancdata, [])
2839 self.checkFlags(flags, eor=True)
2840
2841 # Check that the same data can still be received normally.
2842 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2843 self.assertEqual(msg, MSG)
2844 self.checkRecvmsgAddress(addr, self.cli_addr)
2845 self.assertEqual(ancdata, [])
2846 self.checkFlags(flags, eor=True)
2847
2848 @testRecvmsgPeek.client_skip
2849 def _testRecvmsgPeek(self):
2850 self.sendToServer(MSG)
2851
2852 @requireAttrs(socket.socket, "sendmsg")
2853 def testRecvmsgFromSendmsg(self):
2854 # Test receiving with recvmsg[_into]() when message is sent
2855 # using sendmsg().
2856 self.serv_sock.settimeout(self.fail_timeout)
2857 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2858 self.assertEqual(msg, MSG)
2859 self.checkRecvmsgAddress(addr, self.cli_addr)
2860 self.assertEqual(ancdata, [])
2861 self.checkFlags(flags, eor=True)
2862
2863 @testRecvmsgFromSendmsg.client_skip
2864 def _testRecvmsgFromSendmsg(self):
2865 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2866
2867
2868class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2869 # Tests which require a stream socket and can use either recvmsg()
2870 # or recvmsg_into().
2871
2872 def testRecvmsgEOF(self):
2873 # Receive end-of-stream indicator (b"", peer socket closed).
2874 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2875 self.assertEqual(msg, b"")
2876 self.checkRecvmsgAddress(addr, self.cli_addr)
2877 self.assertEqual(ancdata, [])
2878 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2879
2880 def _testRecvmsgEOF(self):
2881 self.cli_sock.close()
2882
2883 def testRecvmsgOverflow(self):
2884 # Receive a message in more than one chunk.
2885 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2886 len(MSG) - 3)
2887 self.checkRecvmsgAddress(addr, self.cli_addr)
2888 self.assertEqual(ancdata, [])
2889 self.checkFlags(flags, eor=False)
2890
2891 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2892 self.checkRecvmsgAddress(addr, self.cli_addr)
2893 self.assertEqual(ancdata, [])
2894 self.checkFlags(flags, eor=True)
2895
2896 msg = seg1 + seg2
2897 self.assertEqual(msg, MSG)
2898
2899 def _testRecvmsgOverflow(self):
2900 self.sendToServer(MSG)
2901
2902
2903class RecvmsgTests(RecvmsgGenericTests):
2904 # Tests for recvmsg() which can use any socket type.
2905
2906 def testRecvmsgBadArgs(self):
2907 # Check that recvmsg() rejects invalid arguments.
2908 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2909 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2910 -1, 0, 0)
2911 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2912 len(MSG), -1, 0)
2913 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2914 [bytearray(10)], 0, 0)
2915 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2916 object(), 0, 0)
2917 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2918 len(MSG), object(), 0)
2919 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2920 len(MSG), 0, object())
2921
2922 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2923 self.assertEqual(msg, MSG)
2924 self.checkRecvmsgAddress(addr, self.cli_addr)
2925 self.assertEqual(ancdata, [])
2926 self.checkFlags(flags, eor=True)
2927
2928 def _testRecvmsgBadArgs(self):
2929 self.sendToServer(MSG)
2930
2931
2932class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2933 # Tests for recvmsg_into() which can use any socket type.
2934
2935 def testRecvmsgIntoBadArgs(self):
2936 # Check that recvmsg_into() rejects invalid arguments.
2937 buf = bytearray(len(MSG))
2938 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2939 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2940 len(MSG), 0, 0)
2941 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2942 buf, 0, 0)
2943 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2944 [object()], 0, 0)
2945 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2946 [b"I'm not writable"], 0, 0)
2947 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2948 [buf, object()], 0, 0)
2949 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2950 [buf], -1, 0)
2951 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2952 [buf], object(), 0)
2953 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2954 [buf], 0, object())
2955
2956 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2957 self.assertEqual(nbytes, len(MSG))
2958 self.assertEqual(buf, bytearray(MSG))
2959 self.checkRecvmsgAddress(addr, self.cli_addr)
2960 self.assertEqual(ancdata, [])
2961 self.checkFlags(flags, eor=True)
2962
2963 def _testRecvmsgIntoBadArgs(self):
2964 self.sendToServer(MSG)
2965
2966 def testRecvmsgIntoGenerator(self):
2967 # Receive into buffer obtained from a generator (not a sequence).
2968 buf = bytearray(len(MSG))
2969 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2970 (o for o in [buf]))
2971 self.assertEqual(nbytes, len(MSG))
2972 self.assertEqual(buf, bytearray(MSG))
2973 self.checkRecvmsgAddress(addr, self.cli_addr)
2974 self.assertEqual(ancdata, [])
2975 self.checkFlags(flags, eor=True)
2976
2977 def _testRecvmsgIntoGenerator(self):
2978 self.sendToServer(MSG)
2979
2980 def testRecvmsgIntoArray(self):
2981 # Receive into an array rather than the usual bytearray.
2982 buf = array.array("B", [0] * len(MSG))
2983 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2984 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002985 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002986 self.checkRecvmsgAddress(addr, self.cli_addr)
2987 self.assertEqual(ancdata, [])
2988 self.checkFlags(flags, eor=True)
2989
2990 def _testRecvmsgIntoArray(self):
2991 self.sendToServer(MSG)
2992
2993 def testRecvmsgIntoScatter(self):
2994 # Receive into multiple buffers (scatter write).
2995 b1 = bytearray(b"----")
2996 b2 = bytearray(b"0123456789")
2997 b3 = bytearray(b"--------------")
2998 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2999 [b1, memoryview(b2)[2:9], b3])
3000 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
3001 self.assertEqual(b1, bytearray(b"Mary"))
3002 self.assertEqual(b2, bytearray(b"01 had a 9"))
3003 self.assertEqual(b3, bytearray(b"little lamb---"))
3004 self.checkRecvmsgAddress(addr, self.cli_addr)
3005 self.assertEqual(ancdata, [])
3006 self.checkFlags(flags, eor=True)
3007
3008 def _testRecvmsgIntoScatter(self):
3009 self.sendToServer(b"Mary had a little lamb")
3010
3011
3012class CmsgMacroTests(unittest.TestCase):
3013 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
3014 # assumptions used by sendmsg() and recvmsg[_into](), which share
3015 # code with these functions.
3016
3017 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003018 try:
3019 import _testcapi
3020 except ImportError:
3021 socklen_t_limit = 0x7fffffff
3022 else:
3023 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003024
3025 @requireAttrs(socket, "CMSG_LEN")
3026 def testCMSG_LEN(self):
3027 # Test CMSG_LEN() with various valid and invalid values,
3028 # checking the assumptions used by recvmsg() and sendmsg().
3029 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
3030 values = list(range(257)) + list(range(toobig - 257, toobig))
3031
3032 # struct cmsghdr has at least three members, two of which are ints
3033 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
3034 for n in values:
3035 ret = socket.CMSG_LEN(n)
3036 # This is how recvmsg() calculates the data size
3037 self.assertEqual(ret - socket.CMSG_LEN(0), n)
3038 self.assertLessEqual(ret, self.socklen_t_limit)
3039
3040 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
3041 # sendmsg() shares code with these functions, and requires
3042 # that it reject values over the limit.
3043 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
3044 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
3045
3046 @requireAttrs(socket, "CMSG_SPACE")
3047 def testCMSG_SPACE(self):
3048 # Test CMSG_SPACE() with various valid and invalid values,
3049 # checking the assumptions used by sendmsg().
3050 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
3051 values = list(range(257)) + list(range(toobig - 257, toobig))
3052
3053 last = socket.CMSG_SPACE(0)
3054 # struct cmsghdr has at least three members, two of which are ints
3055 self.assertGreater(last, array.array("i").itemsize * 2)
3056 for n in values:
3057 ret = socket.CMSG_SPACE(n)
3058 self.assertGreaterEqual(ret, last)
3059 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
3060 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
3061 self.assertLessEqual(ret, self.socklen_t_limit)
3062 last = ret
3063
3064 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
3065 # sendmsg() shares code with these functions, and requires
3066 # that it reject values over the limit.
3067 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
3068 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
3069
3070
3071class SCMRightsTest(SendrecvmsgServerTimeoutBase):
3072 # Tests for file descriptor passing on Unix-domain sockets.
3073
3074 # Invalid file descriptor value that's unlikely to evaluate to a
3075 # real FD even if one of its bytes is replaced with a different
3076 # value (which shouldn't actually happen).
3077 badfd = -0x5555
3078
3079 def newFDs(self, n):
3080 # Return a list of n file descriptors for newly-created files
3081 # containing their list indices as ASCII numbers.
3082 fds = []
3083 for i in range(n):
3084 fd, path = tempfile.mkstemp()
3085 self.addCleanup(os.unlink, path)
3086 self.addCleanup(os.close, fd)
3087 os.write(fd, str(i).encode())
3088 fds.append(fd)
3089 return fds
3090
3091 def checkFDs(self, fds):
3092 # Check that the file descriptors in the given list contain
3093 # their correct list indices as ASCII numbers.
3094 for n, fd in enumerate(fds):
3095 os.lseek(fd, 0, os.SEEK_SET)
3096 self.assertEqual(os.read(fd, 1024), str(n).encode())
3097
3098 def registerRecvmsgResult(self, result):
3099 self.addCleanup(self.closeRecvmsgFDs, result)
3100
3101 def closeRecvmsgFDs(self, recvmsg_result):
3102 # Close all file descriptors specified in the ancillary data
3103 # of the given return value from recvmsg() or recvmsg_into().
3104 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
3105 if (cmsg_level == socket.SOL_SOCKET and
3106 cmsg_type == socket.SCM_RIGHTS):
3107 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003108 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003109 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3110 for fd in fds:
3111 os.close(fd)
3112
3113 def createAndSendFDs(self, n):
3114 # Send n new file descriptors created by newFDs() to the
3115 # server, with the constant MSG as the non-ancillary data.
3116 self.assertEqual(
3117 self.sendmsgToServer([MSG],
3118 [(socket.SOL_SOCKET,
3119 socket.SCM_RIGHTS,
3120 array.array("i", self.newFDs(n)))]),
3121 len(MSG))
3122
3123 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
3124 # Check that constant MSG was received with numfds file
3125 # descriptors in a maximum of maxcmsgs control messages (which
3126 # must contain only complete integers). By default, check
3127 # that MSG_CTRUNC is unset, but ignore any flags in
3128 # ignoreflags.
3129 msg, ancdata, flags, addr = result
3130 self.assertEqual(msg, MSG)
3131 self.checkRecvmsgAddress(addr, self.cli_addr)
3132 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3133 ignore=ignoreflags)
3134
3135 self.assertIsInstance(ancdata, list)
3136 self.assertLessEqual(len(ancdata), maxcmsgs)
3137 fds = array.array("i")
3138 for item in ancdata:
3139 self.assertIsInstance(item, tuple)
3140 cmsg_level, cmsg_type, cmsg_data = item
3141 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3142 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3143 self.assertIsInstance(cmsg_data, bytes)
3144 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003145 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003146
3147 self.assertEqual(len(fds), numfds)
3148 self.checkFDs(fds)
3149
3150 def testFDPassSimple(self):
3151 # Pass a single FD (array read from bytes object).
3152 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3153 len(MSG), 10240))
3154
3155 def _testFDPassSimple(self):
3156 self.assertEqual(
3157 self.sendmsgToServer(
3158 [MSG],
3159 [(socket.SOL_SOCKET,
3160 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003161 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003162 len(MSG))
3163
3164 def testMultipleFDPass(self):
3165 # Pass multiple FDs in a single array.
3166 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3167 len(MSG), 10240))
3168
3169 def _testMultipleFDPass(self):
3170 self.createAndSendFDs(4)
3171
3172 @requireAttrs(socket, "CMSG_SPACE")
3173 def testFDPassCMSG_SPACE(self):
3174 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3175 self.checkRecvmsgFDs(
3176 4, self.doRecvmsg(self.serv_sock, len(MSG),
3177 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3178
3179 @testFDPassCMSG_SPACE.client_skip
3180 def _testFDPassCMSG_SPACE(self):
3181 self.createAndSendFDs(4)
3182
3183 def testFDPassCMSG_LEN(self):
3184 # Test using CMSG_LEN() to calculate ancillary buffer size.
3185 self.checkRecvmsgFDs(1,
3186 self.doRecvmsg(self.serv_sock, len(MSG),
3187 socket.CMSG_LEN(4 * SIZEOF_INT)),
3188 # RFC 3542 says implementations may set
3189 # MSG_CTRUNC if there isn't enough space
3190 # for trailing padding.
3191 ignoreflags=socket.MSG_CTRUNC)
3192
3193 def _testFDPassCMSG_LEN(self):
3194 self.createAndSendFDs(1)
3195
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003196 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003197 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003198 @requireAttrs(socket, "CMSG_SPACE")
3199 def testFDPassSeparate(self):
3200 # Pass two FDs in two separate arrays. Arrays may be combined
3201 # into a single control message by the OS.
3202 self.checkRecvmsgFDs(2,
3203 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3204 maxcmsgs=2)
3205
3206 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003207 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003208 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003209 def _testFDPassSeparate(self):
3210 fd0, fd1 = self.newFDs(2)
3211 self.assertEqual(
3212 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3213 socket.SCM_RIGHTS,
3214 array.array("i", [fd0])),
3215 (socket.SOL_SOCKET,
3216 socket.SCM_RIGHTS,
3217 array.array("i", [fd1]))]),
3218 len(MSG))
3219
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003220 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003221 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003222 @requireAttrs(socket, "CMSG_SPACE")
3223 def testFDPassSeparateMinSpace(self):
3224 # Pass two FDs in two separate arrays, receiving them into the
3225 # minimum space for two arrays.
Pablo Galindo72911082018-09-27 10:25:03 +01003226 num_fds = 2
3227 self.checkRecvmsgFDs(num_fds,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003228 self.doRecvmsg(self.serv_sock, len(MSG),
3229 socket.CMSG_SPACE(SIZEOF_INT) +
Pablo Galindo72911082018-09-27 10:25:03 +01003230 socket.CMSG_LEN(SIZEOF_INT * num_fds)),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003231 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3232
3233 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003234 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003235 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003236 def _testFDPassSeparateMinSpace(self):
3237 fd0, fd1 = self.newFDs(2)
3238 self.assertEqual(
3239 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3240 socket.SCM_RIGHTS,
3241 array.array("i", [fd0])),
3242 (socket.SOL_SOCKET,
3243 socket.SCM_RIGHTS,
3244 array.array("i", [fd1]))]),
3245 len(MSG))
3246
3247 def sendAncillaryIfPossible(self, msg, ancdata):
3248 # Try to send msg and ancdata to server, but if the system
3249 # call fails, just send msg with no ancillary data.
3250 try:
3251 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003252 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003253 # Check that it was the system call that failed
3254 self.assertIsInstance(e.errno, int)
3255 nbytes = self.sendmsgToServer([msg])
3256 self.assertEqual(nbytes, len(msg))
3257
Brett Cannon3bbad122015-12-28 17:21:44 -08003258 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003259 def testFDPassEmpty(self):
3260 # Try to pass an empty FD array. Can receive either no array
3261 # or an empty array.
3262 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3263 len(MSG), 10240),
3264 ignoreflags=socket.MSG_CTRUNC)
3265
3266 def _testFDPassEmpty(self):
3267 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3268 socket.SCM_RIGHTS,
3269 b"")])
3270
3271 def testFDPassPartialInt(self):
3272 # Try to pass a truncated FD array.
3273 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3274 len(MSG), 10240)
3275 self.assertEqual(msg, MSG)
3276 self.checkRecvmsgAddress(addr, self.cli_addr)
3277 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3278 self.assertLessEqual(len(ancdata), 1)
3279 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3280 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3281 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3282 self.assertLess(len(cmsg_data), SIZEOF_INT)
3283
3284 def _testFDPassPartialInt(self):
3285 self.sendAncillaryIfPossible(
3286 MSG,
3287 [(socket.SOL_SOCKET,
3288 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003289 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003290
3291 @requireAttrs(socket, "CMSG_SPACE")
3292 def testFDPassPartialIntInMiddle(self):
3293 # Try to pass two FD arrays, the first of which is truncated.
3294 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3295 len(MSG), 10240)
3296 self.assertEqual(msg, MSG)
3297 self.checkRecvmsgAddress(addr, self.cli_addr)
3298 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3299 self.assertLessEqual(len(ancdata), 2)
3300 fds = array.array("i")
3301 # Arrays may have been combined in a single control message
3302 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3303 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3304 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003305 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003306 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3307 self.assertLessEqual(len(fds), 2)
3308 self.checkFDs(fds)
3309
3310 @testFDPassPartialIntInMiddle.client_skip
3311 def _testFDPassPartialIntInMiddle(self):
3312 fd0, fd1 = self.newFDs(2)
3313 self.sendAncillaryIfPossible(
3314 MSG,
3315 [(socket.SOL_SOCKET,
3316 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003317 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003318 (socket.SOL_SOCKET,
3319 socket.SCM_RIGHTS,
3320 array.array("i", [fd1]))])
3321
3322 def checkTruncatedHeader(self, result, ignoreflags=0):
3323 # Check that no ancillary data items are returned when data is
3324 # truncated inside the cmsghdr structure.
3325 msg, ancdata, flags, addr = result
3326 self.assertEqual(msg, MSG)
3327 self.checkRecvmsgAddress(addr, self.cli_addr)
3328 self.assertEqual(ancdata, [])
3329 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3330 ignore=ignoreflags)
3331
3332 def testCmsgTruncNoBufSize(self):
3333 # Check that no ancillary data is received when no buffer size
3334 # is specified.
3335 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3336 # BSD seems to set MSG_CTRUNC only
3337 # if an item has been partially
3338 # received.
3339 ignoreflags=socket.MSG_CTRUNC)
3340
3341 def _testCmsgTruncNoBufSize(self):
3342 self.createAndSendFDs(1)
3343
3344 def testCmsgTrunc0(self):
3345 # Check that no ancillary data is received when buffer size is 0.
3346 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3347 ignoreflags=socket.MSG_CTRUNC)
3348
3349 def _testCmsgTrunc0(self):
3350 self.createAndSendFDs(1)
3351
3352 # Check that no ancillary data is returned for various non-zero
3353 # (but still too small) buffer sizes.
3354
3355 def testCmsgTrunc1(self):
3356 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3357
3358 def _testCmsgTrunc1(self):
3359 self.createAndSendFDs(1)
3360
3361 def testCmsgTrunc2Int(self):
3362 # The cmsghdr structure has at least three members, two of
3363 # which are ints, so we still shouldn't see any ancillary
3364 # data.
3365 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3366 SIZEOF_INT * 2))
3367
3368 def _testCmsgTrunc2Int(self):
3369 self.createAndSendFDs(1)
3370
3371 def testCmsgTruncLen0Minus1(self):
3372 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3373 socket.CMSG_LEN(0) - 1))
3374
3375 def _testCmsgTruncLen0Minus1(self):
3376 self.createAndSendFDs(1)
3377
3378 # The following tests try to truncate the control message in the
3379 # middle of the FD array.
3380
3381 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3382 # Check that file descriptor data is truncated to between
3383 # mindata and maxdata bytes when received with buffer size
3384 # ancbuf, and that any complete file descriptor numbers are
3385 # valid.
3386 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3387 len(MSG), ancbuf)
3388 self.assertEqual(msg, MSG)
3389 self.checkRecvmsgAddress(addr, self.cli_addr)
3390 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3391
3392 if mindata == 0 and ancdata == []:
3393 return
3394 self.assertEqual(len(ancdata), 1)
3395 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3396 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3397 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3398 self.assertGreaterEqual(len(cmsg_data), mindata)
3399 self.assertLessEqual(len(cmsg_data), maxdata)
3400 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003401 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003402 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3403 self.checkFDs(fds)
3404
3405 def testCmsgTruncLen0(self):
3406 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3407
3408 def _testCmsgTruncLen0(self):
3409 self.createAndSendFDs(1)
3410
3411 def testCmsgTruncLen0Plus1(self):
3412 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3413
3414 def _testCmsgTruncLen0Plus1(self):
3415 self.createAndSendFDs(2)
3416
3417 def testCmsgTruncLen1(self):
3418 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3419 maxdata=SIZEOF_INT)
3420
3421 def _testCmsgTruncLen1(self):
3422 self.createAndSendFDs(2)
3423
3424 def testCmsgTruncLen2Minus1(self):
3425 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3426 maxdata=(2 * SIZEOF_INT) - 1)
3427
3428 def _testCmsgTruncLen2Minus1(self):
3429 self.createAndSendFDs(2)
3430
3431
3432class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3433 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3434 # features of the RFC 3542 Advanced Sockets API for IPv6.
3435 # Currently we can only handle certain data items (e.g. traffic
3436 # class, hop limit, MTU discovery and fragmentation settings)
3437 # without resorting to unportable means such as the struct module,
3438 # but the tests here are aimed at testing the ancillary data
3439 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3440 # itself.
3441
3442 # Test value to use when setting hop limit of packet
3443 hop_limit = 2
3444
3445 # Test value to use when setting traffic class of packet.
3446 # -1 means "use kernel default".
3447 traffic_class = -1
3448
3449 def ancillaryMapping(self, ancdata):
3450 # Given ancillary data list ancdata, return a mapping from
3451 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3452 # Check that no (level, type) pair appears more than once.
3453 d = {}
3454 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3455 self.assertNotIn((cmsg_level, cmsg_type), d)
3456 d[(cmsg_level, cmsg_type)] = cmsg_data
3457 return d
3458
3459 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3460 # Receive hop limit into ancbufsize bytes of ancillary data
3461 # space. Check that data is MSG, ancillary data is not
3462 # truncated (but ignore any flags in ignoreflags), and hop
3463 # limit is between 0 and maxhop inclusive.
3464 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3465 socket.IPV6_RECVHOPLIMIT, 1)
3466 self.misc_event.set()
3467 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3468 len(MSG), ancbufsize)
3469
3470 self.assertEqual(msg, MSG)
3471 self.checkRecvmsgAddress(addr, self.cli_addr)
3472 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3473 ignore=ignoreflags)
3474
3475 self.assertEqual(len(ancdata), 1)
3476 self.assertIsInstance(ancdata[0], tuple)
3477 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3478 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3479 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3480 self.assertIsInstance(cmsg_data, bytes)
3481 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3482 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003483 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003484 self.assertGreaterEqual(a[0], 0)
3485 self.assertLessEqual(a[0], maxhop)
3486
3487 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3488 def testRecvHopLimit(self):
3489 # Test receiving the packet hop limit as ancillary data.
3490 self.checkHopLimit(ancbufsize=10240)
3491
3492 @testRecvHopLimit.client_skip
3493 def _testRecvHopLimit(self):
3494 # Need to wait until server has asked to receive ancillary
3495 # data, as implementations are not required to buffer it
3496 # otherwise.
3497 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3498 self.sendToServer(MSG)
3499
3500 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3501 def testRecvHopLimitCMSG_SPACE(self):
3502 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3503 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3504
3505 @testRecvHopLimitCMSG_SPACE.client_skip
3506 def _testRecvHopLimitCMSG_SPACE(self):
3507 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3508 self.sendToServer(MSG)
3509
3510 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3511 # 3542 says portable applications must provide space for trailing
3512 # padding. Implementations may set MSG_CTRUNC if there isn't
3513 # enough space for the padding.
3514
3515 @requireAttrs(socket.socket, "sendmsg")
3516 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3517 def testSetHopLimit(self):
3518 # Test setting hop limit on outgoing packet and receiving it
3519 # at the other end.
3520 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3521
3522 @testSetHopLimit.client_skip
3523 def _testSetHopLimit(self):
3524 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3525 self.assertEqual(
3526 self.sendmsgToServer([MSG],
3527 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3528 array.array("i", [self.hop_limit]))]),
3529 len(MSG))
3530
3531 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3532 ignoreflags=0):
3533 # Receive traffic class and hop limit into ancbufsize bytes of
3534 # ancillary data space. Check that data is MSG, ancillary
3535 # data is not truncated (but ignore any flags in ignoreflags),
3536 # and traffic class and hop limit are in range (hop limit no
3537 # more than maxhop).
3538 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3539 socket.IPV6_RECVHOPLIMIT, 1)
3540 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3541 socket.IPV6_RECVTCLASS, 1)
3542 self.misc_event.set()
3543 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3544 len(MSG), ancbufsize)
3545
3546 self.assertEqual(msg, MSG)
3547 self.checkRecvmsgAddress(addr, self.cli_addr)
3548 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3549 ignore=ignoreflags)
3550 self.assertEqual(len(ancdata), 2)
3551 ancmap = self.ancillaryMapping(ancdata)
3552
3553 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3554 self.assertEqual(len(tcdata), SIZEOF_INT)
3555 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003556 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003557 self.assertGreaterEqual(a[0], 0)
3558 self.assertLessEqual(a[0], 255)
3559
3560 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3561 self.assertEqual(len(hldata), SIZEOF_INT)
3562 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003563 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003564 self.assertGreaterEqual(a[0], 0)
3565 self.assertLessEqual(a[0], maxhop)
3566
3567 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3568 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3569 def testRecvTrafficClassAndHopLimit(self):
3570 # Test receiving traffic class and hop limit as ancillary data.
3571 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3572
3573 @testRecvTrafficClassAndHopLimit.client_skip
3574 def _testRecvTrafficClassAndHopLimit(self):
3575 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3576 self.sendToServer(MSG)
3577
3578 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3579 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3580 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3581 # Test receiving traffic class and hop limit, using
3582 # CMSG_SPACE() to calculate buffer size.
3583 self.checkTrafficClassAndHopLimit(
3584 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3585
3586 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3587 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3588 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3589 self.sendToServer(MSG)
3590
3591 @requireAttrs(socket.socket, "sendmsg")
3592 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3593 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3594 def testSetTrafficClassAndHopLimit(self):
3595 # Test setting traffic class and hop limit on outgoing packet,
3596 # and receiving them at the other end.
3597 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3598 maxhop=self.hop_limit)
3599
3600 @testSetTrafficClassAndHopLimit.client_skip
3601 def _testSetTrafficClassAndHopLimit(self):
3602 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3603 self.assertEqual(
3604 self.sendmsgToServer([MSG],
3605 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3606 array.array("i", [self.traffic_class])),
3607 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3608 array.array("i", [self.hop_limit]))]),
3609 len(MSG))
3610
3611 @requireAttrs(socket.socket, "sendmsg")
3612 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3613 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3614 def testOddCmsgSize(self):
3615 # Try to send ancillary data with first item one byte too
3616 # long. Fall back to sending with correct size if this fails,
3617 # and check that second item was handled correctly.
3618 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3619 maxhop=self.hop_limit)
3620
3621 @testOddCmsgSize.client_skip
3622 def _testOddCmsgSize(self):
3623 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3624 try:
3625 nbytes = self.sendmsgToServer(
3626 [MSG],
3627 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003628 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003629 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3630 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003631 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003632 self.assertIsInstance(e.errno, int)
3633 nbytes = self.sendmsgToServer(
3634 [MSG],
3635 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3636 array.array("i", [self.traffic_class])),
3637 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3638 array.array("i", [self.hop_limit]))])
3639 self.assertEqual(nbytes, len(MSG))
3640
3641 # Tests for proper handling of truncated ancillary data
3642
3643 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3644 # Receive hop limit into ancbufsize bytes of ancillary data
3645 # space, which should be too small to contain the ancillary
3646 # data header (if ancbufsize is None, pass no second argument
3647 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3648 # (unless included in ignoreflags), and no ancillary data is
3649 # returned.
3650 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3651 socket.IPV6_RECVHOPLIMIT, 1)
3652 self.misc_event.set()
3653 args = () if ancbufsize is None else (ancbufsize,)
3654 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3655 len(MSG), *args)
3656
3657 self.assertEqual(msg, MSG)
3658 self.checkRecvmsgAddress(addr, self.cli_addr)
3659 self.assertEqual(ancdata, [])
3660 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3661 ignore=ignoreflags)
3662
3663 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3664 def testCmsgTruncNoBufSize(self):
3665 # Check that no ancillary data is received when no ancillary
3666 # buffer size is provided.
3667 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3668 # BSD seems to set
3669 # MSG_CTRUNC only if an item
3670 # has been partially
3671 # received.
3672 ignoreflags=socket.MSG_CTRUNC)
3673
3674 @testCmsgTruncNoBufSize.client_skip
3675 def _testCmsgTruncNoBufSize(self):
3676 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3677 self.sendToServer(MSG)
3678
3679 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3680 def testSingleCmsgTrunc0(self):
3681 # Check that no ancillary data is received when ancillary
3682 # buffer size is zero.
3683 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3684 ignoreflags=socket.MSG_CTRUNC)
3685
3686 @testSingleCmsgTrunc0.client_skip
3687 def _testSingleCmsgTrunc0(self):
3688 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3689 self.sendToServer(MSG)
3690
3691 # Check that no ancillary data is returned for various non-zero
3692 # (but still too small) buffer sizes.
3693
3694 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3695 def testSingleCmsgTrunc1(self):
3696 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3697
3698 @testSingleCmsgTrunc1.client_skip
3699 def _testSingleCmsgTrunc1(self):
3700 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3701 self.sendToServer(MSG)
3702
3703 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3704 def testSingleCmsgTrunc2Int(self):
3705 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3706
3707 @testSingleCmsgTrunc2Int.client_skip
3708 def _testSingleCmsgTrunc2Int(self):
3709 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3710 self.sendToServer(MSG)
3711
3712 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3713 def testSingleCmsgTruncLen0Minus1(self):
3714 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3715
3716 @testSingleCmsgTruncLen0Minus1.client_skip
3717 def _testSingleCmsgTruncLen0Minus1(self):
3718 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3719 self.sendToServer(MSG)
3720
3721 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3722 def testSingleCmsgTruncInData(self):
3723 # Test truncation of a control message inside its associated
3724 # data. The message may be returned with its data truncated,
3725 # or not returned at all.
3726 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3727 socket.IPV6_RECVHOPLIMIT, 1)
3728 self.misc_event.set()
3729 msg, ancdata, flags, addr = self.doRecvmsg(
3730 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3731
3732 self.assertEqual(msg, MSG)
3733 self.checkRecvmsgAddress(addr, self.cli_addr)
3734 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3735
3736 self.assertLessEqual(len(ancdata), 1)
3737 if ancdata:
3738 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3739 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3740 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3741 self.assertLess(len(cmsg_data), SIZEOF_INT)
3742
3743 @testSingleCmsgTruncInData.client_skip
3744 def _testSingleCmsgTruncInData(self):
3745 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3746 self.sendToServer(MSG)
3747
3748 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3749 # Receive traffic class and hop limit into ancbufsize bytes of
3750 # ancillary data space, which should be large enough to
3751 # contain the first item, but too small to contain the header
3752 # of the second. Check that data is MSG, MSG_CTRUNC is set
3753 # (unless included in ignoreflags), and only one ancillary
3754 # data item is returned.
3755 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3756 socket.IPV6_RECVHOPLIMIT, 1)
3757 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3758 socket.IPV6_RECVTCLASS, 1)
3759 self.misc_event.set()
3760 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3761 len(MSG), ancbufsize)
3762
3763 self.assertEqual(msg, MSG)
3764 self.checkRecvmsgAddress(addr, self.cli_addr)
3765 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3766 ignore=ignoreflags)
3767
3768 self.assertEqual(len(ancdata), 1)
3769 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3770 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3771 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3772 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3773 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003774 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003775 self.assertGreaterEqual(a[0], 0)
3776 self.assertLessEqual(a[0], 255)
3777
3778 # Try the above test with various buffer sizes.
3779
3780 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3781 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3782 def testSecondCmsgTrunc0(self):
3783 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3784 ignoreflags=socket.MSG_CTRUNC)
3785
3786 @testSecondCmsgTrunc0.client_skip
3787 def _testSecondCmsgTrunc0(self):
3788 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3789 self.sendToServer(MSG)
3790
3791 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3792 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3793 def testSecondCmsgTrunc1(self):
3794 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3795
3796 @testSecondCmsgTrunc1.client_skip
3797 def _testSecondCmsgTrunc1(self):
3798 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3799 self.sendToServer(MSG)
3800
3801 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3802 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3803 def testSecondCmsgTrunc2Int(self):
3804 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3805 2 * SIZEOF_INT)
3806
3807 @testSecondCmsgTrunc2Int.client_skip
3808 def _testSecondCmsgTrunc2Int(self):
3809 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3810 self.sendToServer(MSG)
3811
3812 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3813 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3814 def testSecondCmsgTruncLen0Minus1(self):
3815 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3816 socket.CMSG_LEN(0) - 1)
3817
3818 @testSecondCmsgTruncLen0Minus1.client_skip
3819 def _testSecondCmsgTruncLen0Minus1(self):
3820 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3821 self.sendToServer(MSG)
3822
3823 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3824 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3825 def testSecomdCmsgTruncInData(self):
3826 # Test truncation of the second of two control messages inside
3827 # its associated data.
3828 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3829 socket.IPV6_RECVHOPLIMIT, 1)
3830 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3831 socket.IPV6_RECVTCLASS, 1)
3832 self.misc_event.set()
3833 msg, ancdata, flags, addr = self.doRecvmsg(
3834 self.serv_sock, len(MSG),
3835 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3836
3837 self.assertEqual(msg, MSG)
3838 self.checkRecvmsgAddress(addr, self.cli_addr)
3839 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3840
3841 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3842
3843 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3844 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3845 cmsg_types.remove(cmsg_type)
3846 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3847 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003848 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003849 self.assertGreaterEqual(a[0], 0)
3850 self.assertLessEqual(a[0], 255)
3851
3852 if ancdata:
3853 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3854 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3855 cmsg_types.remove(cmsg_type)
3856 self.assertLess(len(cmsg_data), SIZEOF_INT)
3857
3858 self.assertEqual(ancdata, [])
3859
3860 @testSecomdCmsgTruncInData.client_skip
3861 def _testSecomdCmsgTruncInData(self):
3862 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3863 self.sendToServer(MSG)
3864
3865
3866# Derive concrete test classes for different socket types.
3867
3868class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3869 SendrecvmsgConnectionlessBase,
3870 ThreadedSocketTestMixin, UDPTestBase):
3871 pass
3872
3873@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003874class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3875 pass
3876
3877@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003878class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3879 pass
3880
3881@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003882class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3883 pass
3884
3885
3886class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3887 SendrecvmsgConnectionlessBase,
3888 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003889
3890 def checkRecvmsgAddress(self, addr1, addr2):
3891 # Called to compare the received address with the address of
3892 # the peer, ignoring scope ID
3893 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003894
3895@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003896@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003897@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003898class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3899 pass
3900
3901@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003902@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003903@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003904class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3905 pass
3906
3907@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003908@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003909@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003910class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3911 pass
3912
3913@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003914@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003915@requireAttrs(socket, "IPPROTO_IPV6")
3916@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003917class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3918 SendrecvmsgUDP6TestBase):
3919 pass
3920
3921@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003922@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003923@requireAttrs(socket, "IPPROTO_IPV6")
3924@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003925class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3926 RFC3542AncillaryTest,
3927 SendrecvmsgUDP6TestBase):
3928 pass
3929
3930
3931class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3932 ConnectedStreamTestMixin, TCPTestBase):
3933 pass
3934
3935@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003936class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3937 pass
3938
3939@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003940class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3941 SendrecvmsgTCPTestBase):
3942 pass
3943
3944@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003945class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3946 SendrecvmsgTCPTestBase):
3947 pass
3948
3949
3950class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3951 SendrecvmsgConnectedBase,
3952 ConnectedStreamTestMixin, SCTPStreamBase):
3953 pass
3954
3955@requireAttrs(socket.socket, "sendmsg")
3956@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003957class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3958 pass
3959
3960@requireAttrs(socket.socket, "recvmsg")
3961@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003962class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3963 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003964
3965 def testRecvmsgEOF(self):
3966 try:
3967 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3968 except OSError as e:
3969 if e.errno != errno.ENOTCONN:
3970 raise
3971 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972
3973@requireAttrs(socket.socket, "recvmsg_into")
3974@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003975class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3976 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003977
3978 def testRecvmsgEOF(self):
3979 try:
3980 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3981 except OSError as e:
3982 if e.errno != errno.ENOTCONN:
3983 raise
3984 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003985
3986
3987class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3988 ConnectedStreamTestMixin, UnixStreamBase):
3989 pass
3990
3991@requireAttrs(socket.socket, "sendmsg")
3992@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003993class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3994 pass
3995
3996@requireAttrs(socket.socket, "recvmsg")
3997@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003998class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3999 SendrecvmsgUnixStreamTestBase):
4000 pass
4001
4002@requireAttrs(socket.socket, "recvmsg_into")
4003@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004004class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
4005 SendrecvmsgUnixStreamTestBase):
4006 pass
4007
4008@requireAttrs(socket.socket, "sendmsg", "recvmsg")
4009@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004010class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
4011 pass
4012
4013@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
4014@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004015class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
4016 SendrecvmsgUnixStreamTestBase):
4017 pass
4018
4019
4020# Test interrupting the interruptible send/receive methods with a
4021# signal when a timeout is set. These tests avoid having multiple
4022# threads alive during the test so that the OS cannot deliver the
4023# signal to the wrong one.
4024
4025class InterruptedTimeoutBase(unittest.TestCase):
4026 # Base class for interrupted send/receive tests. Installs an
4027 # empty handler for SIGALRM and removes it on teardown, along with
4028 # any scheduled alarms.
4029
4030 def setUp(self):
4031 super().setUp()
4032 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00004033 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004034 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004035
4036 # Timeout for socket operations
4037 timeout = 4.0
4038
4039 # Provide setAlarm() method to schedule delivery of SIGALRM after
4040 # given number of seconds, or cancel it if zero, and an
4041 # appropriate time value to use. Use setitimer() if available.
4042 if hasattr(signal, "setitimer"):
4043 alarm_time = 0.05
4044
4045 def setAlarm(self, seconds):
4046 signal.setitimer(signal.ITIMER_REAL, seconds)
4047 else:
4048 # Old systems may deliver the alarm up to one second early
4049 alarm_time = 2
4050
4051 def setAlarm(self, seconds):
4052 signal.alarm(seconds)
4053
4054
4055# Require siginterrupt() in order to ensure that system calls are
4056# interrupted by default.
4057@requireAttrs(signal, "siginterrupt")
4058@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4059 "Don't have signal.alarm or signal.setitimer")
4060class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
4061 # Test interrupting the recv*() methods with signals when a
4062 # timeout is set.
4063
4064 def setUp(self):
4065 super().setUp()
4066 self.serv.settimeout(self.timeout)
4067
4068 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00004069 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004070 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004071 try:
4072 self.setAlarm(self.alarm_time)
4073 with self.assertRaises(ZeroDivisionError) as cm:
4074 func(*args, **kwargs)
4075 finally:
4076 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004077
4078 def testInterruptedRecvTimeout(self):
4079 self.checkInterruptedRecv(self.serv.recv, 1024)
4080
4081 def testInterruptedRecvIntoTimeout(self):
4082 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
4083
4084 def testInterruptedRecvfromTimeout(self):
4085 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
4086
4087 def testInterruptedRecvfromIntoTimeout(self):
4088 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
4089
4090 @requireAttrs(socket.socket, "recvmsg")
4091 def testInterruptedRecvmsgTimeout(self):
4092 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
4093
4094 @requireAttrs(socket.socket, "recvmsg_into")
4095 def testInterruptedRecvmsgIntoTimeout(self):
4096 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
4097
4098
4099# Require siginterrupt() in order to ensure that system calls are
4100# interrupted by default.
4101@requireAttrs(signal, "siginterrupt")
4102@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
4103 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
4105 ThreadSafeCleanupTestCase,
4106 SocketListeningTestMixin, TCPTestBase):
4107 # Test interrupting the interruptible send*() methods with signals
4108 # when a timeout is set.
4109
4110 def setUp(self):
4111 super().setUp()
4112 self.serv_conn = self.newSocket()
4113 self.addCleanup(self.serv_conn.close)
4114 # Use a thread to complete the connection, but wait for it to
4115 # terminate before running the test, so that there is only one
4116 # thread to accept the signal.
4117 cli_thread = threading.Thread(target=self.doConnect)
4118 cli_thread.start()
4119 self.cli_conn, addr = self.serv.accept()
4120 self.addCleanup(self.cli_conn.close)
4121 cli_thread.join()
4122 self.serv_conn.settimeout(self.timeout)
4123
4124 def doConnect(self):
4125 self.serv_conn.connect(self.serv_addr)
4126
4127 def checkInterruptedSend(self, func, *args, **kwargs):
4128 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02004129 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004130 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07004131 try:
4132 with self.assertRaises(ZeroDivisionError) as cm:
4133 while True:
4134 self.setAlarm(self.alarm_time)
4135 func(*args, **kwargs)
4136 finally:
4137 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004138
Ned Deilyc5640382014-02-03 13:58:31 -08004139 # Issue #12958: The following tests have problems on OS X prior to 10.7
4140 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004141 def testInterruptedSendTimeout(self):
4142 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
4143
Ned Deilyc5640382014-02-03 13:58:31 -08004144 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004145 def testInterruptedSendtoTimeout(self):
4146 # Passing an actual address here as Python's wrapper for
4147 # sendto() doesn't allow passing a zero-length one; POSIX
4148 # requires that the address is ignored since the socket is
4149 # connection-mode, however.
4150 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
4151 self.serv_addr)
4152
Ned Deilyc5640382014-02-03 13:58:31 -08004153 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004154 @requireAttrs(socket.socket, "sendmsg")
4155 def testInterruptedSendmsgTimeout(self):
4156 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4157
4158
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004159class TCPCloserTest(ThreadedTCPSocketTest):
4160
4161 def testClose(self):
4162 conn, addr = self.serv.accept()
4163 conn.close()
4164
4165 sd = self.cli
4166 read, write, err = select.select([sd], [], [], 1.0)
4167 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004168 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004169
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004170 # Calling close() many times should be safe.
4171 conn.close()
4172 conn.close()
4173
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004174 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004175 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004176 time.sleep(1.0)
4177
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004178
Dave Cole331708b2004-08-09 04:51:41 +00004179class BasicSocketPairTest(SocketPairTest):
4180
4181 def __init__(self, methodName='runTest'):
4182 SocketPairTest.__init__(self, methodName=methodName)
4183
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004184 def _check_defaults(self, sock):
4185 self.assertIsInstance(sock, socket.socket)
4186 if hasattr(socket, 'AF_UNIX'):
4187 self.assertEqual(sock.family, socket.AF_UNIX)
4188 else:
4189 self.assertEqual(sock.family, socket.AF_INET)
4190 self.assertEqual(sock.type, socket.SOCK_STREAM)
4191 self.assertEqual(sock.proto, 0)
4192
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004193 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004194 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004195
4196 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004197 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004198
Dave Cole331708b2004-08-09 04:51:41 +00004199 def testRecv(self):
4200 msg = self.serv.recv(1024)
4201 self.assertEqual(msg, MSG)
4202
4203 def _testRecv(self):
4204 self.cli.send(MSG)
4205
4206 def testSend(self):
4207 self.serv.send(MSG)
4208
4209 def _testSend(self):
4210 msg = self.cli.recv(1024)
4211 self.assertEqual(msg, MSG)
4212
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004213
Guido van Rossum24e4af82002-06-12 19:18:08 +00004214class NonBlockingTCPTests(ThreadedTCPSocketTest):
4215
4216 def __init__(self, methodName='runTest'):
4217 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4218
4219 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004220 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004221 self.serv.setblocking(True)
4222 self.assertIsNone(self.serv.gettimeout())
Yury Selivanovf11b4602018-01-28 17:27:38 -05004223 self.assertTrue(self.serv.getblocking())
4224 if fcntl:
4225 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4226
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004227 self.serv.setblocking(False)
4228 self.assertEqual(self.serv.gettimeout(), 0.0)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004229 self.assertFalse(self.serv.getblocking())
4230 if fcntl:
4231 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4232
4233 self.serv.settimeout(None)
4234 self.assertTrue(self.serv.getblocking())
4235 if fcntl:
4236 self.assertTrue(_is_fd_in_blocking_mode(self.serv))
4237
4238 self.serv.settimeout(0)
4239 self.assertFalse(self.serv.getblocking())
4240 self.assertEqual(self.serv.gettimeout(), 0)
4241 if fcntl:
4242 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4243
4244 self.serv.settimeout(10)
4245 self.assertTrue(self.serv.getblocking())
4246 self.assertEqual(self.serv.gettimeout(), 10)
4247 if fcntl:
4248 # When a Python socket has a non-zero timeout, it's
4249 # switched internally to a non-blocking mode.
4250 # Later, sock.sendall(), sock.recv(), and other socket
4251 # operations use a `select()` call and handle EWOULDBLOCK/EGAIN
4252 # on all socket operations. That's how timeouts are
4253 # enforced.
4254 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4255
4256 self.serv.settimeout(0)
4257 self.assertFalse(self.serv.getblocking())
4258 if fcntl:
4259 self.assertFalse(_is_fd_in_blocking_mode(self.serv))
4260
Guido van Rossum24e4af82002-06-12 19:18:08 +00004261 start = time.time()
4262 try:
4263 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004264 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004265 pass
4266 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004267 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004268
4269 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004270 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004271
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004272 @support.cpython_only
4273 def testSetBlocking_overflow(self):
4274 # Issue 15989
4275 import _testcapi
4276 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4277 self.skipTest('needs UINT_MAX < ULONG_MAX')
4278 self.serv.setblocking(False)
4279 self.assertEqual(self.serv.gettimeout(), 0.0)
4280 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4281 self.assertIsNone(self.serv.gettimeout())
4282
4283 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4284
Serhiy Storchaka43767632013-11-03 21:31:38 +02004285 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4286 'test needs socket.SOCK_NONBLOCK')
4287 @support.requires_linux_version(2, 6, 28)
4288 def testInitNonBlocking(self):
4289 # reinit server socket
4290 self.serv.close()
4291 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4292 socket.SOCK_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05004293 self.assertFalse(self.serv.getblocking())
4294 self.assertEqual(self.serv.gettimeout(), 0)
Serhiy Storchaka43767632013-11-03 21:31:38 +02004295 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004296 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004297 # actual testing
4298 start = time.time()
4299 try:
4300 self.serv.accept()
4301 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004302 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004303 end = time.time()
4304 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4305
4306 def _testInitNonBlocking(self):
4307 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004308
Antoine Pitrou600232b2011-01-05 21:03:42 +00004309 def testInheritFlags(self):
4310 # Issue #7995: when calling accept() on a listening socket with a
4311 # timeout, the resulting socket should not be non-blocking.
4312 self.serv.settimeout(10)
4313 try:
4314 conn, addr = self.serv.accept()
4315 message = conn.recv(len(MSG))
4316 finally:
4317 conn.close()
4318 self.serv.settimeout(None)
4319
4320 def _testInheritFlags(self):
4321 time.sleep(0.1)
4322 self.cli.connect((HOST, self.port))
4323 time.sleep(0.5)
4324 self.cli.send(MSG)
4325
Guido van Rossum24e4af82002-06-12 19:18:08 +00004326 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004327 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004328 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004329 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004330 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004331 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004332 pass
4333 else:
4334 self.fail("Error trying to do non-blocking accept.")
4335 read, write, err = select.select([self.serv], [], [])
4336 if self.serv in read:
4337 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004338 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004339 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004340 else:
4341 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004342
Guido van Rossum24e4af82002-06-12 19:18:08 +00004343 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004344 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004345 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004346
4347 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004348 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004349 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004350 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004351
4352 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004353 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004354 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004355
4356 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004357 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004358 conn, addr = self.serv.accept()
4359 conn.setblocking(0)
4360 try:
4361 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004362 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004363 pass
4364 else:
4365 self.fail("Error trying to do non-blocking recv.")
4366 read, write, err = select.select([conn], [], [])
4367 if conn in read:
4368 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004369 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004370 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004371 else:
4372 self.fail("Error during select call to non-blocking socket.")
4373
4374 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004375 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004376 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004377 self.cli.send(MSG)
4378
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004379
Guido van Rossum24e4af82002-06-12 19:18:08 +00004380class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004381 """Unit tests for the object returned by socket.makefile()
4382
Antoine Pitrou834bd812010-10-13 16:17:14 +00004383 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004384 the client connection. You can read from this file to
4385 get output from the server.
4386
Antoine Pitrou834bd812010-10-13 16:17:14 +00004387 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004388 server connection. You can write to this file to send output
4389 to the client.
4390 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004391
Guido van Rossume9f66142002-08-07 15:46:19 +00004392 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004393 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004394 errors = 'strict'
4395 newline = None
4396
4397 read_mode = 'rb'
4398 read_msg = MSG
4399 write_mode = 'wb'
4400 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004401
Guido van Rossum24e4af82002-06-12 19:18:08 +00004402 def __init__(self, methodName='runTest'):
4403 SocketConnectedTest.__init__(self, methodName=methodName)
4404
4405 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004406 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4407 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004408 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004409 self.read_file = self.cli_conn.makefile(
4410 self.read_mode, self.bufsize,
4411 encoding = self.encoding,
4412 errors = self.errors,
4413 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004414
4415 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004416 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004417 self.read_file.close()
4418 self.assertTrue(self.read_file.closed)
4419 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004420 SocketConnectedTest.tearDown(self)
4421
4422 def clientSetUp(self):
4423 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004424 self.write_file = self.serv_conn.makefile(
4425 self.write_mode, self.bufsize,
4426 encoding = self.encoding,
4427 errors = self.errors,
4428 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004429
4430 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004431 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004432 self.write_file.close()
4433 self.assertTrue(self.write_file.closed)
4434 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004435 SocketConnectedTest.clientTearDown(self)
4436
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004437 def testReadAfterTimeout(self):
4438 # Issue #7322: A file object must disallow further reads
4439 # after a timeout has occurred.
4440 self.cli_conn.settimeout(1)
4441 self.read_file.read(3)
4442 # First read raises a timeout
4443 self.assertRaises(socket.timeout, self.read_file.read, 1)
4444 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004445 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004446 self.read_file.read(1)
4447 self.assertIn("cannot read from timed out object", str(ctx.exception))
4448
4449 def _testReadAfterTimeout(self):
4450 self.write_file.write(self.write_msg[0:3])
4451 self.write_file.flush()
4452 self.serv_finished.wait()
4453
Guido van Rossum24e4af82002-06-12 19:18:08 +00004454 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004455 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004456 first_seg = self.read_file.read(len(self.read_msg)-3)
4457 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004458 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004459 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004460
4461 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004462 self.write_file.write(self.write_msg)
4463 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004464
Guido van Rossum8c943832002-08-08 01:00:28 +00004465 def testFullRead(self):
4466 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004467 msg = self.read_file.read()
4468 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004469
4470 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004471 self.write_file.write(self.write_msg)
4472 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004473
Guido van Rossum24e4af82002-06-12 19:18:08 +00004474 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004475 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004476 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004477 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004478 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004479 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004480 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004481 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004482 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004483
4484 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004485 self.write_file.write(self.write_msg)
4486 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004487
4488 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004489 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004490 line = self.read_file.readline()
4491 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004492
4493 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004494 self.write_file.write(self.write_msg)
4495 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004496
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004497 def testCloseAfterMakefile(self):
4498 # The file returned by makefile should keep the socket open.
4499 self.cli_conn.close()
4500 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004501 msg = self.read_file.read()
4502 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004503
4504 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004505 self.write_file.write(self.write_msg)
4506 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004507
4508 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004509 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004510 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004511 if isinstance(self.read_msg, str):
4512 msg = msg.decode()
4513 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004514
4515 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004516 self.write_file.write(self.write_msg)
4517 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004518
Tim Peters116d83c2004-03-28 02:20:45 +00004519 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004520 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004521
4522 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004523 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004524
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004525 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004526 self.assertEqual(self.read_file.mode, self.read_mode)
4527 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004528
4529 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004530 self.assertEqual(self.write_file.mode, self.write_mode)
4531 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004532
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004533 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004534 self.read_file.close()
4535 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004536 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004537 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004538
4539 def _testRealClose(self):
4540 pass
4541
4542
Guido van Rossume9f66142002-08-07 15:46:19 +00004543class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4544
4545 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004546
Guido van Rossume9f66142002-08-07 15:46:19 +00004547 In this case (and in this case only), it should be possible to
4548 create a file object, read a line from it, create another file
4549 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004550 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004551 when reading multiple requests from the same socket."""
4552
4553 bufsize = 0 # Use unbuffered mode
4554
4555 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004556 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004557 line = self.read_file.readline() # first line
4558 self.assertEqual(line, b"A. " + self.write_msg) # first line
4559 self.read_file = self.cli_conn.makefile('rb', 0)
4560 line = self.read_file.readline() # second line
4561 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004562
4563 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004564 self.write_file.write(b"A. " + self.write_msg)
4565 self.write_file.write(b"B. " + self.write_msg)
4566 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004567
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004568 def testMakefileClose(self):
4569 # The file returned by makefile should keep the socket open...
4570 self.cli_conn.close()
4571 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004572 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004573 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004574 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004575 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004576
4577 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004578 self.write_file.write(self.write_msg)
4579 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004580
4581 def testMakefileCloseSocketDestroy(self):
4582 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004583 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004584 refcount_after = sys.getrefcount(self.cli_conn)
4585 self.assertEqual(refcount_before - 1, refcount_after)
4586
4587 def _testMakefileCloseSocketDestroy(self):
4588 pass
4589
Antoine Pitrou98b46702010-09-18 22:59:00 +00004590 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004591 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004592 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4593
4594 def testSmallReadNonBlocking(self):
4595 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004596 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4597 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004598 self.evt1.set()
4599 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004600 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004601 if first_seg is None:
4602 # Data not arrived (can happen under Windows), wait a bit
4603 time.sleep(0.5)
4604 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004605 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004606 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004607 self.assertEqual(n, 3)
4608 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004609 self.assertEqual(msg, self.read_msg)
4610 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4611 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004612
4613 def _testSmallReadNonBlocking(self):
4614 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004615 self.write_file.write(self.write_msg)
4616 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004617 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004618 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004619 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4620 self.serv_finished.wait(5.0)
4621
4622 def testWriteNonBlocking(self):
4623 self.cli_finished.wait(5.0)
4624 # The client thread can't skip directly - the SkipTest exception
4625 # would appear as a failure.
4626 if self.serv_skipped:
4627 self.skipTest(self.serv_skipped)
4628
4629 def _testWriteNonBlocking(self):
4630 self.serv_skipped = None
4631 self.serv_conn.setblocking(False)
4632 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004633 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004634 LIMIT = 10
4635 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004636 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004637 self.assertGreater(n, 0)
4638 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004639 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004640 if n is None:
4641 # Succeeded
4642 break
4643 self.assertGreater(n, 0)
4644 else:
4645 # Let us know that this test didn't manage to establish
4646 # the expected conditions. This is not a failure in itself but,
4647 # if it happens repeatedly, the test should be fixed.
4648 self.serv_skipped = "failed to saturate the socket buffer"
4649
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004650
Guido van Rossum8c943832002-08-08 01:00:28 +00004651class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4652
4653 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4654
4655
4656class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4657
4658 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004659
Thomas Woutersb2137042007-02-01 18:02:27 +00004660
Antoine Pitrou834bd812010-10-13 16:17:14 +00004661class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4662 """Tests for socket.makefile() in text mode (rather than binary)"""
4663
4664 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004665 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004666 write_mode = 'wb'
4667 write_msg = MSG
4668 newline = ''
4669
4670
4671class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4672 """Tests for socket.makefile() in text mode (rather than binary)"""
4673
4674 read_mode = 'rb'
4675 read_msg = MSG
4676 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004677 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004678 newline = ''
4679
4680
4681class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4682 """Tests for socket.makefile() in text mode (rather than binary)"""
4683
4684 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004685 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004686 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004687 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004688 newline = ''
4689
4690
Guido van Rossumd8faa362007-04-27 19:54:29 +00004691class NetworkConnectionTest(object):
4692 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004693
Guido van Rossumd8faa362007-04-27 19:54:29 +00004694 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004695 # We're inherited below by BasicTCPTest2, which also inherits
4696 # BasicTCPTest, which defines self.port referenced below.
4697 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004698 self.serv_conn = self.cli
4699
4700class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4701 """Tests that NetworkConnection does not break existing TCP functionality.
4702 """
4703
4704class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004705
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004706 class MockSocket(socket.socket):
4707 def connect(self, *args):
4708 raise socket.timeout('timed out')
4709
4710 @contextlib.contextmanager
4711 def mocked_socket_module(self):
4712 """Return a socket which times out on connect"""
4713 old_socket = socket.socket
4714 socket.socket = self.MockSocket
4715 try:
4716 yield
4717 finally:
4718 socket.socket = old_socket
4719
4720 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004721 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004722 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004723 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004724 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004725 cli.connect((HOST, port))
4726 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4727
4728 def test_create_connection(self):
4729 # Issue #9792: errors raised by create_connection() should have
4730 # a proper errno attribute.
4731 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004732 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004733 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004734
4735 # Issue #16257: create_connection() calls getaddrinfo() against
4736 # 'localhost'. This may result in an IPV6 addr being returned
4737 # as well as an IPV4 one:
4738 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4739 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4740 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4741 #
4742 # create_connection() enumerates through all the addresses returned
4743 # and if it doesn't successfully bind to any of them, it propagates
4744 # the last exception it encountered.
4745 #
4746 # On Solaris, ENETUNREACH is returned in this circumstance instead
4747 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4748 # expected errnos.
4749 expected_errnos = [ errno.ECONNREFUSED, ]
4750 if hasattr(errno, 'ENETUNREACH'):
4751 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004752 if hasattr(errno, 'EADDRNOTAVAIL'):
4753 # bpo-31910: socket.create_connection() fails randomly
4754 # with EADDRNOTAVAIL on Travis CI
4755 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004756
4757 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004758
4759 def test_create_connection_timeout(self):
4760 # Issue #9792: create_connection() should not recast timeout errors
4761 # as generic socket errors.
4762 with self.mocked_socket_module():
4763 with self.assertRaises(socket.timeout):
4764 socket.create_connection((HOST, 1234))
4765
Guido van Rossumd8faa362007-04-27 19:54:29 +00004766
4767class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4768
4769 def __init__(self, methodName='runTest'):
4770 SocketTCPTest.__init__(self, methodName=methodName)
4771 ThreadableTest.__init__(self)
4772
4773 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004774 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004775
4776 def clientTearDown(self):
4777 self.cli.close()
4778 self.cli = None
4779 ThreadableTest.clientTearDown(self)
4780
4781 def _justAccept(self):
4782 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004783 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004784
4785 testFamily = _justAccept
4786 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004787 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004788 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004789 self.assertEqual(self.cli.family, 2)
4790
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004791 testSourceAddress = _justAccept
4792 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004793 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4794 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004795 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004796 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004797 # The port number being used is sufficient to show that the bind()
4798 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004799
Guido van Rossumd8faa362007-04-27 19:54:29 +00004800 testTimeoutDefault = _justAccept
4801 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004802 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004803 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004804 socket.setdefaulttimeout(42)
4805 try:
4806 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004807 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004808 finally:
4809 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004810 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004811
4812 testTimeoutNone = _justAccept
4813 def _testTimeoutNone(self):
4814 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004815 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004816 socket.setdefaulttimeout(30)
4817 try:
4818 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004819 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004820 finally:
4821 socket.setdefaulttimeout(None)
4822 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004823
4824 testTimeoutValueNamed = _justAccept
4825 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004826 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004827 self.assertEqual(self.cli.gettimeout(), 30)
4828
4829 testTimeoutValueNonamed = _justAccept
4830 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004831 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004832 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004833 self.assertEqual(self.cli.gettimeout(), 30)
4834
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004835
Guido van Rossumd8faa362007-04-27 19:54:29 +00004836class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4837
4838 def __init__(self, methodName='runTest'):
4839 SocketTCPTest.__init__(self, methodName=methodName)
4840 ThreadableTest.__init__(self)
4841
4842 def clientSetUp(self):
4843 pass
4844
4845 def clientTearDown(self):
4846 self.cli.close()
4847 self.cli = None
4848 ThreadableTest.clientTearDown(self)
4849
4850 def testInsideTimeout(self):
4851 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004852 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004853 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004854 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004855 testOutsideTimeout = testInsideTimeout
4856
4857 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004858 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004859 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004860 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004861
4862 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004863 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004864 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004865
4866
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004867class TCPTimeoutTest(SocketTCPTest):
4868
4869 def testTCPTimeout(self):
4870 def raise_timeout(*args, **kwargs):
4871 self.serv.settimeout(1.0)
4872 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004873 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004874 "Error generating a timeout exception (TCP)")
4875
4876 def testTimeoutZero(self):
4877 ok = False
4878 try:
4879 self.serv.settimeout(0.0)
4880 foo = self.serv.accept()
4881 except socket.timeout:
4882 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004883 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004884 ok = True
4885 except:
4886 self.fail("caught unexpected exception (TCP)")
4887 if not ok:
4888 self.fail("accept() returned success when we did not expect it")
4889
Serhiy Storchaka43767632013-11-03 21:31:38 +02004890 @unittest.skipUnless(hasattr(signal, 'alarm'),
4891 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004892 def testInterruptedTimeout(self):
4893 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004894 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004895 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004896 self.serv.settimeout(5.0) # must be longer than alarm
4897 class Alarm(Exception):
4898 pass
4899 def alarm_handler(signal, frame):
4900 raise Alarm
4901 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4902 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004903 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004904 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004905 foo = self.serv.accept()
4906 except socket.timeout:
4907 self.fail("caught timeout instead of Alarm")
4908 except Alarm:
4909 pass
4910 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004911 self.fail("caught other exception instead of Alarm:"
4912 " %s(%s):\n%s" %
4913 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004914 else:
4915 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004916 finally:
4917 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004918 except Alarm:
4919 self.fail("got Alarm in wrong place")
4920 finally:
4921 # no alarm can be pending. Safe to restore old handler.
4922 signal.signal(signal.SIGALRM, old_alarm)
4923
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004924class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004925
4926 def testUDPTimeout(self):
4927 def raise_timeout(*args, **kwargs):
4928 self.serv.settimeout(1.0)
4929 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004930 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004931 "Error generating a timeout exception (UDP)")
4932
4933 def testTimeoutZero(self):
4934 ok = False
4935 try:
4936 self.serv.settimeout(0.0)
4937 foo = self.serv.recv(1024)
4938 except socket.timeout:
4939 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004940 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004941 ok = True
4942 except:
4943 self.fail("caught unexpected exception (UDP)")
4944 if not ok:
4945 self.fail("recv() returned success when we did not expect it")
4946
4947class TestExceptions(unittest.TestCase):
4948
4949 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004950 self.assertTrue(issubclass(OSError, Exception))
4951 self.assertTrue(issubclass(socket.herror, OSError))
4952 self.assertTrue(issubclass(socket.gaierror, OSError))
4953 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004954
Yury Selivanovfa22b292016-10-18 16:03:52 -04004955 def test_setblocking_invalidfd(self):
4956 # Regression test for issue #28471
4957
4958 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4959 sock = socket.socket(
4960 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4961 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004962 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004963
4964 with self.assertRaises(OSError):
4965 sock.setblocking(False)
4966
4967
Serhiy Storchaka43767632013-11-03 21:31:38 +02004968@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004969class TestLinuxAbstractNamespace(unittest.TestCase):
4970
4971 UNIX_PATH_MAX = 108
4972
4973 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004974 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004975 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4976 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004977 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004978 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4979 s2.connect(s1.getsockname())
4980 with s1.accept()[0] as s3:
4981 self.assertEqual(s1.getsockname(), address)
4982 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004983
4984 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004985 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004986 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4987 s.bind(address)
4988 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004989
4990 def testNameOverflow(self):
4991 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004992 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004993 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004994
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004995 def testStrName(self):
4996 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004997 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4998 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004999 s.bind("\x00python\x00test\x00")
5000 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005001 finally:
5002 s.close()
5003
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005004 def testBytearrayName(self):
5005 # Check that an abstract name can be passed as a bytearray.
5006 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
5007 s.bind(bytearray(b"\x00python\x00test\x00"))
5008 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
5009
Serhiy Storchaka43767632013-11-03 21:31:38 +02005010@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005011class TestUnixDomain(unittest.TestCase):
5012
5013 def setUp(self):
5014 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
5015
5016 def tearDown(self):
5017 self.sock.close()
5018
5019 def encoded(self, path):
5020 # Return the given path encoded in the file system encoding,
5021 # or skip the test if this is not possible.
5022 try:
5023 return os.fsencode(path)
5024 except UnicodeEncodeError:
5025 self.skipTest(
5026 "Pathname {0!a} cannot be represented in file "
5027 "system encoding {1!r}".format(
5028 path, sys.getfilesystemencoding()))
5029
Antoine Pitrou16374872011-12-16 15:04:12 +01005030 def bind(self, sock, path):
5031 # Bind the socket
5032 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01005033 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005034 except OSError as e:
5035 if str(e) == "AF_UNIX path too long":
5036 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02005037 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01005038 .format(path))
5039 else:
5040 raise
5041
Antoine Pitrou495b5022017-05-02 17:20:00 +02005042 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02005043 # Issue #30205 (note getsockname() can return None on OS X)
5044 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02005045
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005046 def testStrAddr(self):
5047 # Test binding to and retrieving a normal string pathname.
5048 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005049 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005050 self.addCleanup(support.unlink, path)
5051 self.assertEqual(self.sock.getsockname(), path)
5052
5053 def testBytesAddr(self):
5054 # Test binding to a bytes pathname.
5055 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01005056 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005057 self.addCleanup(support.unlink, path)
5058 self.assertEqual(self.sock.getsockname(), path)
5059
5060 def testSurrogateescapeBind(self):
5061 # Test binding to a valid non-ASCII pathname, with the
5062 # non-ASCII bytes supplied using surrogateescape encoding.
5063 path = os.path.abspath(support.TESTFN_UNICODE)
5064 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01005065 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005066 self.addCleanup(support.unlink, path)
5067 self.assertEqual(self.sock.getsockname(), path)
5068
5069 def testUnencodableAddr(self):
5070 # Test binding to a pathname that cannot be encoded in the
5071 # file system encoding.
5072 if support.TESTFN_UNENCODABLE is None:
5073 self.skipTest("No unencodable filename available")
5074 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01005075 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01005076 self.addCleanup(support.unlink, path)
5077 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00005078
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005079
Thomas Wouters477c8d52006-05-27 19:21:47 +00005080class BufferIOTest(SocketConnectedTest):
5081 """
5082 Test the buffer versions of socket.recv() and socket.send().
5083 """
5084 def __init__(self, methodName='runTest'):
5085 SocketConnectedTest.__init__(self, methodName=methodName)
5086
Antoine Pitrou25480782010-03-17 22:50:28 +00005087 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005088 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005089 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005090 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005091 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005092 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005093 self.assertEqual(msg, MSG)
5094
Antoine Pitrou25480782010-03-17 22:50:28 +00005095 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005096 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005097 self.serv_conn.send(buf)
5098
Antoine Pitrou25480782010-03-17 22:50:28 +00005099 def testRecvIntoBytearray(self):
5100 buf = bytearray(1024)
5101 nbytes = self.cli_conn.recv_into(buf)
5102 self.assertEqual(nbytes, len(MSG))
5103 msg = buf[:len(MSG)]
5104 self.assertEqual(msg, MSG)
5105
5106 _testRecvIntoBytearray = _testRecvIntoArray
5107
5108 def testRecvIntoMemoryview(self):
5109 buf = bytearray(1024)
5110 nbytes = self.cli_conn.recv_into(memoryview(buf))
5111 self.assertEqual(nbytes, len(MSG))
5112 msg = buf[:len(MSG)]
5113 self.assertEqual(msg, MSG)
5114
5115 _testRecvIntoMemoryview = _testRecvIntoArray
5116
5117 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03005118 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00005119 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005120 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03005121 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005122 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00005123 self.assertEqual(msg, MSG)
5124
Antoine Pitrou25480782010-03-17 22:50:28 +00005125 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00005126 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005127 self.serv_conn.send(buf)
5128
Antoine Pitrou25480782010-03-17 22:50:28 +00005129 def testRecvFromIntoBytearray(self):
5130 buf = bytearray(1024)
5131 nbytes, addr = self.cli_conn.recvfrom_into(buf)
5132 self.assertEqual(nbytes, len(MSG))
5133 msg = buf[:len(MSG)]
5134 self.assertEqual(msg, MSG)
5135
5136 _testRecvFromIntoBytearray = _testRecvFromIntoArray
5137
5138 def testRecvFromIntoMemoryview(self):
5139 buf = bytearray(1024)
5140 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
5141 self.assertEqual(nbytes, len(MSG))
5142 msg = buf[:len(MSG)]
5143 self.assertEqual(msg, MSG)
5144
5145 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
5146
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005147 def testRecvFromIntoSmallBuffer(self):
5148 # See issue #20246.
5149 buf = bytearray(8)
5150 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
5151
5152 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01005153 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05005154
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05005155 def testRecvFromIntoEmptyBuffer(self):
5156 buf = bytearray()
5157 self.cli_conn.recvfrom_into(buf)
5158 self.cli_conn.recvfrom_into(buf, 0)
5159
5160 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
5161
Christian Heimes043d6f62008-01-07 17:19:16 +00005162
5163TIPC_STYPE = 2000
5164TIPC_LOWER = 200
5165TIPC_UPPER = 210
5166
5167def isTipcAvailable():
5168 """Check if the TIPC module is loaded
5169
5170 The TIPC module is not loaded automatically on Ubuntu and probably
5171 other Linux distros.
5172 """
5173 if not hasattr(socket, "AF_TIPC"):
5174 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005175 try:
5176 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00005177 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00005178 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00005179 # have not the permission to read it.
5180 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00005181 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00005182 for line in f:
5183 if line.startswith("tipc "):
5184 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00005185 return False
5186
Serhiy Storchaka43767632013-11-03 21:31:38 +02005187@unittest.skipUnless(isTipcAvailable(),
5188 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005189class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00005190 def testRDM(self):
5191 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5192 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005193 self.addCleanup(srv.close)
5194 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005195
5196 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5197 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5198 TIPC_LOWER, TIPC_UPPER)
5199 srv.bind(srvaddr)
5200
5201 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5202 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5203 cli.sendto(MSG, sendaddr)
5204
5205 msg, recvaddr = srv.recvfrom(1024)
5206
5207 self.assertEqual(cli.getsockname(), recvaddr)
5208 self.assertEqual(msg, MSG)
5209
5210
Serhiy Storchaka43767632013-11-03 21:31:38 +02005211@unittest.skipUnless(isTipcAvailable(),
5212 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005213class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005214 def __init__(self, methodName = 'runTest'):
5215 unittest.TestCase.__init__(self, methodName = methodName)
5216 ThreadableTest.__init__(self)
5217
5218 def setUp(self):
5219 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005220 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005221 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5222 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5223 TIPC_LOWER, TIPC_UPPER)
5224 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005225 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005226 self.serverExplicitReady()
5227 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005228 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005229
5230 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005231 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005232 # accept() call; sleep a little while to avoid it, otherwise
5233 # we could get an exception
5234 time.sleep(0.1)
5235 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005236 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005237 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5238 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5239 self.cli.connect(addr)
5240 self.cliaddr = self.cli.getsockname()
5241
5242 def testStream(self):
5243 msg = self.conn.recv(1024)
5244 self.assertEqual(msg, MSG)
5245 self.assertEqual(self.cliaddr, self.connaddr)
5246
5247 def _testStream(self):
5248 self.cli.send(MSG)
5249 self.cli.close()
5250
5251
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005252class ContextManagersTest(ThreadedTCPSocketTest):
5253
5254 def _testSocketClass(self):
5255 # base test
5256 with socket.socket() as sock:
5257 self.assertFalse(sock._closed)
5258 self.assertTrue(sock._closed)
5259 # close inside with block
5260 with socket.socket() as sock:
5261 sock.close()
5262 self.assertTrue(sock._closed)
5263 # exception inside with block
5264 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005265 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005266 self.assertTrue(sock._closed)
5267
5268 def testCreateConnectionBase(self):
5269 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005270 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005271 data = conn.recv(1024)
5272 conn.sendall(data)
5273
5274 def _testCreateConnectionBase(self):
5275 address = self.serv.getsockname()
5276 with socket.create_connection(address) as sock:
5277 self.assertFalse(sock._closed)
5278 sock.sendall(b'foo')
5279 self.assertEqual(sock.recv(1024), b'foo')
5280 self.assertTrue(sock._closed)
5281
5282 def testCreateConnectionClose(self):
5283 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005284 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005285 data = conn.recv(1024)
5286 conn.sendall(data)
5287
5288 def _testCreateConnectionClose(self):
5289 address = self.serv.getsockname()
5290 with socket.create_connection(address) as sock:
5291 sock.close()
5292 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005293 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005294
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005295
Victor Stinnerdaf45552013-08-28 00:53:59 +02005296class InheritanceTest(unittest.TestCase):
5297 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5298 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005299 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005300 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005301 with socket.socket(socket.AF_INET,
5302 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005303 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005304 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005305
5306 def test_default_inheritable(self):
5307 sock = socket.socket()
5308 with sock:
5309 self.assertEqual(sock.get_inheritable(), False)
5310
5311 def test_dup(self):
5312 sock = socket.socket()
5313 with sock:
5314 newsock = sock.dup()
5315 sock.close()
5316 with newsock:
5317 self.assertEqual(newsock.get_inheritable(), False)
5318
5319 def test_set_inheritable(self):
5320 sock = socket.socket()
5321 with sock:
5322 sock.set_inheritable(True)
5323 self.assertEqual(sock.get_inheritable(), True)
5324
5325 sock.set_inheritable(False)
5326 self.assertEqual(sock.get_inheritable(), False)
5327
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005328 @unittest.skipIf(fcntl is None, "need fcntl")
5329 def test_get_inheritable_cloexec(self):
5330 sock = socket.socket()
5331 with sock:
5332 fd = sock.fileno()
5333 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005334
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005335 # clear FD_CLOEXEC flag
5336 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5337 flags &= ~fcntl.FD_CLOEXEC
5338 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005339
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005340 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005341
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005342 @unittest.skipIf(fcntl is None, "need fcntl")
5343 def test_set_inheritable_cloexec(self):
5344 sock = socket.socket()
5345 with sock:
5346 fd = sock.fileno()
5347 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5348 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005349
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005350 sock.set_inheritable(True)
5351 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5352 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005353
5354
Victor Stinnerdaf45552013-08-28 00:53:59 +02005355 def test_socketpair(self):
5356 s1, s2 = socket.socketpair()
5357 self.addCleanup(s1.close)
5358 self.addCleanup(s2.close)
5359 self.assertEqual(s1.get_inheritable(), False)
5360 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005361
5362
5363@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5364 "SOCK_NONBLOCK not defined")
5365class NonblockConstantTest(unittest.TestCase):
5366 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5367 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005368 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005369 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005370 self.assertTrue(
5371 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005372 if timeout == 0:
5373 # timeout == 0: means that getblocking() must be False.
5374 self.assertFalse(s.getblocking())
5375 else:
5376 # If timeout > 0, the socket will be in a "blocking" mode
5377 # from the standpoint of the Python API. For Python socket
5378 # object, "blocking" means that operations like 'sock.recv()'
5379 # will block. Internally, file descriptors for
5380 # "blocking" Python sockets *with timeouts* are in a
5381 # *non-blocking* mode, and 'sock.recv()' uses 'select()'
5382 # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
5383 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005384 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005385 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005386 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005387 self.assertFalse(
5388 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005389 self.assertTrue(s.getblocking())
Antoine Pitroub1c54962010-10-14 15:05:38 +00005390
Charles-François Natali239bb962011-06-03 12:55:15 +02005391 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005392 def test_SOCK_NONBLOCK(self):
5393 # a lot of it seems silly and redundant, but I wanted to test that
5394 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005395 with socket.socket(socket.AF_INET,
5396 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5397 self.checkNonblock(s)
5398 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005399 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005400 s.setblocking(0)
5401 self.checkNonblock(s)
5402 s.settimeout(None)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005403 self.checkNonblock(s, nonblock=False)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005404 s.settimeout(2.0)
5405 self.checkNonblock(s, timeout=2.0)
5406 s.setblocking(1)
Yury Selivanovf11b4602018-01-28 17:27:38 -05005407 self.checkNonblock(s, nonblock=False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005408 # defaulttimeout
5409 t = socket.getdefaulttimeout()
5410 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005411 with socket.socket() as s:
5412 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005413 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005414 with socket.socket() as s:
5415 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005416 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005417 with socket.socket() as s:
5418 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005419 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005420 with socket.socket() as s:
5421 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005422 socket.setdefaulttimeout(t)
5423
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005424
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005425@unittest.skipUnless(os.name == "nt", "Windows specific")
5426@unittest.skipUnless(multiprocessing, "need multiprocessing")
5427class TestSocketSharing(SocketTCPTest):
5428 # This must be classmethod and not staticmethod or multiprocessing
5429 # won't be able to bootstrap it.
5430 @classmethod
5431 def remoteProcessServer(cls, q):
5432 # Recreate socket from shared data
5433 sdata = q.get()
5434 message = q.get()
5435
5436 s = socket.fromshare(sdata)
5437 s2, c = s.accept()
5438
5439 # Send the message
5440 s2.sendall(message)
5441 s2.close()
5442 s.close()
5443
5444 def testShare(self):
5445 # Transfer the listening server socket to another process
5446 # and service it from there.
5447
5448 # Create process:
5449 q = multiprocessing.Queue()
5450 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5451 p.start()
5452
5453 # Get the shared socket data
5454 data = self.serv.share(p.pid)
5455
5456 # Pass the shared socket to the other process
5457 addr = self.serv.getsockname()
5458 self.serv.close()
5459 q.put(data)
5460
5461 # The data that the server will send us
5462 message = b"slapmahfro"
5463 q.put(message)
5464
5465 # Connect
5466 s = socket.create_connection(addr)
5467 # listen for the data
5468 m = []
5469 while True:
5470 data = s.recv(100)
5471 if not data:
5472 break
5473 m.append(data)
5474 s.close()
5475 received = b"".join(m)
5476 self.assertEqual(received, message)
5477 p.join()
5478
5479 def testShareLength(self):
5480 data = self.serv.share(os.getpid())
5481 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5482 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5483
5484 def compareSockets(self, org, other):
5485 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005486 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005487 self.assertEqual(org.gettimeout(), None)
5488 self.assertEqual(org.gettimeout(), other.gettimeout())
5489
5490 self.assertEqual(org.family, other.family)
5491 self.assertEqual(org.type, other.type)
5492 # If the user specified "0" for proto, then
5493 # internally windows will have picked the correct value.
5494 # Python introspection on the socket however will still return
5495 # 0. For the shared socket, the python value is recreated
5496 # from the actual value, so it may not compare correctly.
5497 if org.proto != 0:
5498 self.assertEqual(org.proto, other.proto)
5499
5500 def testShareLocal(self):
5501 data = self.serv.share(os.getpid())
5502 s = socket.fromshare(data)
5503 try:
5504 self.compareSockets(self.serv, s)
5505 finally:
5506 s.close()
5507
5508 def testTypes(self):
5509 families = [socket.AF_INET, socket.AF_INET6]
5510 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5511 for f in families:
5512 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005513 try:
5514 source = socket.socket(f, t)
5515 except OSError:
5516 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005517 try:
5518 data = source.share(os.getpid())
5519 shared = socket.fromshare(data)
5520 try:
5521 self.compareSockets(source, shared)
5522 finally:
5523 shared.close()
5524 finally:
5525 source.close()
5526
5527
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005528class SendfileUsingSendTest(ThreadedTCPSocketTest):
5529 """
5530 Test the send() implementation of socket.sendfile().
5531 """
5532
Victor Stinner8c663fd2017-11-08 14:44:44 -08005533 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005534 BUFSIZE = 8192
5535 FILEDATA = b""
5536 TIMEOUT = 2
5537
5538 @classmethod
5539 def setUpClass(cls):
5540 def chunks(total, step):
5541 assert total >= step
5542 while total > step:
5543 yield step
5544 total -= step
5545 if total:
5546 yield total
5547
5548 chunk = b"".join([random.choice(string.ascii_letters).encode()
5549 for i in range(cls.BUFSIZE)])
5550 with open(support.TESTFN, 'wb') as f:
5551 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5552 f.write(chunk)
5553 with open(support.TESTFN, 'rb') as f:
5554 cls.FILEDATA = f.read()
5555 assert len(cls.FILEDATA) == cls.FILESIZE
5556
5557 @classmethod
5558 def tearDownClass(cls):
5559 support.unlink(support.TESTFN)
5560
5561 def accept_conn(self):
5562 self.serv.settimeout(self.TIMEOUT)
5563 conn, addr = self.serv.accept()
5564 conn.settimeout(self.TIMEOUT)
5565 self.addCleanup(conn.close)
5566 return conn
5567
5568 def recv_data(self, conn):
5569 received = []
5570 while True:
5571 chunk = conn.recv(self.BUFSIZE)
5572 if not chunk:
5573 break
5574 received.append(chunk)
5575 return b''.join(received)
5576
5577 def meth_from_sock(self, sock):
5578 # Depending on the mixin class being run return either send()
5579 # or sendfile() method implementation.
5580 return getattr(sock, "_sendfile_use_send")
5581
5582 # regular file
5583
5584 def _testRegularFile(self):
5585 address = self.serv.getsockname()
5586 file = open(support.TESTFN, 'rb')
5587 with socket.create_connection(address) as sock, file as file:
5588 meth = self.meth_from_sock(sock)
5589 sent = meth(file)
5590 self.assertEqual(sent, self.FILESIZE)
5591 self.assertEqual(file.tell(), self.FILESIZE)
5592
5593 def testRegularFile(self):
5594 conn = self.accept_conn()
5595 data = self.recv_data(conn)
5596 self.assertEqual(len(data), self.FILESIZE)
5597 self.assertEqual(data, self.FILEDATA)
5598
5599 # non regular file
5600
5601 def _testNonRegularFile(self):
5602 address = self.serv.getsockname()
5603 file = io.BytesIO(self.FILEDATA)
5604 with socket.create_connection(address) as sock, file as file:
5605 sent = sock.sendfile(file)
5606 self.assertEqual(sent, self.FILESIZE)
5607 self.assertEqual(file.tell(), self.FILESIZE)
5608 self.assertRaises(socket._GiveupOnSendfile,
5609 sock._sendfile_use_sendfile, file)
5610
5611 def testNonRegularFile(self):
5612 conn = self.accept_conn()
5613 data = self.recv_data(conn)
5614 self.assertEqual(len(data), self.FILESIZE)
5615 self.assertEqual(data, self.FILEDATA)
5616
5617 # empty file
5618
5619 def _testEmptyFileSend(self):
5620 address = self.serv.getsockname()
5621 filename = support.TESTFN + "2"
5622 with open(filename, 'wb'):
5623 self.addCleanup(support.unlink, filename)
5624 file = open(filename, 'rb')
5625 with socket.create_connection(address) as sock, file as file:
5626 meth = self.meth_from_sock(sock)
5627 sent = meth(file)
5628 self.assertEqual(sent, 0)
5629 self.assertEqual(file.tell(), 0)
5630
5631 def testEmptyFileSend(self):
5632 conn = self.accept_conn()
5633 data = self.recv_data(conn)
5634 self.assertEqual(data, b"")
5635
5636 # offset
5637
5638 def _testOffset(self):
5639 address = self.serv.getsockname()
5640 file = open(support.TESTFN, 'rb')
5641 with socket.create_connection(address) as sock, file as file:
5642 meth = self.meth_from_sock(sock)
5643 sent = meth(file, offset=5000)
5644 self.assertEqual(sent, self.FILESIZE - 5000)
5645 self.assertEqual(file.tell(), self.FILESIZE)
5646
5647 def testOffset(self):
5648 conn = self.accept_conn()
5649 data = self.recv_data(conn)
5650 self.assertEqual(len(data), self.FILESIZE - 5000)
5651 self.assertEqual(data, self.FILEDATA[5000:])
5652
5653 # count
5654
5655 def _testCount(self):
5656 address = self.serv.getsockname()
5657 file = open(support.TESTFN, 'rb')
5658 with socket.create_connection(address, timeout=2) as sock, file as file:
5659 count = 5000007
5660 meth = self.meth_from_sock(sock)
5661 sent = meth(file, count=count)
5662 self.assertEqual(sent, count)
5663 self.assertEqual(file.tell(), count)
5664
5665 def testCount(self):
5666 count = 5000007
5667 conn = self.accept_conn()
5668 data = self.recv_data(conn)
5669 self.assertEqual(len(data), count)
5670 self.assertEqual(data, self.FILEDATA[:count])
5671
5672 # count small
5673
5674 def _testCountSmall(self):
5675 address = self.serv.getsockname()
5676 file = open(support.TESTFN, 'rb')
5677 with socket.create_connection(address, timeout=2) as sock, file as file:
5678 count = 1
5679 meth = self.meth_from_sock(sock)
5680 sent = meth(file, count=count)
5681 self.assertEqual(sent, count)
5682 self.assertEqual(file.tell(), count)
5683
5684 def testCountSmall(self):
5685 count = 1
5686 conn = self.accept_conn()
5687 data = self.recv_data(conn)
5688 self.assertEqual(len(data), count)
5689 self.assertEqual(data, self.FILEDATA[:count])
5690
5691 # count + offset
5692
5693 def _testCountWithOffset(self):
5694 address = self.serv.getsockname()
5695 file = open(support.TESTFN, 'rb')
5696 with socket.create_connection(address, timeout=2) as sock, file as file:
5697 count = 100007
5698 meth = self.meth_from_sock(sock)
5699 sent = meth(file, offset=2007, count=count)
5700 self.assertEqual(sent, count)
5701 self.assertEqual(file.tell(), count + 2007)
5702
5703 def testCountWithOffset(self):
5704 count = 100007
5705 conn = self.accept_conn()
5706 data = self.recv_data(conn)
5707 self.assertEqual(len(data), count)
5708 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5709
5710 # non blocking sockets are not supposed to work
5711
5712 def _testNonBlocking(self):
5713 address = self.serv.getsockname()
5714 file = open(support.TESTFN, 'rb')
5715 with socket.create_connection(address) as sock, file as file:
5716 sock.setblocking(False)
5717 meth = self.meth_from_sock(sock)
5718 self.assertRaises(ValueError, meth, file)
5719 self.assertRaises(ValueError, sock.sendfile, file)
5720
5721 def testNonBlocking(self):
5722 conn = self.accept_conn()
5723 if conn.recv(8192):
5724 self.fail('was not supposed to receive any data')
5725
5726 # timeout (non-triggered)
5727
5728 def _testWithTimeout(self):
5729 address = self.serv.getsockname()
5730 file = open(support.TESTFN, 'rb')
5731 with socket.create_connection(address, timeout=2) as sock, file as file:
5732 meth = self.meth_from_sock(sock)
5733 sent = meth(file)
5734 self.assertEqual(sent, self.FILESIZE)
5735
5736 def testWithTimeout(self):
5737 conn = self.accept_conn()
5738 data = self.recv_data(conn)
5739 self.assertEqual(len(data), self.FILESIZE)
5740 self.assertEqual(data, self.FILEDATA)
5741
5742 # timeout (triggered)
5743
5744 def _testWithTimeoutTriggeredSend(self):
5745 address = self.serv.getsockname()
5746 file = open(support.TESTFN, 'rb')
5747 with socket.create_connection(address, timeout=0.01) as sock, \
5748 file as file:
5749 meth = self.meth_from_sock(sock)
5750 self.assertRaises(socket.timeout, meth, file)
5751
5752 def testWithTimeoutTriggeredSend(self):
5753 conn = self.accept_conn()
5754 conn.recv(88192)
5755
5756 # errors
5757
5758 def _test_errors(self):
5759 pass
5760
5761 def test_errors(self):
5762 with open(support.TESTFN, 'rb') as file:
5763 with socket.socket(type=socket.SOCK_DGRAM) as s:
5764 meth = self.meth_from_sock(s)
5765 self.assertRaisesRegex(
5766 ValueError, "SOCK_STREAM", meth, file)
5767 with open(support.TESTFN, 'rt') as file:
5768 with socket.socket() as s:
5769 meth = self.meth_from_sock(s)
5770 self.assertRaisesRegex(
5771 ValueError, "binary mode", meth, file)
5772 with open(support.TESTFN, 'rb') as file:
5773 with socket.socket() as s:
5774 meth = self.meth_from_sock(s)
5775 self.assertRaisesRegex(TypeError, "positive integer",
5776 meth, file, count='2')
5777 self.assertRaisesRegex(TypeError, "positive integer",
5778 meth, file, count=0.1)
5779 self.assertRaisesRegex(ValueError, "positive integer",
5780 meth, file, count=0)
5781 self.assertRaisesRegex(ValueError, "positive integer",
5782 meth, file, count=-1)
5783
5784
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005785@unittest.skipUnless(hasattr(os, "sendfile"),
5786 'os.sendfile() required for this test.')
5787class SendfileUsingSendfileTest(SendfileUsingSendTest):
5788 """
5789 Test the sendfile() implementation of socket.sendfile().
5790 """
5791 def meth_from_sock(self, sock):
5792 return getattr(sock, "_sendfile_use_sendfile")
5793
Christian Heimes48371412016-09-06 00:37:46 +02005794
5795@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005796class LinuxKernelCryptoAPI(unittest.TestCase):
5797 # tests for AF_ALG
5798 def create_alg(self, typ, name):
5799 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005800 try:
5801 sock.bind((typ, name))
5802 except FileNotFoundError as e:
5803 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005804 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005805 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005806 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005807 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005808
Victor Stinner86afc1f2017-11-30 13:58:43 +01005809 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5810 # at least on ppc64le architecture
5811 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005812 def test_sha256(self):
5813 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5814 "177a9cb410ff61f20015ad")
5815 with self.create_alg('hash', 'sha256') as algo:
5816 op, _ = algo.accept()
5817 with op:
5818 op.sendall(b"abc")
5819 self.assertEqual(op.recv(512), expected)
5820
5821 op, _ = algo.accept()
5822 with op:
5823 op.send(b'a', socket.MSG_MORE)
5824 op.send(b'b', socket.MSG_MORE)
5825 op.send(b'c', socket.MSG_MORE)
5826 op.send(b'')
5827 self.assertEqual(op.recv(512), expected)
5828
5829 def test_hmac_sha1(self):
5830 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5831 with self.create_alg('hash', 'hmac(sha1)') as algo:
5832 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5833 op, _ = algo.accept()
5834 with op:
5835 op.sendall(b"what do ya want for nothing?")
5836 self.assertEqual(op.recv(512), expected)
5837
Christian Heimese084f842016-09-11 20:11:30 +02005838 # Although it should work with 3.19 and newer the test blocks on
5839 # Ubuntu 15.10 with Kernel 4.2.0-19.
5840 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005841 def test_aes_cbc(self):
5842 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5843 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5844 msg = b"Single block msg"
5845 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5846 msglen = len(msg)
5847 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5848 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5849 op, _ = algo.accept()
5850 with op:
5851 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5852 flags=socket.MSG_MORE)
5853 op.sendall(msg)
5854 self.assertEqual(op.recv(msglen), ciphertext)
5855
5856 op, _ = algo.accept()
5857 with op:
5858 op.sendmsg_afalg([ciphertext],
5859 op=socket.ALG_OP_DECRYPT, iv=iv)
5860 self.assertEqual(op.recv(msglen), msg)
5861
5862 # long message
5863 multiplier = 1024
5864 longmsg = [msg] * multiplier
5865 op, _ = algo.accept()
5866 with op:
5867 op.sendmsg_afalg(longmsg,
5868 op=socket.ALG_OP_ENCRYPT, iv=iv)
5869 enc = op.recv(msglen * multiplier)
5870 self.assertEqual(len(enc), msglen * multiplier)
Sergey Fedoseevb796e7d2018-07-09 20:25:55 +05005871 self.assertEqual(enc[:msglen], ciphertext)
Christian Heimesdffa3942016-09-05 23:54:41 +02005872
5873 op, _ = algo.accept()
5874 with op:
5875 op.sendmsg_afalg([enc],
5876 op=socket.ALG_OP_DECRYPT, iv=iv)
5877 dec = op.recv(msglen * multiplier)
5878 self.assertEqual(len(dec), msglen * multiplier)
5879 self.assertEqual(dec, msg * multiplier)
5880
matejcik9764c152017-02-16 14:41:31 +01005881 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005882 def test_aead_aes_gcm(self):
5883 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5884 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5885 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5886 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5887 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5888 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5889
5890 taglen = len(expected_tag)
5891 assoclen = len(assoc)
5892
5893 with self.create_alg('aead', 'gcm(aes)') as algo:
5894 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5895 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5896 None, taglen)
5897
5898 # send assoc, plain and tag buffer in separate steps
5899 op, _ = algo.accept()
5900 with op:
5901 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5902 assoclen=assoclen, flags=socket.MSG_MORE)
5903 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005904 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005905 res = op.recv(assoclen + len(plain) + taglen)
5906 self.assertEqual(expected_ct, res[assoclen:-taglen])
5907 self.assertEqual(expected_tag, res[-taglen:])
5908
5909 # now with msg
5910 op, _ = algo.accept()
5911 with op:
matejcik9764c152017-02-16 14:41:31 +01005912 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005913 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5914 assoclen=assoclen)
5915 res = op.recv(assoclen + len(plain) + taglen)
5916 self.assertEqual(expected_ct, res[assoclen:-taglen])
5917 self.assertEqual(expected_tag, res[-taglen:])
5918
5919 # create anc data manually
5920 pack_uint32 = struct.Struct('I').pack
5921 op, _ = algo.accept()
5922 with op:
matejcik9764c152017-02-16 14:41:31 +01005923 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005924 op.sendmsg(
5925 [msg],
5926 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5927 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5928 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5929 )
5930 )
matejcik9764c152017-02-16 14:41:31 +01005931 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005932 self.assertEqual(expected_ct, res[assoclen:-taglen])
5933 self.assertEqual(expected_tag, res[-taglen:])
5934
5935 # decrypt and verify
5936 op, _ = algo.accept()
5937 with op:
5938 msg = assoc + expected_ct + expected_tag
5939 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5940 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005941 res = op.recv(len(msg) - taglen)
5942 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005943
Christian Heimese084f842016-09-11 20:11:30 +02005944 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005945 def test_drbg_pr_sha256(self):
5946 # deterministic random bit generator, prediction resistance, sha256
5947 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5948 extra_seed = os.urandom(32)
5949 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5950 op, _ = algo.accept()
5951 with op:
5952 rn = op.recv(32)
5953 self.assertEqual(len(rn), 32)
5954
5955 def test_sendmsg_afalg_args(self):
5956 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005957 with sock:
5958 with self.assertRaises(TypeError):
5959 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005960
Christian Heimes02b30352016-09-11 19:49:56 +02005961 with self.assertRaises(TypeError):
5962 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005963
Christian Heimes02b30352016-09-11 19:49:56 +02005964 with self.assertRaises(TypeError):
5965 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005966
Christian Heimes02b30352016-09-11 19:49:56 +02005967 with self.assertRaises(TypeError):
5968 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005969
Christian Heimes02b30352016-09-11 19:49:56 +02005970 with self.assertRaises(TypeError):
5971 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5972
animalize19e7d482018-02-27 02:10:36 +08005973@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
5974class TestMSWindowsTCPFlags(unittest.TestCase):
5975 knownTCPFlags = {
Ville Skyttä61f82e02018-04-20 23:08:45 +03005976 # available since long time ago
animalize19e7d482018-02-27 02:10:36 +08005977 'TCP_MAXSEG',
5978 'TCP_NODELAY',
5979 # available starting with Windows 10 1607
5980 'TCP_FASTOPEN',
5981 # available starting with Windows 10 1703
5982 'TCP_KEEPCNT',
5983 # available starting with Windows 10 1709
5984 'TCP_KEEPIDLE',
5985 'TCP_KEEPINTVL'
5986 }
5987
5988 def test_new_tcp_flags(self):
5989 provided = [s for s in dir(socket) if s.startswith('TCP')]
5990 unknown = [s for s in provided if s not in self.knownTCPFlags]
5991
5992 self.assertEqual([], unknown,
5993 "New TCP flags were discovered. See bpo-32394 for more information")
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005994
Guido van Rossumb995eb72002-07-31 16:08:40 +00005995def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005996 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005997 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005998
5999 tests.extend([
6000 NonBlockingTCPTests,
6001 FileObjectClassTestCase,
6002 UnbufferedFileObjectClassTestCase,
6003 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00006004 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00006005 UnicodeReadFileObjectClassTestCase,
6006 UnicodeWriteFileObjectClassTestCase,
6007 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00006008 NetworkConnectionNoServer,
6009 NetworkConnectionAttributesTest,
6010 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00006011 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006012 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00006013 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00006014 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02006015 tests.append(BasicSocketPairTest)
6016 tests.append(TestUnixDomain)
6017 tests.append(TestLinuxAbstractNamespace)
6018 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02006019 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006020 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02006021 tests.append(LinuxKernelCryptoAPI)
Bjorn Anderssonbb816512018-09-26 06:47:52 -07006022 tests.append(BasicQIPCRTRTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006023 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04006024 BasicVSOCKTest,
6025 ThreadedVSOCKSocketStreamTest,
6026 ])
6027 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006028 CmsgMacroTests,
6029 SendmsgUDPTest,
6030 RecvmsgUDPTest,
6031 RecvmsgIntoUDPTest,
6032 SendmsgUDP6Test,
6033 RecvmsgUDP6Test,
6034 RecvmsgRFC3542AncillaryUDP6Test,
6035 RecvmsgIntoRFC3542AncillaryUDP6Test,
6036 RecvmsgIntoUDP6Test,
6037 SendmsgTCPTest,
6038 RecvmsgTCPTest,
6039 RecvmsgIntoTCPTest,
6040 SendmsgSCTPStreamTest,
6041 RecvmsgSCTPStreamTest,
6042 RecvmsgIntoSCTPStreamTest,
6043 SendmsgUnixStreamTest,
6044 RecvmsgUnixStreamTest,
6045 RecvmsgIntoUnixStreamTest,
6046 RecvmsgSCMRightsStreamTest,
6047 RecvmsgIntoSCMRightsStreamTest,
6048 # These are slow when setitimer() is not available
6049 InterruptedRecvTimeoutTest,
6050 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00006051 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02006052 SendfileUsingSendTest,
6053 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006054 ])
animalize19e7d482018-02-27 02:10:36 +08006055 tests.append(TestMSWindowsTCPFlags)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006056
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006057 thread_info = support.threading_setup()
6058 support.run_unittest(*tests)
6059 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00006060
6061if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00006062 test_main()