blob: 43688eacf06a81c20255c2c189aa793da147e55c [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
23import string
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020024import _thread as thread
25import threading
Antoine Pitroub1c54962010-10-14 15:05:38 +000026try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000027 import multiprocessing
28except ImportError:
29 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020030try:
31 import fcntl
32except ImportError:
33 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000036MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
caaveryeffc12f2017-09-06 18:18:10 -040038VSOCKPORT = 1234
39
Victor Stinner45df8202010-04-28 22:31:17 +000040try:
Victor Stinnere254e532014-07-26 14:36:55 +020041 import _socket
42except ImportError:
43 _socket = None
44
caaveryeffc12f2017-09-06 18:18:10 -040045def get_cid():
46 if fcntl is None:
47 return None
48 try:
49 with open("/dev/vsock", "rb") as f:
50 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
51 except OSError:
52 return None
53 else:
54 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000055
Charles-François Natali47413c12011-10-06 19:47:44 +020056def _have_socket_can():
57 """Check whether CAN sockets are supported on this host."""
58 try:
59 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020060 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020061 return False
62 else:
63 s.close()
64 return True
65
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040066def _have_socket_can_isotp():
67 """Check whether CAN ISOTP sockets are supported on this host."""
68 try:
69 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
70 except (AttributeError, OSError):
71 return False
72 else:
73 s.close()
74 return True
75
Charles-François Natali10b8cf42011-11-10 19:21:37 +010076def _have_socket_rds():
77 """Check whether RDS sockets are supported on this host."""
78 try:
79 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
80 except (AttributeError, OSError):
81 return False
82 else:
83 s.close()
84 return True
85
Christian Heimes48371412016-09-06 00:37:46 +020086def _have_socket_alg():
87 """Check whether AF_ALG sockets are supported on this host."""
88 try:
89 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
90 except (AttributeError, OSError):
91 return False
92 else:
93 s.close()
94 return True
95
caaveryeffc12f2017-09-06 18:18:10 -040096def _have_socket_vsock():
97 """Check whether AF_VSOCK sockets are supported on this host."""
98 ret = get_cid() is not None
99 return ret
100
Charles-François Natali47413c12011-10-06 19:47:44 +0200101HAVE_SOCKET_CAN = _have_socket_can()
102
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400103HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
104
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100105HAVE_SOCKET_RDS = _have_socket_rds()
106
Christian Heimes48371412016-09-06 00:37:46 +0200107HAVE_SOCKET_ALG = _have_socket_alg()
108
caaveryeffc12f2017-09-06 18:18:10 -0400109HAVE_SOCKET_VSOCK = _have_socket_vsock()
110
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000111# Size in bytes of the int type
112SIZEOF_INT = array.array("i").itemsize
113
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000115
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116 def setUp(self):
117 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000118 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100119 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000120
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 def tearDown(self):
122 self.serv.close()
123 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000124
Guido van Rossum24e4af82002-06-12 19:18:08 +0000125class SocketUDPTest(unittest.TestCase):
126
127 def setUp(self):
128 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000129 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130
131 def tearDown(self):
132 self.serv.close()
133 self.serv = None
134
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000135class ThreadSafeCleanupTestCase(unittest.TestCase):
136 """Subclass of unittest.TestCase with thread-safe cleanup methods.
137
138 This subclass protects the addCleanup() and doCleanups() methods
139 with a recursive lock.
140 """
141
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200142 def __init__(self, *args, **kwargs):
143 super().__init__(*args, **kwargs)
144 self._cleanup_lock = threading.RLock()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000145
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200146 def addCleanup(self, *args, **kwargs):
147 with self._cleanup_lock:
148 return super().addCleanup(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000149
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200150 def doCleanups(self, *args, **kwargs):
151 with self._cleanup_lock:
152 return super().doCleanups(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000153
Charles-François Natali47413c12011-10-06 19:47:44 +0200154class SocketCANTest(unittest.TestCase):
155
156 """To be able to run this test, a `vcan0` CAN interface can be created with
157 the following commands:
158 # modprobe vcan
159 # ip link add dev vcan0 type vcan
160 # ifconfig vcan0 up
161 """
162 interface = 'vcan0'
163 bufsize = 128
164
Charles-François Natali773e42d2013-02-05 19:42:01 +0100165 """The CAN frame structure is defined in <linux/can.h>:
166
167 struct can_frame {
168 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
169 __u8 can_dlc; /* data length code: 0 .. 8 */
170 __u8 data[8] __attribute__((aligned(8)));
171 };
172 """
173 can_frame_fmt = "=IB3x8s"
174 can_frame_size = struct.calcsize(can_frame_fmt)
175
176 """The Broadcast Management Command frame structure is defined
177 in <linux/can/bcm.h>:
178
179 struct bcm_msg_head {
180 __u32 opcode;
181 __u32 flags;
182 __u32 count;
183 struct timeval ival1, ival2;
184 canid_t can_id;
185 __u32 nframes;
186 struct can_frame frames[0];
187 }
188
189 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
190 `struct can_frame` definition). Must use native not standard types for packing.
191 """
192 bcm_cmd_msg_fmt = "@3I4l2I"
193 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
194
Charles-François Natali47413c12011-10-06 19:47:44 +0200195 def setUp(self):
196 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200197 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200198 try:
199 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200200 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200201 self.skipTest('network interface `%s` does not exist' %
202 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200203
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100204
205class SocketRDSTest(unittest.TestCase):
206
207 """To be able to run this test, the `rds` kernel module must be loaded:
208 # modprobe rds
209 """
210 bufsize = 8192
211
212 def setUp(self):
213 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
214 self.addCleanup(self.serv.close)
215 try:
216 self.port = support.bind_port(self.serv)
217 except OSError:
218 self.skipTest('unable to bind RDS socket')
219
220
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000222 """Threadable Test class
223
224 The ThreadableTest class makes it easy to create a threaded
225 client/server pair from an existing unit test. To create a
226 new threaded class from an existing unit test, use multiple
227 inheritance:
228
229 class NewClass (OldClass, ThreadableTest):
230 pass
231
232 This class defines two new fixture functions with obvious
233 purposes for overriding:
234
235 clientSetUp ()
236 clientTearDown ()
237
238 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000239 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000240 '_' to indicate the client portion of the test. Ex:
241
242 def testFoo(self):
243 # Server portion
244
245 def _testFoo(self):
246 # Client portion
247
248 Any exceptions raised by the clients during their tests
249 are caught and transferred to the main thread to alert
250 the testing framework.
251
252 Note, the server setup function cannot call any blocking
253 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000254 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000255 the blocking call (such as in setting up a client/server
256 connection and performing the accept() in setUp().
257 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000258
259 def __init__(self):
260 # Swap the true setup function
261 self.__setUp = self.setUp
262 self.__tearDown = self.tearDown
263 self.setUp = self._setUp
264 self.tearDown = self._tearDown
265
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000266 def serverExplicitReady(self):
267 """This method allows the server to explicitly indicate that
268 it wants the client thread to proceed. This is useful if the
269 server is about to execute a blocking routine that is
270 dependent upon the client thread during its setup routine."""
271 self.server_ready.set()
272
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 def _setUp(self):
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700274 self.wait_threads = support.wait_threads_exit()
275 self.wait_threads.__enter__()
276
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000277 self.server_ready = threading.Event()
278 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000280 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200281 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282
283 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000284 methodname = self.id()
285 i = methodname.rfind('.')
286 methodname = methodname[i+1:]
287 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000288 self.client_thread = thread.start_new_thread(
289 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200291 try:
292 self.__setUp()
293 except:
294 self.server_crashed = True
295 raise
296 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000297 self.server_ready.set()
298 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000299
300 def _tearDown(self):
301 self.__tearDown()
302 self.done.wait()
Victor Stinnerff40ecd2017-09-14 13:07:24 -0700303 self.wait_threads.__exit__(None, None, None)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000304
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000305 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000306 exc = self.queue.get()
307 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000308
309 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000310 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100311 try:
312 self.clientSetUp()
313 except BaseException as e:
314 self.queue.put(e)
315 self.clientTearDown()
316 return
317 finally:
318 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200319 if self.server_crashed:
320 self.clientTearDown()
321 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000322 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000323 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000324 try:
325 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000326 except BaseException as e:
327 self.queue.put(e)
328 finally:
329 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330
331 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000332 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000333
334 def clientTearDown(self):
335 self.done.set()
336 thread.exit()
337
338class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
339
340 def __init__(self, methodName='runTest'):
341 SocketTCPTest.__init__(self, methodName=methodName)
342 ThreadableTest.__init__(self)
343
344 def clientSetUp(self):
345 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
346
347 def clientTearDown(self):
348 self.cli.close()
349 self.cli = None
350 ThreadableTest.clientTearDown(self)
351
352class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
353
354 def __init__(self, methodName='runTest'):
355 SocketUDPTest.__init__(self, methodName=methodName)
356 ThreadableTest.__init__(self)
357
358 def clientSetUp(self):
359 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
360
Brian Curtin3beb38f2010-11-04 03:41:43 +0000361 def clientTearDown(self):
362 self.cli.close()
363 self.cli = None
364 ThreadableTest.clientTearDown(self)
365
Charles-François Natali47413c12011-10-06 19:47:44 +0200366class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
367
368 def __init__(self, methodName='runTest'):
369 SocketCANTest.__init__(self, methodName=methodName)
370 ThreadableTest.__init__(self)
371
372 def clientSetUp(self):
373 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
374 try:
375 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200376 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200377 # skipTest should not be called here, and will be called in the
378 # server instead
379 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200380
381 def clientTearDown(self):
382 self.cli.close()
383 self.cli = None
384 ThreadableTest.clientTearDown(self)
385
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100386class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
387
388 def __init__(self, methodName='runTest'):
389 SocketRDSTest.__init__(self, methodName=methodName)
390 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100391
392 def clientSetUp(self):
393 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
394 try:
395 # RDS sockets must be bound explicitly to send or receive data
396 self.cli.bind((HOST, 0))
397 self.cli_addr = self.cli.getsockname()
398 except OSError:
399 # skipTest should not be called here, and will be called in the
400 # server instead
401 pass
402
403 def clientTearDown(self):
404 self.cli.close()
405 self.cli = None
406 ThreadableTest.clientTearDown(self)
407
caaveryeffc12f2017-09-06 18:18:10 -0400408@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400409@unittest.skipUnless(HAVE_SOCKET_VSOCK,
410 'VSOCK sockets required for this test.')
411@unittest.skipUnless(get_cid() != 2,
412 "This test can only be run on a virtual guest.")
413class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
414
415 def __init__(self, methodName='runTest'):
416 unittest.TestCase.__init__(self, methodName=methodName)
417 ThreadableTest.__init__(self)
418
419 def setUp(self):
420 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
421 self.addCleanup(self.serv.close)
422 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
423 self.serv.listen()
424 self.serverExplicitReady()
425 self.conn, self.connaddr = self.serv.accept()
426 self.addCleanup(self.conn.close)
427
428 def clientSetUp(self):
429 time.sleep(0.1)
430 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
431 self.addCleanup(self.cli.close)
432 cid = get_cid()
433 self.cli.connect((cid, VSOCKPORT))
434
435 def testStream(self):
436 msg = self.conn.recv(1024)
437 self.assertEqual(msg, MSG)
438
439 def _testStream(self):
440 self.cli.send(MSG)
441 self.cli.close()
442
Guido van Rossum24e4af82002-06-12 19:18:08 +0000443class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000444 """Socket tests for client-server connection.
445
446 self.cli_conn is a client socket connected to the server. The
447 setUp() method guarantees that it is connected to the server.
448 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000449
450 def __init__(self, methodName='runTest'):
451 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
452
453 def setUp(self):
454 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000455 # Indicate explicitly we're ready for the client thread to
456 # proceed and then perform the blocking call to accept
457 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000458 conn, addr = self.serv.accept()
459 self.cli_conn = conn
460
461 def tearDown(self):
462 self.cli_conn.close()
463 self.cli_conn = None
464 ThreadedTCPSocketTest.tearDown(self)
465
466 def clientSetUp(self):
467 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000468 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469 self.serv_conn = self.cli
470
471 def clientTearDown(self):
472 self.serv_conn.close()
473 self.serv_conn = None
474 ThreadedTCPSocketTest.clientTearDown(self)
475
Dave Cole331708b2004-08-09 04:51:41 +0000476class SocketPairTest(unittest.TestCase, ThreadableTest):
477
478 def __init__(self, methodName='runTest'):
479 unittest.TestCase.__init__(self, methodName=methodName)
480 ThreadableTest.__init__(self)
481
482 def setUp(self):
483 self.serv, self.cli = socket.socketpair()
484
485 def tearDown(self):
486 self.serv.close()
487 self.serv = None
488
489 def clientSetUp(self):
490 pass
491
492 def clientTearDown(self):
493 self.cli.close()
494 self.cli = None
495 ThreadableTest.clientTearDown(self)
496
Tim Peters494aaee2004-08-09 18:54:11 +0000497
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000498# The following classes are used by the sendmsg()/recvmsg() tests.
499# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
500# gives a drop-in replacement for SocketConnectedTest, but different
501# address families can be used, and the attributes serv_addr and
502# cli_addr will be set to the addresses of the endpoints.
503
504class SocketTestBase(unittest.TestCase):
505 """A base class for socket tests.
506
507 Subclasses must provide methods newSocket() to return a new socket
508 and bindSock(sock) to bind it to an unused address.
509
510 Creates a socket self.serv and sets self.serv_addr to its address.
511 """
512
513 def setUp(self):
514 self.serv = self.newSocket()
515 self.bindServer()
516
517 def bindServer(self):
518 """Bind server socket and set self.serv_addr to its address."""
519 self.bindSock(self.serv)
520 self.serv_addr = self.serv.getsockname()
521
522 def tearDown(self):
523 self.serv.close()
524 self.serv = None
525
526
527class SocketListeningTestMixin(SocketTestBase):
528 """Mixin to listen on the server socket."""
529
530 def setUp(self):
531 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100532 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000533
534
535class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
536 ThreadableTest):
537 """Mixin to add client socket and allow client/server tests.
538
539 Client socket is self.cli and its address is self.cli_addr. See
540 ThreadableTest for usage information.
541 """
542
543 def __init__(self, *args, **kwargs):
544 super().__init__(*args, **kwargs)
545 ThreadableTest.__init__(self)
546
547 def clientSetUp(self):
548 self.cli = self.newClientSocket()
549 self.bindClient()
550
551 def newClientSocket(self):
552 """Return a new socket for use as client."""
553 return self.newSocket()
554
555 def bindClient(self):
556 """Bind client socket and set self.cli_addr to its address."""
557 self.bindSock(self.cli)
558 self.cli_addr = self.cli.getsockname()
559
560 def clientTearDown(self):
561 self.cli.close()
562 self.cli = None
563 ThreadableTest.clientTearDown(self)
564
565
566class ConnectedStreamTestMixin(SocketListeningTestMixin,
567 ThreadedSocketTestMixin):
568 """Mixin to allow client/server stream tests with connected client.
569
570 Server's socket representing connection to client is self.cli_conn
571 and client's connection to server is self.serv_conn. (Based on
572 SocketConnectedTest.)
573 """
574
575 def setUp(self):
576 super().setUp()
577 # Indicate explicitly we're ready for the client thread to
578 # proceed and then perform the blocking call to accept
579 self.serverExplicitReady()
580 conn, addr = self.serv.accept()
581 self.cli_conn = conn
582
583 def tearDown(self):
584 self.cli_conn.close()
585 self.cli_conn = None
586 super().tearDown()
587
588 def clientSetUp(self):
589 super().clientSetUp()
590 self.cli.connect(self.serv_addr)
591 self.serv_conn = self.cli
592
593 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100594 try:
595 self.serv_conn.close()
596 self.serv_conn = None
597 except AttributeError:
598 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000599 super().clientTearDown()
600
601
602class UnixSocketTestBase(SocketTestBase):
603 """Base class for Unix-domain socket tests."""
604
605 # This class is used for file descriptor passing tests, so we
606 # create the sockets in a private directory so that other users
607 # can't send anything that might be problematic for a privileged
608 # user running the tests.
609
610 def setUp(self):
611 self.dir_path = tempfile.mkdtemp()
612 self.addCleanup(os.rmdir, self.dir_path)
613 super().setUp()
614
615 def bindSock(self, sock):
616 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100617 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000618 self.addCleanup(support.unlink, path)
619
620class UnixStreamBase(UnixSocketTestBase):
621 """Base class for Unix-domain SOCK_STREAM tests."""
622
623 def newSocket(self):
624 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
625
626
627class InetTestBase(SocketTestBase):
628 """Base class for IPv4 socket tests."""
629
630 host = HOST
631
632 def setUp(self):
633 super().setUp()
634 self.port = self.serv_addr[1]
635
636 def bindSock(self, sock):
637 support.bind_port(sock, host=self.host)
638
639class TCPTestBase(InetTestBase):
640 """Base class for TCP-over-IPv4 tests."""
641
642 def newSocket(self):
643 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
644
645class UDPTestBase(InetTestBase):
646 """Base class for UDP-over-IPv4 tests."""
647
648 def newSocket(self):
649 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
650
651class SCTPStreamBase(InetTestBase):
652 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
653
654 def newSocket(self):
655 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
656 socket.IPPROTO_SCTP)
657
658
659class Inet6TestBase(InetTestBase):
660 """Base class for IPv6 socket tests."""
661
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200662 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000663
664class UDP6TestBase(Inet6TestBase):
665 """Base class for UDP-over-IPv6 tests."""
666
667 def newSocket(self):
668 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
669
670
671# Test-skipping decorators for use with ThreadableTest.
672
673def skipWithClientIf(condition, reason):
674 """Skip decorated test if condition is true, add client_skip decorator.
675
676 If the decorated object is not a class, sets its attribute
677 "client_skip" to a decorator which will return an empty function
678 if the test is to be skipped, or the original function if it is
679 not. This can be used to avoid running the client part of a
680 skipped test when using ThreadableTest.
681 """
682 def client_pass(*args, **kwargs):
683 pass
684 def skipdec(obj):
685 retval = unittest.skip(reason)(obj)
686 if not isinstance(obj, type):
687 retval.client_skip = lambda f: client_pass
688 return retval
689 def noskipdec(obj):
690 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
691 obj.client_skip = lambda f: f
692 return obj
693 return skipdec if condition else noskipdec
694
695
696def requireAttrs(obj, *attributes):
697 """Skip decorated test if obj is missing any of the given attributes.
698
699 Sets client_skip attribute as skipWithClientIf() does.
700 """
701 missing = [name for name in attributes if not hasattr(obj, name)]
702 return skipWithClientIf(
703 missing, "don't have " + ", ".join(name for name in missing))
704
705
706def requireSocket(*args):
707 """Skip decorated test if a socket cannot be created with given arguments.
708
709 When an argument is given as a string, will use the value of that
710 attribute of the socket module, or skip the test if it doesn't
711 exist. Sets client_skip attribute as skipWithClientIf() does.
712 """
713 err = None
714 missing = [obj for obj in args if
715 isinstance(obj, str) and not hasattr(socket, obj)]
716 if missing:
717 err = "don't have " + ", ".join(name for name in missing)
718 else:
719 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
720 for obj in args]
721 try:
722 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200723 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000724 # XXX: check errno?
725 err = str(e)
726 else:
727 s.close()
728 return skipWithClientIf(
729 err is not None,
730 "can't create socket({0}): {1}".format(
731 ", ".join(str(o) for o in args), err))
732
733
Guido van Rossum24e4af82002-06-12 19:18:08 +0000734#######################################################################
735## Begin Tests
736
737class GeneralModuleTests(unittest.TestCase):
738
Ethan Furman7184bac2014-10-14 18:56:53 -0700739 def test_SocketType_is_socketobject(self):
740 import _socket
741 self.assertTrue(socket.SocketType is _socket.socket)
742 s = socket.socket()
743 self.assertIsInstance(s, socket.SocketType)
744 s.close()
745
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000746 def test_repr(self):
747 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200748 with s:
749 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000750 self.assertIn('family=%s' % socket.AF_INET, repr(s))
751 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200752 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200753 self.assertNotIn('raddr', repr(s))
754 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200755 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200756 self.assertIn(str(s.getsockname()), repr(s))
757 self.assertIn('[closed]', repr(s))
758 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000759
Victor Stinnere254e532014-07-26 14:36:55 +0200760 @unittest.skipUnless(_socket is not None, 'need _socket module')
761 def test_csocket_repr(self):
762 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
763 try:
764 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
765 % (s.fileno(), s.family, s.type, s.proto))
766 self.assertEqual(repr(s), expected)
767 finally:
768 s.close()
769 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
770 % (s.family, s.type, s.proto))
771 self.assertEqual(repr(s), expected)
772
Raymond Hettinger027bb632004-05-31 03:09:25 +0000773 def test_weakref(self):
774 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
775 p = proxy(s)
776 self.assertEqual(p.fileno(), s.fileno())
777 s.close()
778 s = None
779 try:
780 p.fileno()
781 except ReferenceError:
782 pass
783 else:
784 self.fail('Socket proxy still exists')
785
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300788 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200789 with self.assertRaises(OSError, msg=msg % 'OSError'):
790 raise OSError
791 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000792 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200793 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000795
Ezio Melotti63e42302011-05-07 19:47:48 +0300796 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000797 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300798 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
799 self.addCleanup(s.close)
800 s.bind(('', 0))
801 sockname = s.getsockname()
802 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300803 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300804 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300805 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400806 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300807 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300808 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300809 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400810 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300811 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300812 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300813 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300814 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300815 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300816 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300817 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400818 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300819 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300820 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300821 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400822 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300823 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300824 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300825 self.assertIn('not NoneType', str(cm.exception))
826 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300827 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300828 self.assertIn('an integer is required', str(cm.exception))
829 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300830 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300831 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300832 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300833 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300834 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300835 self.assertIn('(1 given)', str(cm.exception))
836 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300837 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300838 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300839
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000841 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000842 socket.AF_INET
843 socket.SOCK_STREAM
844 socket.SOCK_DGRAM
845 socket.SOCK_RAW
846 socket.SOCK_RDM
847 socket.SOCK_SEQPACKET
848 socket.SOL_SOCKET
849 socket.SO_REUSEADDR
850
Guido van Rossum654c11e2002-06-13 20:24:17 +0000851 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000852 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000853 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000854 try:
855 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200856 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000857 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600858 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000859 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000860 try:
861 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200862 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000863 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600864 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000865 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000866 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000867 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000868 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000869
Charles-François Natali0cc86852013-09-13 19:53:08 +0200870 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700871 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200872 self.assertEqual(socket.gethostbyname(addr), addr)
873
874 # we don't test support.HOSTv6 because there's a chance it doesn't have
875 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700876 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200877 self.assertIn(host, socket.gethostbyaddr(host)[2])
878
Xiang Zhangd36a7162017-03-07 11:06:09 +0800879 def test_host_resolution_bad_address(self):
880 # These are all malformed IP addresses and expected not to resolve to
881 # any result. But some ISPs, e.g. AWS, may successfully resolve these
882 # IPs.
883 explanation = (
884 "resolving an invalid IP address did not raise OSError; "
885 "can be caused by a broken DNS server"
886 )
887 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
888 '1:1:1:1:1:1:1:1:1']:
889 with self.assertRaises(OSError):
890 socket.gethostbyname(addr)
891 with self.assertRaises(OSError, msg=explanation):
892 socket.gethostbyaddr(addr)
893
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000894 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
895 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
896 def test_sethostname(self):
897 oldhn = socket.gethostname()
898 try:
899 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200900 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000901 if e.errno == errno.EPERM:
902 self.skipTest("test should be run as root")
903 else:
904 raise
905 try:
906 # running test as root!
907 self.assertEqual(socket.gethostname(), 'new')
908 # Should work with bytes objects too
909 socket.sethostname(b'bar')
910 self.assertEqual(socket.gethostname(), 'bar')
911 finally:
912 socket.sethostname(oldhn)
913
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700914 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
915 'socket.if_nameindex() not available.')
916 def testInterfaceNameIndex(self):
917 interfaces = socket.if_nameindex()
918 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200919 self.assertIsInstance(index, int)
920 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700921 # interface indices are non-zero integers
922 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200923 _index = socket.if_nametoindex(name)
924 self.assertIsInstance(_index, int)
925 self.assertEqual(index, _index)
926 _name = socket.if_indextoname(index)
927 self.assertIsInstance(_name, str)
928 self.assertEqual(name, _name)
929
930 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
931 'socket.if_nameindex() not available.')
932 def testInvalidInterfaceNameIndex(self):
933 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200934 self.assertRaises(OSError, socket.if_indextoname, 0)
935 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200936 # test with invalid values
937 self.assertRaises(TypeError, socket.if_nametoindex, 0)
938 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700939
Serhiy Storchaka43767632013-11-03 21:31:38 +0200940 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
941 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000942 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000943 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200944 try:
945 # On some versions, this loses a reference
946 orig = sys.getrefcount(__name__)
947 socket.getnameinfo(__name__,0)
948 except TypeError:
949 if sys.getrefcount(__name__) != orig:
950 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000951
Guido van Rossum24e4af82002-06-12 19:18:08 +0000952 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000953 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000954 try:
955 # On some versions, this crashes the interpreter.
956 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200957 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000958 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000959
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000960 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000961 # This just checks that htons etc. are their own inverse,
962 # when looking at the lower 16 or 32 bits.
963 sizes = {socket.htonl: 32, socket.ntohl: 32,
964 socket.htons: 16, socket.ntohs: 16}
965 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000966 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000967 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
968 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000969
Guido van Rossuma2627af2002-09-14 00:58:46 +0000970 swapped = func(mask)
971 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000972 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000973
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200974 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000975 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300976 import _testcapi
977 s_good_values = [0, 1, 2, 0xffff]
978 l_good_values = s_good_values + [0xffffffff]
979 l_bad_values = [-1, -2, 1<<32, 1<<1000]
980 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
981 _testcapi.INT_MAX + 1]
982 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
983 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000984 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000985 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300986 for k in l_good_values:
987 socket.ntohl(k)
988 socket.htonl(k)
989 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000990 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000991 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300992 for k in l_bad_values:
993 self.assertRaises(OverflowError, socket.ntohl, k)
994 self.assertRaises(OverflowError, socket.htonl, k)
995 for k in s_deprecated_values:
996 self.assertWarns(DeprecationWarning, socket.ntohs, k)
997 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000998
Barry Warsaw11b91a02004-06-28 00:50:43 +0000999 def testGetServBy(self):
1000 eq = self.assertEqual
1001 # Find one service that exists, then check all the related interfaces.
1002 # I've ordered this by protocols that have both a tcp and udp
1003 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001004 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001005 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001006 # avoid the 'echo' service on this platform, as there is an
1007 # assumption breaking non-standard port/protocol entry
1008 services = ('daytime', 'qotd', 'domain')
1009 else:
1010 services = ('echo', 'daytime', 'domain')
1011 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001012 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001013 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001014 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001015 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001016 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001017 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001018 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001019 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001020 # Issue #26936: Android getservbyname() was broken before API 23.
1021 if (not hasattr(sys, 'getandroidapilevel') or
1022 sys.getandroidapilevel() >= 23):
1023 port2 = socket.getservbyname(service)
1024 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001025 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001026 try:
1027 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001028 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001029 udpport = None
1030 else:
1031 eq(udpport, port)
1032 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001033 # Issue #26936: Android getservbyport() is broken.
1034 if not support.is_android:
1035 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001036 eq(socket.getservbyport(port, 'tcp'), service)
1037 if udpport is not None:
1038 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001039 # Make sure getservbyport does not accept out of range ports.
1040 self.assertRaises(OverflowError, socket.getservbyport, -1)
1041 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001042
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001043 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001044 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001045 # The default timeout should initially be None
1046 self.assertEqual(socket.getdefaulttimeout(), None)
1047 s = socket.socket()
1048 self.assertEqual(s.gettimeout(), None)
1049 s.close()
1050
1051 # Set the default timeout to 10, and see if it propagates
1052 socket.setdefaulttimeout(10)
1053 self.assertEqual(socket.getdefaulttimeout(), 10)
1054 s = socket.socket()
1055 self.assertEqual(s.gettimeout(), 10)
1056 s.close()
1057
1058 # Reset the default timeout to None, and see if it propagates
1059 socket.setdefaulttimeout(None)
1060 self.assertEqual(socket.getdefaulttimeout(), None)
1061 s = socket.socket()
1062 self.assertEqual(s.gettimeout(), None)
1063 s.close()
1064
1065 # Check that setting it to an invalid value raises ValueError
1066 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1067
1068 # Check that setting it to an invalid type raises TypeError
1069 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1070
Serhiy Storchaka43767632013-11-03 21:31:38 +02001071 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1072 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001073 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001074 # Test that issue1008086 and issue767150 are fixed.
1075 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001076 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1077 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001078
Serhiy Storchaka43767632013-11-03 21:31:38 +02001079 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1080 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001081 def testIPv4toString(self):
1082 from socket import inet_aton as f, inet_pton, AF_INET
1083 g = lambda a: inet_pton(AF_INET, a)
1084
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001085 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001086 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001087 )
1088
Ezio Melottib3aedd42010-11-20 19:04:17 +00001089 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1090 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1091 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1092 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1093 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001094 # bpo-29972: inet_pton() doesn't fail on AIX
1095 if not sys.platform.startswith('aix'):
1096 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001097 assertInvalid(f, '300.0.0.0')
1098 assertInvalid(f, 'a.0.0.0')
1099 assertInvalid(f, '1.2.3.4.5')
1100 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001101
Ezio Melottib3aedd42010-11-20 19:04:17 +00001102 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1103 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1104 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1105 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001106 assertInvalid(g, '0.0.0.')
1107 assertInvalid(g, '300.0.0.0')
1108 assertInvalid(g, 'a.0.0.0')
1109 assertInvalid(g, '1.2.3.4.5')
1110 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001111
Serhiy Storchaka43767632013-11-03 21:31:38 +02001112 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1113 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001114 def testIPv6toString(self):
1115 try:
1116 from socket import inet_pton, AF_INET6, has_ipv6
1117 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001118 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001119 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001120 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001121
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001122 if sys.platform == "win32":
1123 try:
1124 inet_pton(AF_INET6, '::')
1125 except OSError as e:
1126 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001127 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001128
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001129 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001130 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001131 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001132 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001133
Ezio Melottib3aedd42010-11-20 19:04:17 +00001134 self.assertEqual(b'\x00' * 16, f('::'))
1135 self.assertEqual(b'\x00' * 16, f('0::0'))
1136 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1137 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001138 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 +00001139 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1140 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001141 self.assertEqual(
1142 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1143 f('ad42:abc::127:0:254:2')
1144 )
1145 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1146 assertInvalid('0x20::')
1147 assertInvalid(':::')
1148 assertInvalid('::0::')
1149 assertInvalid('1::abc::')
1150 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001151 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001152 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001153 # bpo-29972: inet_pton() doesn't fail on AIX
1154 if not sys.platform.startswith('aix'):
1155 assertInvalid('1:2:3:4:5:6:')
1156 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001157
1158 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1159 f('::254.42.23.64')
1160 )
1161 self.assertEqual(
1162 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1163 f('42::a29b:254.42.23.64')
1164 )
1165 self.assertEqual(
1166 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1167 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1168 )
1169 assertInvalid('255.254.253.252')
1170 assertInvalid('1::260.2.3.0')
1171 assertInvalid('1::0.be.e.0')
1172 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1173 assertInvalid('::1.2.3.4:0')
1174 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001175
Serhiy Storchaka43767632013-11-03 21:31:38 +02001176 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1177 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001178 def testStringToIPv4(self):
1179 from socket import inet_ntoa as f, inet_ntop, AF_INET
1180 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001181 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001182 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001183 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001184
Ezio Melottib3aedd42010-11-20 19:04:17 +00001185 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1186 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1187 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1188 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001189 assertInvalid(f, b'\x00' * 3)
1190 assertInvalid(f, b'\x00' * 5)
1191 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001192 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001193
Ezio Melottib3aedd42010-11-20 19:04:17 +00001194 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1195 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1196 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001197 assertInvalid(g, b'\x00' * 3)
1198 assertInvalid(g, b'\x00' * 5)
1199 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001200 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001201
Serhiy Storchaka43767632013-11-03 21:31:38 +02001202 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1203 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001204 def testStringToIPv6(self):
1205 try:
1206 from socket import inet_ntop, AF_INET6, has_ipv6
1207 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001208 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001209 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001210 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001211
1212 if sys.platform == "win32":
1213 try:
1214 inet_ntop(AF_INET6, b'\x00' * 16)
1215 except OSError as e:
1216 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001217 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001218
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001219 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001220 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001221 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001222 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001223
Ezio Melottib3aedd42010-11-20 19:04:17 +00001224 self.assertEqual('::', f(b'\x00' * 16))
1225 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1226 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001227 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001228 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 +00001229 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001230 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001231
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001232 assertInvalid(b'\x12' * 15)
1233 assertInvalid(b'\x12' * 17)
1234 assertInvalid(b'\x12' * 4)
1235
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001236 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001237
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001238 def testSockName(self):
1239 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001240 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001241 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001242 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001243 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001244 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001245 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1246 # it reasonable to get the host's addr in addition to 0.0.0.0.
1247 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001248 try:
1249 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001250 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001251 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001252 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001253 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001254 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001255
1256 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001257 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001258 # We know a socket should start without reuse==0
1259 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001260 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001261 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001262 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001263
1264 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001265 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001266 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001267 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1269 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001270 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001271
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001272 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001273 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001274 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1275 sock.settimeout(1)
1276 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001277 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001278
Martin Panter50ab1a32016-04-11 00:38:12 +00001279 def testCloseException(self):
1280 sock = socket.socket()
1281 socket.socket(fileno=sock.fileno()).close()
1282 try:
1283 sock.close()
1284 except OSError as err:
1285 # Winsock apparently raises ENOTSOCK
1286 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1287 else:
1288 self.fail("close() should raise EBADF/ENOTSOCK")
1289
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001290 def testNewAttributes(self):
1291 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001292
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001293 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1294 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001295 if hasattr(socket, 'SOCK_CLOEXEC'):
1296 self.assertIn(sock.type,
1297 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1298 socket.SOCK_STREAM))
1299 else:
1300 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001301 self.assertEqual(sock.proto, 0)
1302 sock.close()
1303
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001304 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001305 sock = socket.socket()
1306 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001307 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001308 big_port = port + 65536
1309 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001310 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1311 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1312 # Since find_unused_port() is inherently subject to race conditions, we
1313 # call it a couple times if necessary.
1314 for i in itertools.count():
1315 port = support.find_unused_port()
1316 try:
1317 sock.bind((HOST, port))
1318 except OSError as e:
1319 if e.errno != errno.EADDRINUSE or i == 5:
1320 raise
1321 else:
1322 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001323
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001324 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001325 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001326 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1327 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1328 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1329 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001330 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1331 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001332 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001333 self.assertRaises(ValueError, s.ioctl, -1, None)
1334 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001335
Steve Dowerea93ac02016-06-17 12:52:18 -07001336 @unittest.skipUnless(os.name == "nt", "Windows specific")
1337 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1338 'Loopback fast path support required for this test')
1339 def test_sio_loopback_fast_path(self):
1340 s = socket.socket()
1341 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001342 try:
1343 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1344 except OSError as exc:
1345 WSAEOPNOTSUPP = 10045
1346 if exc.winerror == WSAEOPNOTSUPP:
1347 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1348 "doesn't implemented in this Windows version")
1349 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001350 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1351
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001352 def testGetaddrinfo(self):
1353 try:
1354 socket.getaddrinfo('localhost', 80)
1355 except socket.gaierror as err:
1356 if err.errno == socket.EAI_SERVICE:
1357 # see http://bugs.python.org/issue1282647
1358 self.skipTest("buggy libc version")
1359 raise
1360 # len of every sequence is supposed to be == 5
1361 for info in socket.getaddrinfo(HOST, None):
1362 self.assertEqual(len(info), 5)
1363 # host can be a domain name, a string representation of an
1364 # IPv4/v6 address or None
1365 socket.getaddrinfo('localhost', 80)
1366 socket.getaddrinfo('127.0.0.1', 80)
1367 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001368 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001369 socket.getaddrinfo('::1', 80)
1370 # port can be a string service name such as "http", a numeric
1371 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001372 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1373 if (not hasattr(sys, 'getandroidapilevel') or
1374 sys.getandroidapilevel() >= 23):
1375 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001376 socket.getaddrinfo(HOST, 80)
1377 socket.getaddrinfo(HOST, None)
1378 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001379 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1380 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001381 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001382 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1383 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001384 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001385 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1386 for _, socktype, _, _, _ in infos:
1387 self.assertEqual(socktype, socket.SOCK_STREAM)
1388 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001389 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001390 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1391 # a server willing to support both IPv4 and IPv6 will
1392 # usually do this
1393 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1394 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001395 # test keyword arguments
1396 a = socket.getaddrinfo(HOST, None)
1397 b = socket.getaddrinfo(host=HOST, port=None)
1398 self.assertEqual(a, b)
1399 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1400 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1401 self.assertEqual(a, b)
1402 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1403 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1404 self.assertEqual(a, b)
1405 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1406 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1407 self.assertEqual(a, b)
1408 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1409 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1410 self.assertEqual(a, b)
1411 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1412 socket.AI_PASSIVE)
1413 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1414 type=socket.SOCK_STREAM, proto=0,
1415 flags=socket.AI_PASSIVE)
1416 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001417 # Issue #6697.
1418 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001419
Ned Deilyb24f4812014-02-13 22:50:42 -08001420 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001421 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001422 try:
1423 # The arguments here are undefined and the call may succeed
1424 # or fail. All we care here is that it doesn't segfault.
1425 socket.getaddrinfo("localhost", None, 0, 0, 0,
1426 socket.AI_NUMERICSERV)
1427 except socket.gaierror:
1428 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001429
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001430 def test_getnameinfo(self):
1431 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001432 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001433
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001434 @unittest.skipUnless(support.is_resource_enabled('network'),
1435 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001436 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001437 # Check for internet access before running test
1438 # (issue #12804, issue #25138).
1439 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001440 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001441
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001442 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001443 domain = 'испытание.pythontest.net'
1444 socket.gethostbyname(domain)
1445 socket.gethostbyname_ex(domain)
1446 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Mike53f7a7c2017-12-14 14:04:53 +03001447 # 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 +00001448 # have a reverse entry yet
1449 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001450
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001451 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001452 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001453 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1454 self.skipTest("signal.alarm and socket.socketpair required for this test")
1455 # Our signal handlers clobber the C errno by calling a math function
1456 # with an invalid domain value.
1457 def ok_handler(*args):
1458 self.assertRaises(ValueError, math.acosh, 0)
1459 def raising_handler(*args):
1460 self.assertRaises(ValueError, math.acosh, 0)
1461 1 // 0
1462 c, s = socket.socketpair()
1463 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1464 try:
1465 if with_timeout:
1466 # Just above the one second minimum for signal.alarm
1467 c.settimeout(1.5)
1468 with self.assertRaises(ZeroDivisionError):
1469 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001470 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001471 if with_timeout:
1472 signal.signal(signal.SIGALRM, ok_handler)
1473 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001474 self.assertRaises(socket.timeout, c.sendall,
1475 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001476 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001477 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001478 signal.signal(signal.SIGALRM, old_alarm)
1479 c.close()
1480 s.close()
1481
1482 def test_sendall_interrupted(self):
1483 self.check_sendall_interrupted(False)
1484
1485 def test_sendall_interrupted_with_timeout(self):
1486 self.check_sendall_interrupted(True)
1487
Antoine Pitroue033e062010-10-29 10:38:18 +00001488 def test_dealloc_warn(self):
1489 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1490 r = repr(sock)
1491 with self.assertWarns(ResourceWarning) as cm:
1492 sock = None
1493 support.gc_collect()
1494 self.assertIn(r, str(cm.warning.args[0]))
1495 # An open socket file object gets dereferenced after the socket
1496 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1497 f = sock.makefile('rb')
1498 r = repr(sock)
1499 sock = None
1500 support.gc_collect()
1501 with self.assertWarns(ResourceWarning):
1502 f = None
1503 support.gc_collect()
1504
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001505 def test_name_closed_socketio(self):
1506 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1507 fp = sock.makefile("rb")
1508 fp.close()
1509 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1510
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001511 def test_unusable_closed_socketio(self):
1512 with socket.socket() as sock:
1513 fp = sock.makefile("rb", buffering=0)
1514 self.assertTrue(fp.readable())
1515 self.assertFalse(fp.writable())
1516 self.assertFalse(fp.seekable())
1517 fp.close()
1518 self.assertRaises(ValueError, fp.readable)
1519 self.assertRaises(ValueError, fp.writable)
1520 self.assertRaises(ValueError, fp.seekable)
1521
Berker Peksag3fe64d02016-02-18 17:34:00 +02001522 def test_makefile_mode(self):
1523 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1524 with self.subTest(mode=mode):
1525 with socket.socket() as sock:
1526 with sock.makefile(mode) as fp:
1527 self.assertEqual(fp.mode, mode)
1528
1529 def test_makefile_invalid_mode(self):
1530 for mode in 'rt', 'x', '+', 'a':
1531 with self.subTest(mode=mode):
1532 with socket.socket() as sock:
1533 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1534 sock.makefile(mode)
1535
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001536 def test_pickle(self):
1537 sock = socket.socket()
1538 with sock:
1539 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1540 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001541 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1542 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1543 self.assertEqual(family, socket.AF_INET)
1544 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1545 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001546
Serhiy Storchaka78980432013-01-15 01:12:17 +02001547 def test_listen_backlog(self):
1548 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001549 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1550 srv.bind((HOST, 0))
1551 srv.listen(backlog)
1552
1553 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001554 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001555 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001556
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001557 @support.cpython_only
1558 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001559 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001560 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001561 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1562 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001563 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001564 srv.close()
1565
Charles-François Natali42663332012-01-02 15:57:30 +01001566 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001567 def test_flowinfo(self):
1568 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001569 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001570 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001571 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001572
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001573 def test_str_for_enums(self):
1574 # Make sure that the AF_* and SOCK_* constants have enum-like string
1575 # reprs.
1576 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1577 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001578 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001579
Yury Selivanov98181422017-12-18 20:02:54 -05001580 def test_socket_consistent_sock_type(self):
1581 SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
1582 SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
1583 sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
1584
1585 with socket.socket(socket.AF_INET, sock_type) as s:
1586 self.assertEqual(s.type, socket.SOCK_STREAM)
1587 s.settimeout(1)
1588 self.assertEqual(s.type, socket.SOCK_STREAM)
1589 s.settimeout(0)
1590 self.assertEqual(s.type, socket.SOCK_STREAM)
1591 s.setblocking(True)
1592 self.assertEqual(s.type, socket.SOCK_STREAM)
1593 s.setblocking(False)
1594 self.assertEqual(s.type, socket.SOCK_STREAM)
1595
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001596 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1597 def test_uknown_socket_family_repr(self):
1598 # Test that when created with a family that's not one of the known
1599 # AF_*/SOCK_* constants, socket.family just returns the number.
1600 #
1601 # To do this we fool socket.socket into believing it already has an
1602 # open fd because on this path it doesn't actually verify the family and
1603 # type and populates the socket object.
1604 #
1605 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001606 fd, path = tempfile.mkstemp()
1607 self.addCleanup(os.unlink, path)
Yury Selivanov98181422017-12-18 20:02:54 -05001608 unknown_family = max(socket.AddressFamily.__members__.values()) + 1
1609
1610 unknown_type = max(
1611 kind
1612 for name, kind in socket.SocketKind.__members__.items()
1613 if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
1614 ) + 1
1615
1616 with socket.socket(
1617 family=unknown_family, type=unknown_type, fileno=fd) as s:
1618 self.assertEqual(s.family, unknown_family)
1619 self.assertEqual(s.type, unknown_type)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001620
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001621 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1622 def test__sendfile_use_sendfile(self):
1623 class File:
1624 def __init__(self, fd):
1625 self.fd = fd
1626
1627 def fileno(self):
1628 return self.fd
1629 with socket.socket() as sock:
1630 fd = os.open(os.curdir, os.O_RDONLY)
1631 os.close(fd)
1632 with self.assertRaises(socket._GiveupOnSendfile):
1633 sock._sendfile_use_sendfile(File(fd))
1634 with self.assertRaises(OverflowError):
1635 sock._sendfile_use_sendfile(File(2**1000))
1636 with self.assertRaises(TypeError):
1637 sock._sendfile_use_sendfile(File(None))
1638
1639
Charles-François Natali47413c12011-10-06 19:47:44 +02001640@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1641class BasicCANTest(unittest.TestCase):
1642
1643 def testCrucialConstants(self):
1644 socket.AF_CAN
1645 socket.PF_CAN
1646 socket.CAN_RAW
1647
Charles-François Natali773e42d2013-02-05 19:42:01 +01001648 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1649 'socket.CAN_BCM required for this test.')
1650 def testBCMConstants(self):
1651 socket.CAN_BCM
1652
1653 # opcodes
1654 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1655 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1656 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1657 socket.CAN_BCM_TX_SEND # send one CAN frame
1658 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1659 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1660 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1661 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1662 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1663 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1664 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1665 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1666
Charles-François Natali47413c12011-10-06 19:47:44 +02001667 def testCreateSocket(self):
1668 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1669 pass
1670
Charles-François Natali773e42d2013-02-05 19:42:01 +01001671 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1672 'socket.CAN_BCM required for this test.')
1673 def testCreateBCMSocket(self):
1674 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1675 pass
1676
Charles-François Natali47413c12011-10-06 19:47:44 +02001677 def testBindAny(self):
1678 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1679 s.bind(('', ))
1680
1681 def testTooLongInterfaceName(self):
1682 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1683 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001684 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001685 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001686
1687 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1688 'socket.CAN_RAW_LOOPBACK required for this test.')
1689 def testLoopback(self):
1690 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1691 for loopback in (0, 1):
1692 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1693 loopback)
1694 self.assertEqual(loopback,
1695 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1696
1697 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1698 'socket.CAN_RAW_FILTER required for this test.')
1699 def testFilter(self):
1700 can_id, can_mask = 0x200, 0x700
1701 can_filter = struct.pack("=II", can_id, can_mask)
1702 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1703 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1704 self.assertEqual(can_filter,
1705 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001706 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001707
1708
1709@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001710class CANTest(ThreadedCANSocketTest):
1711
Charles-François Natali47413c12011-10-06 19:47:44 +02001712 def __init__(self, methodName='runTest'):
1713 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1714
1715 @classmethod
1716 def build_can_frame(cls, can_id, data):
1717 """Build a CAN frame."""
1718 can_dlc = len(data)
1719 data = data.ljust(8, b'\x00')
1720 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1721
1722 @classmethod
1723 def dissect_can_frame(cls, frame):
1724 """Dissect a CAN frame."""
1725 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1726 return (can_id, can_dlc, data[:can_dlc])
1727
1728 def testSendFrame(self):
1729 cf, addr = self.s.recvfrom(self.bufsize)
1730 self.assertEqual(self.cf, cf)
1731 self.assertEqual(addr[0], self.interface)
1732 self.assertEqual(addr[1], socket.AF_CAN)
1733
1734 def _testSendFrame(self):
1735 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1736 self.cli.send(self.cf)
1737
1738 def testSendMaxFrame(self):
1739 cf, addr = self.s.recvfrom(self.bufsize)
1740 self.assertEqual(self.cf, cf)
1741
1742 def _testSendMaxFrame(self):
1743 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1744 self.cli.send(self.cf)
1745
1746 def testSendMultiFrames(self):
1747 cf, addr = self.s.recvfrom(self.bufsize)
1748 self.assertEqual(self.cf1, cf)
1749
1750 cf, addr = self.s.recvfrom(self.bufsize)
1751 self.assertEqual(self.cf2, cf)
1752
1753 def _testSendMultiFrames(self):
1754 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1755 self.cli.send(self.cf1)
1756
1757 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1758 self.cli.send(self.cf2)
1759
Charles-François Natali773e42d2013-02-05 19:42:01 +01001760 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1761 'socket.CAN_BCM required for this test.')
1762 def _testBCM(self):
1763 cf, addr = self.cli.recvfrom(self.bufsize)
1764 self.assertEqual(self.cf, cf)
1765 can_id, can_dlc, data = self.dissect_can_frame(cf)
1766 self.assertEqual(self.can_id, can_id)
1767 self.assertEqual(self.data, data)
1768
1769 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1770 'socket.CAN_BCM required for this test.')
1771 def testBCM(self):
1772 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1773 self.addCleanup(bcm.close)
1774 bcm.connect((self.interface,))
1775 self.can_id = 0x123
1776 self.data = bytes([0xc0, 0xff, 0xee])
1777 self.cf = self.build_can_frame(self.can_id, self.data)
1778 opcode = socket.CAN_BCM_TX_SEND
1779 flags = 0
1780 count = 0
1781 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1782 bcm_can_id = 0x0222
1783 nframes = 1
1784 assert len(self.cf) == 16
1785 header = struct.pack(self.bcm_cmd_msg_fmt,
1786 opcode,
1787 flags,
1788 count,
1789 ival1_seconds,
1790 ival1_usec,
1791 ival2_seconds,
1792 ival2_usec,
1793 bcm_can_id,
1794 nframes,
1795 )
1796 header_plus_frame = header + self.cf
1797 bytes_sent = bcm.send(header_plus_frame)
1798 self.assertEqual(bytes_sent, len(header_plus_frame))
1799
Charles-François Natali47413c12011-10-06 19:47:44 +02001800
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001801@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1802class ISOTPTest(unittest.TestCase):
1803
1804 def __init__(self, *args, **kwargs):
1805 super().__init__(*args, **kwargs)
1806 self.interface = "vcan0"
1807
1808 def testCrucialConstants(self):
1809 socket.AF_CAN
1810 socket.PF_CAN
1811 socket.CAN_ISOTP
1812 socket.SOCK_DGRAM
1813
1814 def testCreateSocket(self):
1815 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1816 pass
1817
1818 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1819 'socket.CAN_ISOTP required for this test.')
1820 def testCreateISOTPSocket(self):
1821 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1822 pass
1823
1824 def testTooLongInterfaceName(self):
1825 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1826 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1827 with self.assertRaisesRegex(OSError, 'interface name too long'):
1828 s.bind(('x' * 1024, 1, 2))
1829
1830 def testBind(self):
1831 try:
1832 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1833 addr = self.interface, 0x123, 0x456
1834 s.bind(addr)
1835 self.assertEqual(s.getsockname(), addr)
1836 except OSError as e:
1837 if e.errno == errno.ENODEV:
1838 self.skipTest('network interface `%s` does not exist' %
1839 self.interface)
1840 else:
1841 raise
1842
1843
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001844@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1845class BasicRDSTest(unittest.TestCase):
1846
1847 def testCrucialConstants(self):
1848 socket.AF_RDS
1849 socket.PF_RDS
1850
1851 def testCreateSocket(self):
1852 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1853 pass
1854
1855 def testSocketBufferSize(self):
1856 bufsize = 16384
1857 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1858 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1859 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1860
1861
1862@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001863class RDSTest(ThreadedRDSSocketTest):
1864
1865 def __init__(self, methodName='runTest'):
1866 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1867
Charles-François Natali240c55f2011-11-10 20:33:36 +01001868 def setUp(self):
1869 super().setUp()
1870 self.evt = threading.Event()
1871
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001872 def testSendAndRecv(self):
1873 data, addr = self.serv.recvfrom(self.bufsize)
1874 self.assertEqual(self.data, data)
1875 self.assertEqual(self.cli_addr, addr)
1876
1877 def _testSendAndRecv(self):
1878 self.data = b'spam'
1879 self.cli.sendto(self.data, 0, (HOST, self.port))
1880
1881 def testPeek(self):
1882 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1883 self.assertEqual(self.data, data)
1884 data, addr = self.serv.recvfrom(self.bufsize)
1885 self.assertEqual(self.data, data)
1886
1887 def _testPeek(self):
1888 self.data = b'spam'
1889 self.cli.sendto(self.data, 0, (HOST, self.port))
1890
1891 @requireAttrs(socket.socket, 'recvmsg')
1892 def testSendAndRecvMsg(self):
1893 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1894 self.assertEqual(self.data, data)
1895
1896 @requireAttrs(socket.socket, 'sendmsg')
1897 def _testSendAndRecvMsg(self):
1898 self.data = b'hello ' * 10
1899 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1900
1901 def testSendAndRecvMulti(self):
1902 data, addr = self.serv.recvfrom(self.bufsize)
1903 self.assertEqual(self.data1, data)
1904
1905 data, addr = self.serv.recvfrom(self.bufsize)
1906 self.assertEqual(self.data2, data)
1907
1908 def _testSendAndRecvMulti(self):
1909 self.data1 = b'bacon'
1910 self.cli.sendto(self.data1, 0, (HOST, self.port))
1911
1912 self.data2 = b'egg'
1913 self.cli.sendto(self.data2, 0, (HOST, self.port))
1914
1915 def testSelect(self):
1916 r, w, x = select.select([self.serv], [], [], 3.0)
1917 self.assertIn(self.serv, r)
1918 data, addr = self.serv.recvfrom(self.bufsize)
1919 self.assertEqual(self.data, data)
1920
1921 def _testSelect(self):
1922 self.data = b'select'
1923 self.cli.sendto(self.data, 0, (HOST, self.port))
1924
1925 def testCongestion(self):
1926 # wait until the sender is done
1927 self.evt.wait()
1928
1929 def _testCongestion(self):
1930 # test the behavior in case of congestion
1931 self.data = b'fill'
1932 self.cli.setblocking(False)
1933 try:
1934 # try to lower the receiver's socket buffer size
1935 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1936 except OSError:
1937 pass
1938 with self.assertRaises(OSError) as cm:
1939 try:
1940 # fill the receiver's socket buffer
1941 while True:
1942 self.cli.sendto(self.data, 0, (HOST, self.port))
1943 finally:
1944 # signal the receiver we're done
1945 self.evt.set()
1946 # sendto() should have failed with ENOBUFS
1947 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1948 # and we should have received a congestion notification through poll
1949 r, w, x = select.select([self.serv], [], [], 3.0)
1950 self.assertIn(self.serv, r)
1951
1952
caaveryeffc12f2017-09-06 18:18:10 -04001953@unittest.skipIf(fcntl is None, "need fcntl")
1954@unittest.skipUnless(HAVE_SOCKET_VSOCK,
1955 'VSOCK sockets required for this test.')
1956class BasicVSOCKTest(unittest.TestCase):
1957
1958 def testCrucialConstants(self):
1959 socket.AF_VSOCK
1960
1961 def testVSOCKConstants(self):
1962 socket.SO_VM_SOCKETS_BUFFER_SIZE
1963 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
1964 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
1965 socket.VMADDR_CID_ANY
1966 socket.VMADDR_PORT_ANY
1967 socket.VMADDR_CID_HOST
1968 socket.VM_SOCKETS_INVALID_VERSION
1969 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
1970
1971 def testCreateSocket(self):
1972 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1973 pass
1974
1975 def testSocketBufferSize(self):
1976 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1977 orig_max = s.getsockopt(socket.AF_VSOCK,
1978 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
1979 orig = s.getsockopt(socket.AF_VSOCK,
1980 socket.SO_VM_SOCKETS_BUFFER_SIZE)
1981 orig_min = s.getsockopt(socket.AF_VSOCK,
1982 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
1983
1984 s.setsockopt(socket.AF_VSOCK,
1985 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
1986 s.setsockopt(socket.AF_VSOCK,
1987 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
1988 s.setsockopt(socket.AF_VSOCK,
1989 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
1990
1991 self.assertEqual(orig_max * 2,
1992 s.getsockopt(socket.AF_VSOCK,
1993 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
1994 self.assertEqual(orig * 2,
1995 s.getsockopt(socket.AF_VSOCK,
1996 socket.SO_VM_SOCKETS_BUFFER_SIZE))
1997 self.assertEqual(orig_min * 2,
1998 s.getsockopt(socket.AF_VSOCK,
1999 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
2000
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002001
Guido van Rossum24e4af82002-06-12 19:18:08 +00002002class BasicTCPTest(SocketConnectedTest):
2003
2004 def __init__(self, methodName='runTest'):
2005 SocketConnectedTest.__init__(self, methodName=methodName)
2006
2007 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002008 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002009 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002010 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002011
2012 def _testRecv(self):
2013 self.serv_conn.send(MSG)
2014
2015 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002016 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002017 seg1 = self.cli_conn.recv(len(MSG) - 3)
2018 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002019 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002020 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002021
2022 def _testOverFlowRecv(self):
2023 self.serv_conn.send(MSG)
2024
2025 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002026 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002027 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002028 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002029
2030 def _testRecvFrom(self):
2031 self.serv_conn.send(MSG)
2032
2033 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002034 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002035 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2036 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002037 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002038 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002039
2040 def _testOverFlowRecvFrom(self):
2041 self.serv_conn.send(MSG)
2042
2043 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002044 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002045 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002046 while 1:
2047 read = self.cli_conn.recv(1024)
2048 if not read:
2049 break
Guido van Rossume531e292002-08-08 20:28:34 +00002050 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002051 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002052
2053 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002054 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002055 self.serv_conn.sendall(big_chunk)
2056
2057 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002058 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002059 fd = self.cli_conn.fileno()
2060 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002061 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002062 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002063 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002064 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002065
2066 def _testFromFd(self):
2067 self.serv_conn.send(MSG)
2068
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002069 def testDup(self):
2070 # Testing dup()
2071 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002072 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002073 msg = sock.recv(1024)
2074 self.assertEqual(msg, MSG)
2075
2076 def _testDup(self):
2077 self.serv_conn.send(MSG)
2078
Guido van Rossum24e4af82002-06-12 19:18:08 +00002079 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002080 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002081 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002082 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002083 # wait for _testShutdown to finish: on OS X, when the server
2084 # closes the connection the client also becomes disconnected,
2085 # and the client's shutdown call will fail. (Issue #4397.)
2086 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002087
2088 def _testShutdown(self):
2089 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002090 self.serv_conn.shutdown(2)
2091
2092 testShutdown_overflow = support.cpython_only(testShutdown)
2093
2094 @support.cpython_only
2095 def _testShutdown_overflow(self):
2096 import _testcapi
2097 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002098 # Issue 15989
2099 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2100 _testcapi.INT_MAX + 1)
2101 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2102 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002103 self.serv_conn.shutdown(2)
2104
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002105 def testDetach(self):
2106 # Testing detach()
2107 fileno = self.cli_conn.fileno()
2108 f = self.cli_conn.detach()
2109 self.assertEqual(f, fileno)
2110 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002111 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002112 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002113 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002114 # ...but we can create another socket using the (still open)
2115 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002116 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002117 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002118 msg = sock.recv(1024)
2119 self.assertEqual(msg, MSG)
2120
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002121 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002122 self.serv_conn.send(MSG)
2123
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002124
Guido van Rossum24e4af82002-06-12 19:18:08 +00002125class BasicUDPTest(ThreadedUDPSocketTest):
2126
2127 def __init__(self, methodName='runTest'):
2128 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2129
2130 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002131 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002132 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002133 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002134
2135 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002136 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002137
Guido van Rossum1c938012002-06-12 21:17:20 +00002138 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002139 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002140 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002141 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002142
Guido van Rossum1c938012002-06-12 21:17:20 +00002143 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002144 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002145
Guido van Rossumd8faa362007-04-27 19:54:29 +00002146 def testRecvFromNegative(self):
2147 # Negative lengths passed to recvfrom should give ValueError.
2148 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2149
2150 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002151 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002152
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002153# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2154# same test code is used with different families and types of socket
2155# (e.g. stream, datagram), and tests using recvmsg() are repeated
2156# using recvmsg_into().
2157#
2158# The generic test classes such as SendmsgTests and
2159# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2160# supplied with sockets cli_sock and serv_sock representing the
2161# client's and the server's end of the connection respectively, and
2162# attributes cli_addr and serv_addr holding their (numeric where
2163# appropriate) addresses.
2164#
2165# The final concrete test classes combine these with subclasses of
2166# SocketTestBase which set up client and server sockets of a specific
2167# type, and with subclasses of SendrecvmsgBase such as
2168# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2169# sockets to cli_sock and serv_sock and override the methods and
2170# attributes of SendrecvmsgBase to fill in destination addresses if
2171# needed when sending, check for specific flags in msg_flags, etc.
2172#
2173# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2174# recvmsg_into().
2175
2176# XXX: like the other datagram (UDP) tests in this module, the code
2177# here assumes that datagram delivery on the local machine will be
2178# reliable.
2179
2180class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2181 # Base class for sendmsg()/recvmsg() tests.
2182
2183 # Time in seconds to wait before considering a test failed, or
2184 # None for no timeout. Not all tests actually set a timeout.
2185 fail_timeout = 3.0
2186
2187 def setUp(self):
2188 self.misc_event = threading.Event()
2189 super().setUp()
2190
2191 def sendToServer(self, msg):
2192 # Send msg to the server.
2193 return self.cli_sock.send(msg)
2194
2195 # Tuple of alternative default arguments for sendmsg() when called
2196 # via sendmsgToServer() (e.g. to include a destination address).
2197 sendmsg_to_server_defaults = ()
2198
2199 def sendmsgToServer(self, *args):
2200 # Call sendmsg() on self.cli_sock with the given arguments,
2201 # filling in any arguments which are not supplied with the
2202 # corresponding items of self.sendmsg_to_server_defaults, if
2203 # any.
2204 return self.cli_sock.sendmsg(
2205 *(args + self.sendmsg_to_server_defaults[len(args):]))
2206
2207 def doRecvmsg(self, sock, bufsize, *args):
2208 # Call recvmsg() on sock with given arguments and return its
2209 # result. Should be used for tests which can use either
2210 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2211 # this method with one which emulates it using recvmsg_into(),
2212 # thus allowing the same test to be used for both methods.
2213 result = sock.recvmsg(bufsize, *args)
2214 self.registerRecvmsgResult(result)
2215 return result
2216
2217 def registerRecvmsgResult(self, result):
2218 # Called by doRecvmsg() with the return value of recvmsg() or
2219 # recvmsg_into(). Can be overridden to arrange cleanup based
2220 # on the returned ancillary data, for instance.
2221 pass
2222
2223 def checkRecvmsgAddress(self, addr1, addr2):
2224 # Called to compare the received address with the address of
2225 # the peer.
2226 self.assertEqual(addr1, addr2)
2227
2228 # Flags that are normally unset in msg_flags
2229 msg_flags_common_unset = 0
2230 for name in ("MSG_CTRUNC", "MSG_OOB"):
2231 msg_flags_common_unset |= getattr(socket, name, 0)
2232
2233 # Flags that are normally set
2234 msg_flags_common_set = 0
2235
2236 # Flags set when a complete record has been received (e.g. MSG_EOR
2237 # for SCTP)
2238 msg_flags_eor_indicator = 0
2239
2240 # Flags set when a complete record has not been received
2241 # (e.g. MSG_TRUNC for datagram sockets)
2242 msg_flags_non_eor_indicator = 0
2243
2244 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2245 # Method to check the value of msg_flags returned by recvmsg[_into]().
2246 #
2247 # Checks that all bits in msg_flags_common_set attribute are
2248 # set in "flags" and all bits in msg_flags_common_unset are
2249 # unset.
2250 #
2251 # The "eor" argument specifies whether the flags should
2252 # indicate that a full record (or datagram) has been received.
2253 # If "eor" is None, no checks are done; otherwise, checks
2254 # that:
2255 #
2256 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2257 # set and all bits in msg_flags_non_eor_indicator are unset
2258 #
2259 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2260 # are set and all bits in msg_flags_eor_indicator are unset
2261 #
2262 # If "checkset" and/or "checkunset" are supplied, they require
2263 # the given bits to be set or unset respectively, overriding
2264 # what the attributes require for those bits.
2265 #
2266 # If any bits are set in "ignore", they will not be checked,
2267 # regardless of the other inputs.
2268 #
2269 # Will raise Exception if the inputs require a bit to be both
2270 # set and unset, and it is not ignored.
2271
2272 defaultset = self.msg_flags_common_set
2273 defaultunset = self.msg_flags_common_unset
2274
2275 if eor:
2276 defaultset |= self.msg_flags_eor_indicator
2277 defaultunset |= self.msg_flags_non_eor_indicator
2278 elif eor is not None:
2279 defaultset |= self.msg_flags_non_eor_indicator
2280 defaultunset |= self.msg_flags_eor_indicator
2281
2282 # Function arguments override defaults
2283 defaultset &= ~checkunset
2284 defaultunset &= ~checkset
2285
2286 # Merge arguments with remaining defaults, and check for conflicts
2287 checkset |= defaultset
2288 checkunset |= defaultunset
2289 inboth = checkset & checkunset & ~ignore
2290 if inboth:
2291 raise Exception("contradictory set, unset requirements for flags "
2292 "{0:#x}".format(inboth))
2293
2294 # Compare with given msg_flags value
2295 mask = (checkset | checkunset) & ~ignore
2296 self.assertEqual(flags & mask, checkset & mask)
2297
2298
2299class RecvmsgIntoMixin(SendrecvmsgBase):
2300 # Mixin to implement doRecvmsg() using recvmsg_into().
2301
2302 def doRecvmsg(self, sock, bufsize, *args):
2303 buf = bytearray(bufsize)
2304 result = sock.recvmsg_into([buf], *args)
2305 self.registerRecvmsgResult(result)
2306 self.assertGreaterEqual(result[0], 0)
2307 self.assertLessEqual(result[0], bufsize)
2308 return (bytes(buf[:result[0]]),) + result[1:]
2309
2310
2311class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2312 # Defines flags to be checked in msg_flags for datagram sockets.
2313
2314 @property
2315 def msg_flags_non_eor_indicator(self):
2316 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2317
2318
2319class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2320 # Defines flags to be checked in msg_flags for SCTP sockets.
2321
2322 @property
2323 def msg_flags_eor_indicator(self):
2324 return super().msg_flags_eor_indicator | socket.MSG_EOR
2325
2326
2327class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2328 # Base class for tests on connectionless-mode sockets. Users must
2329 # supply sockets on attributes cli and serv to be mapped to
2330 # cli_sock and serv_sock respectively.
2331
2332 @property
2333 def serv_sock(self):
2334 return self.serv
2335
2336 @property
2337 def cli_sock(self):
2338 return self.cli
2339
2340 @property
2341 def sendmsg_to_server_defaults(self):
2342 return ([], [], 0, self.serv_addr)
2343
2344 def sendToServer(self, msg):
2345 return self.cli_sock.sendto(msg, self.serv_addr)
2346
2347
2348class SendrecvmsgConnectedBase(SendrecvmsgBase):
2349 # Base class for tests on connected sockets. Users must supply
2350 # sockets on attributes serv_conn and cli_conn (representing the
2351 # connections *to* the server and the client), to be mapped to
2352 # cli_sock and serv_sock respectively.
2353
2354 @property
2355 def serv_sock(self):
2356 return self.cli_conn
2357
2358 @property
2359 def cli_sock(self):
2360 return self.serv_conn
2361
2362 def checkRecvmsgAddress(self, addr1, addr2):
2363 # Address is currently "unspecified" for a connected socket,
2364 # so we don't examine it
2365 pass
2366
2367
2368class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2369 # Base class to set a timeout on server's socket.
2370
2371 def setUp(self):
2372 super().setUp()
2373 self.serv_sock.settimeout(self.fail_timeout)
2374
2375
2376class SendmsgTests(SendrecvmsgServerTimeoutBase):
2377 # Tests for sendmsg() which can use any socket type and do not
2378 # involve recvmsg() or recvmsg_into().
2379
2380 def testSendmsg(self):
2381 # Send a simple message with sendmsg().
2382 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2383
2384 def _testSendmsg(self):
2385 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2386
2387 def testSendmsgDataGenerator(self):
2388 # Send from buffer obtained from a generator (not a sequence).
2389 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2390
2391 def _testSendmsgDataGenerator(self):
2392 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2393 len(MSG))
2394
2395 def testSendmsgAncillaryGenerator(self):
2396 # Gather (empty) ancillary data from a generator.
2397 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2398
2399 def _testSendmsgAncillaryGenerator(self):
2400 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2401 len(MSG))
2402
2403 def testSendmsgArray(self):
2404 # Send data from an array instead of the usual bytes object.
2405 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2406
2407 def _testSendmsgArray(self):
2408 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2409 len(MSG))
2410
2411 def testSendmsgGather(self):
2412 # Send message data from more than one buffer (gather write).
2413 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2414
2415 def _testSendmsgGather(self):
2416 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2417
2418 def testSendmsgBadArgs(self):
2419 # Check that sendmsg() rejects invalid arguments.
2420 self.assertEqual(self.serv_sock.recv(1000), b"done")
2421
2422 def _testSendmsgBadArgs(self):
2423 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2424 self.assertRaises(TypeError, self.sendmsgToServer,
2425 b"not in an iterable")
2426 self.assertRaises(TypeError, self.sendmsgToServer,
2427 object())
2428 self.assertRaises(TypeError, self.sendmsgToServer,
2429 [object()])
2430 self.assertRaises(TypeError, self.sendmsgToServer,
2431 [MSG, object()])
2432 self.assertRaises(TypeError, self.sendmsgToServer,
2433 [MSG], object())
2434 self.assertRaises(TypeError, self.sendmsgToServer,
2435 [MSG], [], object())
2436 self.assertRaises(TypeError, self.sendmsgToServer,
2437 [MSG], [], 0, object())
2438 self.sendToServer(b"done")
2439
2440 def testSendmsgBadCmsg(self):
2441 # Check that invalid ancillary data items are rejected.
2442 self.assertEqual(self.serv_sock.recv(1000), b"done")
2443
2444 def _testSendmsgBadCmsg(self):
2445 self.assertRaises(TypeError, self.sendmsgToServer,
2446 [MSG], [object()])
2447 self.assertRaises(TypeError, self.sendmsgToServer,
2448 [MSG], [(object(), 0, b"data")])
2449 self.assertRaises(TypeError, self.sendmsgToServer,
2450 [MSG], [(0, object(), b"data")])
2451 self.assertRaises(TypeError, self.sendmsgToServer,
2452 [MSG], [(0, 0, object())])
2453 self.assertRaises(TypeError, self.sendmsgToServer,
2454 [MSG], [(0, 0)])
2455 self.assertRaises(TypeError, self.sendmsgToServer,
2456 [MSG], [(0, 0, b"data", 42)])
2457 self.sendToServer(b"done")
2458
2459 @requireAttrs(socket, "CMSG_SPACE")
2460 def testSendmsgBadMultiCmsg(self):
2461 # Check that invalid ancillary data items are rejected when
2462 # more than one item is present.
2463 self.assertEqual(self.serv_sock.recv(1000), b"done")
2464
2465 @testSendmsgBadMultiCmsg.client_skip
2466 def _testSendmsgBadMultiCmsg(self):
2467 self.assertRaises(TypeError, self.sendmsgToServer,
2468 [MSG], [0, 0, b""])
2469 self.assertRaises(TypeError, self.sendmsgToServer,
2470 [MSG], [(0, 0, b""), object()])
2471 self.sendToServer(b"done")
2472
2473 def testSendmsgExcessCmsgReject(self):
2474 # Check that sendmsg() rejects excess ancillary data items
2475 # when the number that can be sent is limited.
2476 self.assertEqual(self.serv_sock.recv(1000), b"done")
2477
2478 def _testSendmsgExcessCmsgReject(self):
2479 if not hasattr(socket, "CMSG_SPACE"):
2480 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002481 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002482 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2483 self.assertIsNone(cm.exception.errno)
2484 self.sendToServer(b"done")
2485
2486 def testSendmsgAfterClose(self):
2487 # Check that sendmsg() fails on a closed socket.
2488 pass
2489
2490 def _testSendmsgAfterClose(self):
2491 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002492 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002493
2494
2495class SendmsgStreamTests(SendmsgTests):
2496 # Tests for sendmsg() which require a stream socket and do not
2497 # involve recvmsg() or recvmsg_into().
2498
2499 def testSendmsgExplicitNoneAddr(self):
2500 # Check that peer address can be specified as None.
2501 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2502
2503 def _testSendmsgExplicitNoneAddr(self):
2504 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2505
2506 def testSendmsgTimeout(self):
2507 # Check that timeout works with sendmsg().
2508 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2509 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2510
2511 def _testSendmsgTimeout(self):
2512 try:
2513 self.cli_sock.settimeout(0.03)
2514 with self.assertRaises(socket.timeout):
2515 while True:
2516 self.sendmsgToServer([b"a"*512])
2517 finally:
2518 self.misc_event.set()
2519
2520 # XXX: would be nice to have more tests for sendmsg flags argument.
2521
2522 # Linux supports MSG_DONTWAIT when sending, but in general, it
2523 # only works when receiving. Could add other platforms if they
2524 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002525 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002526 "MSG_DONTWAIT not known to work on this platform when "
2527 "sending")
2528 def testSendmsgDontWait(self):
2529 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2530 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2531 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2532
2533 @testSendmsgDontWait.client_skip
2534 def _testSendmsgDontWait(self):
2535 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002536 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002537 while True:
2538 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2539 self.assertIn(cm.exception.errno,
2540 (errno.EAGAIN, errno.EWOULDBLOCK))
2541 finally:
2542 self.misc_event.set()
2543
2544
2545class SendmsgConnectionlessTests(SendmsgTests):
2546 # Tests for sendmsg() which require a connectionless-mode
2547 # (e.g. datagram) socket, and do not involve recvmsg() or
2548 # recvmsg_into().
2549
2550 def testSendmsgNoDestAddr(self):
2551 # Check that sendmsg() fails when no destination address is
2552 # given for unconnected socket.
2553 pass
2554
2555 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002556 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002557 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002558 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002559 [MSG], [], 0, None)
2560
2561
2562class RecvmsgGenericTests(SendrecvmsgBase):
2563 # Tests for recvmsg() which can also be emulated using
2564 # recvmsg_into(), and can use any socket type.
2565
2566 def testRecvmsg(self):
2567 # Receive a simple message with recvmsg[_into]().
2568 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2569 self.assertEqual(msg, MSG)
2570 self.checkRecvmsgAddress(addr, self.cli_addr)
2571 self.assertEqual(ancdata, [])
2572 self.checkFlags(flags, eor=True)
2573
2574 def _testRecvmsg(self):
2575 self.sendToServer(MSG)
2576
2577 def testRecvmsgExplicitDefaults(self):
2578 # Test recvmsg[_into]() with default arguments provided explicitly.
2579 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2580 len(MSG), 0, 0)
2581 self.assertEqual(msg, MSG)
2582 self.checkRecvmsgAddress(addr, self.cli_addr)
2583 self.assertEqual(ancdata, [])
2584 self.checkFlags(flags, eor=True)
2585
2586 def _testRecvmsgExplicitDefaults(self):
2587 self.sendToServer(MSG)
2588
2589 def testRecvmsgShorter(self):
2590 # Receive a message smaller than buffer.
2591 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2592 len(MSG) + 42)
2593 self.assertEqual(msg, MSG)
2594 self.checkRecvmsgAddress(addr, self.cli_addr)
2595 self.assertEqual(ancdata, [])
2596 self.checkFlags(flags, eor=True)
2597
2598 def _testRecvmsgShorter(self):
2599 self.sendToServer(MSG)
2600
Charles-François Natali8619cd72011-10-03 19:43:15 +02002601 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2602 # datagram is received (issue #13001).
2603 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002604 def testRecvmsgTrunc(self):
2605 # Receive part of message, check for truncation indicators.
2606 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2607 len(MSG) - 3)
2608 self.assertEqual(msg, MSG[:-3])
2609 self.checkRecvmsgAddress(addr, self.cli_addr)
2610 self.assertEqual(ancdata, [])
2611 self.checkFlags(flags, eor=False)
2612
Charles-François Natali8619cd72011-10-03 19:43:15 +02002613 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002614 def _testRecvmsgTrunc(self):
2615 self.sendToServer(MSG)
2616
2617 def testRecvmsgShortAncillaryBuf(self):
2618 # Test ancillary data buffer too small to hold any ancillary data.
2619 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2620 len(MSG), 1)
2621 self.assertEqual(msg, MSG)
2622 self.checkRecvmsgAddress(addr, self.cli_addr)
2623 self.assertEqual(ancdata, [])
2624 self.checkFlags(flags, eor=True)
2625
2626 def _testRecvmsgShortAncillaryBuf(self):
2627 self.sendToServer(MSG)
2628
2629 def testRecvmsgLongAncillaryBuf(self):
2630 # Test large ancillary data buffer.
2631 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2632 len(MSG), 10240)
2633 self.assertEqual(msg, MSG)
2634 self.checkRecvmsgAddress(addr, self.cli_addr)
2635 self.assertEqual(ancdata, [])
2636 self.checkFlags(flags, eor=True)
2637
2638 def _testRecvmsgLongAncillaryBuf(self):
2639 self.sendToServer(MSG)
2640
2641 def testRecvmsgAfterClose(self):
2642 # Check that recvmsg[_into]() fails on a closed socket.
2643 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002644 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002645
2646 def _testRecvmsgAfterClose(self):
2647 pass
2648
2649 def testRecvmsgTimeout(self):
2650 # Check that timeout works.
2651 try:
2652 self.serv_sock.settimeout(0.03)
2653 self.assertRaises(socket.timeout,
2654 self.doRecvmsg, self.serv_sock, len(MSG))
2655 finally:
2656 self.misc_event.set()
2657
2658 def _testRecvmsgTimeout(self):
2659 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2660
2661 @requireAttrs(socket, "MSG_PEEK")
2662 def testRecvmsgPeek(self):
2663 # Check that MSG_PEEK in flags enables examination of pending
2664 # data without consuming it.
2665
2666 # Receive part of data with MSG_PEEK.
2667 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2668 len(MSG) - 3, 0,
2669 socket.MSG_PEEK)
2670 self.assertEqual(msg, MSG[:-3])
2671 self.checkRecvmsgAddress(addr, self.cli_addr)
2672 self.assertEqual(ancdata, [])
2673 # Ignoring MSG_TRUNC here (so this test is the same for stream
2674 # and datagram sockets). Some wording in POSIX seems to
2675 # suggest that it needn't be set when peeking, but that may
2676 # just be a slip.
2677 self.checkFlags(flags, eor=False,
2678 ignore=getattr(socket, "MSG_TRUNC", 0))
2679
2680 # Receive all data with MSG_PEEK.
2681 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2682 len(MSG), 0,
2683 socket.MSG_PEEK)
2684 self.assertEqual(msg, MSG)
2685 self.checkRecvmsgAddress(addr, self.cli_addr)
2686 self.assertEqual(ancdata, [])
2687 self.checkFlags(flags, eor=True)
2688
2689 # Check that the same data can still be received normally.
2690 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2691 self.assertEqual(msg, MSG)
2692 self.checkRecvmsgAddress(addr, self.cli_addr)
2693 self.assertEqual(ancdata, [])
2694 self.checkFlags(flags, eor=True)
2695
2696 @testRecvmsgPeek.client_skip
2697 def _testRecvmsgPeek(self):
2698 self.sendToServer(MSG)
2699
2700 @requireAttrs(socket.socket, "sendmsg")
2701 def testRecvmsgFromSendmsg(self):
2702 # Test receiving with recvmsg[_into]() when message is sent
2703 # using sendmsg().
2704 self.serv_sock.settimeout(self.fail_timeout)
2705 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2706 self.assertEqual(msg, MSG)
2707 self.checkRecvmsgAddress(addr, self.cli_addr)
2708 self.assertEqual(ancdata, [])
2709 self.checkFlags(flags, eor=True)
2710
2711 @testRecvmsgFromSendmsg.client_skip
2712 def _testRecvmsgFromSendmsg(self):
2713 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2714
2715
2716class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2717 # Tests which require a stream socket and can use either recvmsg()
2718 # or recvmsg_into().
2719
2720 def testRecvmsgEOF(self):
2721 # Receive end-of-stream indicator (b"", peer socket closed).
2722 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2723 self.assertEqual(msg, b"")
2724 self.checkRecvmsgAddress(addr, self.cli_addr)
2725 self.assertEqual(ancdata, [])
2726 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2727
2728 def _testRecvmsgEOF(self):
2729 self.cli_sock.close()
2730
2731 def testRecvmsgOverflow(self):
2732 # Receive a message in more than one chunk.
2733 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2734 len(MSG) - 3)
2735 self.checkRecvmsgAddress(addr, self.cli_addr)
2736 self.assertEqual(ancdata, [])
2737 self.checkFlags(flags, eor=False)
2738
2739 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2740 self.checkRecvmsgAddress(addr, self.cli_addr)
2741 self.assertEqual(ancdata, [])
2742 self.checkFlags(flags, eor=True)
2743
2744 msg = seg1 + seg2
2745 self.assertEqual(msg, MSG)
2746
2747 def _testRecvmsgOverflow(self):
2748 self.sendToServer(MSG)
2749
2750
2751class RecvmsgTests(RecvmsgGenericTests):
2752 # Tests for recvmsg() which can use any socket type.
2753
2754 def testRecvmsgBadArgs(self):
2755 # Check that recvmsg() rejects invalid arguments.
2756 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2757 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2758 -1, 0, 0)
2759 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2760 len(MSG), -1, 0)
2761 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2762 [bytearray(10)], 0, 0)
2763 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2764 object(), 0, 0)
2765 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2766 len(MSG), object(), 0)
2767 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2768 len(MSG), 0, object())
2769
2770 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2771 self.assertEqual(msg, MSG)
2772 self.checkRecvmsgAddress(addr, self.cli_addr)
2773 self.assertEqual(ancdata, [])
2774 self.checkFlags(flags, eor=True)
2775
2776 def _testRecvmsgBadArgs(self):
2777 self.sendToServer(MSG)
2778
2779
2780class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2781 # Tests for recvmsg_into() which can use any socket type.
2782
2783 def testRecvmsgIntoBadArgs(self):
2784 # Check that recvmsg_into() rejects invalid arguments.
2785 buf = bytearray(len(MSG))
2786 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2787 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2788 len(MSG), 0, 0)
2789 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2790 buf, 0, 0)
2791 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2792 [object()], 0, 0)
2793 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2794 [b"I'm not writable"], 0, 0)
2795 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2796 [buf, object()], 0, 0)
2797 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2798 [buf], -1, 0)
2799 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2800 [buf], object(), 0)
2801 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2802 [buf], 0, object())
2803
2804 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2805 self.assertEqual(nbytes, len(MSG))
2806 self.assertEqual(buf, bytearray(MSG))
2807 self.checkRecvmsgAddress(addr, self.cli_addr)
2808 self.assertEqual(ancdata, [])
2809 self.checkFlags(flags, eor=True)
2810
2811 def _testRecvmsgIntoBadArgs(self):
2812 self.sendToServer(MSG)
2813
2814 def testRecvmsgIntoGenerator(self):
2815 # Receive into buffer obtained from a generator (not a sequence).
2816 buf = bytearray(len(MSG))
2817 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2818 (o for o in [buf]))
2819 self.assertEqual(nbytes, len(MSG))
2820 self.assertEqual(buf, bytearray(MSG))
2821 self.checkRecvmsgAddress(addr, self.cli_addr)
2822 self.assertEqual(ancdata, [])
2823 self.checkFlags(flags, eor=True)
2824
2825 def _testRecvmsgIntoGenerator(self):
2826 self.sendToServer(MSG)
2827
2828 def testRecvmsgIntoArray(self):
2829 # Receive into an array rather than the usual bytearray.
2830 buf = array.array("B", [0] * len(MSG))
2831 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2832 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002833 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002834 self.checkRecvmsgAddress(addr, self.cli_addr)
2835 self.assertEqual(ancdata, [])
2836 self.checkFlags(flags, eor=True)
2837
2838 def _testRecvmsgIntoArray(self):
2839 self.sendToServer(MSG)
2840
2841 def testRecvmsgIntoScatter(self):
2842 # Receive into multiple buffers (scatter write).
2843 b1 = bytearray(b"----")
2844 b2 = bytearray(b"0123456789")
2845 b3 = bytearray(b"--------------")
2846 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2847 [b1, memoryview(b2)[2:9], b3])
2848 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2849 self.assertEqual(b1, bytearray(b"Mary"))
2850 self.assertEqual(b2, bytearray(b"01 had a 9"))
2851 self.assertEqual(b3, bytearray(b"little lamb---"))
2852 self.checkRecvmsgAddress(addr, self.cli_addr)
2853 self.assertEqual(ancdata, [])
2854 self.checkFlags(flags, eor=True)
2855
2856 def _testRecvmsgIntoScatter(self):
2857 self.sendToServer(b"Mary had a little lamb")
2858
2859
2860class CmsgMacroTests(unittest.TestCase):
2861 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2862 # assumptions used by sendmsg() and recvmsg[_into](), which share
2863 # code with these functions.
2864
2865 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002866 try:
2867 import _testcapi
2868 except ImportError:
2869 socklen_t_limit = 0x7fffffff
2870 else:
2871 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002872
2873 @requireAttrs(socket, "CMSG_LEN")
2874 def testCMSG_LEN(self):
2875 # Test CMSG_LEN() with various valid and invalid values,
2876 # checking the assumptions used by recvmsg() and sendmsg().
2877 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2878 values = list(range(257)) + list(range(toobig - 257, toobig))
2879
2880 # struct cmsghdr has at least three members, two of which are ints
2881 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2882 for n in values:
2883 ret = socket.CMSG_LEN(n)
2884 # This is how recvmsg() calculates the data size
2885 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2886 self.assertLessEqual(ret, self.socklen_t_limit)
2887
2888 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2889 # sendmsg() shares code with these functions, and requires
2890 # that it reject values over the limit.
2891 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2892 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2893
2894 @requireAttrs(socket, "CMSG_SPACE")
2895 def testCMSG_SPACE(self):
2896 # Test CMSG_SPACE() with various valid and invalid values,
2897 # checking the assumptions used by sendmsg().
2898 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2899 values = list(range(257)) + list(range(toobig - 257, toobig))
2900
2901 last = socket.CMSG_SPACE(0)
2902 # struct cmsghdr has at least three members, two of which are ints
2903 self.assertGreater(last, array.array("i").itemsize * 2)
2904 for n in values:
2905 ret = socket.CMSG_SPACE(n)
2906 self.assertGreaterEqual(ret, last)
2907 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2908 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2909 self.assertLessEqual(ret, self.socklen_t_limit)
2910 last = ret
2911
2912 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2913 # sendmsg() shares code with these functions, and requires
2914 # that it reject values over the limit.
2915 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2916 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2917
2918
2919class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2920 # Tests for file descriptor passing on Unix-domain sockets.
2921
2922 # Invalid file descriptor value that's unlikely to evaluate to a
2923 # real FD even if one of its bytes is replaced with a different
2924 # value (which shouldn't actually happen).
2925 badfd = -0x5555
2926
2927 def newFDs(self, n):
2928 # Return a list of n file descriptors for newly-created files
2929 # containing their list indices as ASCII numbers.
2930 fds = []
2931 for i in range(n):
2932 fd, path = tempfile.mkstemp()
2933 self.addCleanup(os.unlink, path)
2934 self.addCleanup(os.close, fd)
2935 os.write(fd, str(i).encode())
2936 fds.append(fd)
2937 return fds
2938
2939 def checkFDs(self, fds):
2940 # Check that the file descriptors in the given list contain
2941 # their correct list indices as ASCII numbers.
2942 for n, fd in enumerate(fds):
2943 os.lseek(fd, 0, os.SEEK_SET)
2944 self.assertEqual(os.read(fd, 1024), str(n).encode())
2945
2946 def registerRecvmsgResult(self, result):
2947 self.addCleanup(self.closeRecvmsgFDs, result)
2948
2949 def closeRecvmsgFDs(self, recvmsg_result):
2950 # Close all file descriptors specified in the ancillary data
2951 # of the given return value from recvmsg() or recvmsg_into().
2952 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2953 if (cmsg_level == socket.SOL_SOCKET and
2954 cmsg_type == socket.SCM_RIGHTS):
2955 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002956 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002957 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2958 for fd in fds:
2959 os.close(fd)
2960
2961 def createAndSendFDs(self, n):
2962 # Send n new file descriptors created by newFDs() to the
2963 # server, with the constant MSG as the non-ancillary data.
2964 self.assertEqual(
2965 self.sendmsgToServer([MSG],
2966 [(socket.SOL_SOCKET,
2967 socket.SCM_RIGHTS,
2968 array.array("i", self.newFDs(n)))]),
2969 len(MSG))
2970
2971 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2972 # Check that constant MSG was received with numfds file
2973 # descriptors in a maximum of maxcmsgs control messages (which
2974 # must contain only complete integers). By default, check
2975 # that MSG_CTRUNC is unset, but ignore any flags in
2976 # ignoreflags.
2977 msg, ancdata, flags, addr = result
2978 self.assertEqual(msg, MSG)
2979 self.checkRecvmsgAddress(addr, self.cli_addr)
2980 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2981 ignore=ignoreflags)
2982
2983 self.assertIsInstance(ancdata, list)
2984 self.assertLessEqual(len(ancdata), maxcmsgs)
2985 fds = array.array("i")
2986 for item in ancdata:
2987 self.assertIsInstance(item, tuple)
2988 cmsg_level, cmsg_type, cmsg_data = item
2989 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2990 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2991 self.assertIsInstance(cmsg_data, bytes)
2992 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002993 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002994
2995 self.assertEqual(len(fds), numfds)
2996 self.checkFDs(fds)
2997
2998 def testFDPassSimple(self):
2999 # Pass a single FD (array read from bytes object).
3000 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
3001 len(MSG), 10240))
3002
3003 def _testFDPassSimple(self):
3004 self.assertEqual(
3005 self.sendmsgToServer(
3006 [MSG],
3007 [(socket.SOL_SOCKET,
3008 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003009 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003010 len(MSG))
3011
3012 def testMultipleFDPass(self):
3013 # Pass multiple FDs in a single array.
3014 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
3015 len(MSG), 10240))
3016
3017 def _testMultipleFDPass(self):
3018 self.createAndSendFDs(4)
3019
3020 @requireAttrs(socket, "CMSG_SPACE")
3021 def testFDPassCMSG_SPACE(self):
3022 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3023 self.checkRecvmsgFDs(
3024 4, self.doRecvmsg(self.serv_sock, len(MSG),
3025 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3026
3027 @testFDPassCMSG_SPACE.client_skip
3028 def _testFDPassCMSG_SPACE(self):
3029 self.createAndSendFDs(4)
3030
3031 def testFDPassCMSG_LEN(self):
3032 # Test using CMSG_LEN() to calculate ancillary buffer size.
3033 self.checkRecvmsgFDs(1,
3034 self.doRecvmsg(self.serv_sock, len(MSG),
3035 socket.CMSG_LEN(4 * SIZEOF_INT)),
3036 # RFC 3542 says implementations may set
3037 # MSG_CTRUNC if there isn't enough space
3038 # for trailing padding.
3039 ignoreflags=socket.MSG_CTRUNC)
3040
3041 def _testFDPassCMSG_LEN(self):
3042 self.createAndSendFDs(1)
3043
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003044 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003045 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003046 @requireAttrs(socket, "CMSG_SPACE")
3047 def testFDPassSeparate(self):
3048 # Pass two FDs in two separate arrays. Arrays may be combined
3049 # into a single control message by the OS.
3050 self.checkRecvmsgFDs(2,
3051 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3052 maxcmsgs=2)
3053
3054 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003055 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003056 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003057 def _testFDPassSeparate(self):
3058 fd0, fd1 = self.newFDs(2)
3059 self.assertEqual(
3060 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3061 socket.SCM_RIGHTS,
3062 array.array("i", [fd0])),
3063 (socket.SOL_SOCKET,
3064 socket.SCM_RIGHTS,
3065 array.array("i", [fd1]))]),
3066 len(MSG))
3067
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003068 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003069 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003070 @requireAttrs(socket, "CMSG_SPACE")
3071 def testFDPassSeparateMinSpace(self):
3072 # Pass two FDs in two separate arrays, receiving them into the
3073 # minimum space for two arrays.
3074 self.checkRecvmsgFDs(2,
3075 self.doRecvmsg(self.serv_sock, len(MSG),
3076 socket.CMSG_SPACE(SIZEOF_INT) +
3077 socket.CMSG_LEN(SIZEOF_INT)),
3078 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3079
3080 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003081 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003082 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003083 def _testFDPassSeparateMinSpace(self):
3084 fd0, fd1 = self.newFDs(2)
3085 self.assertEqual(
3086 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3087 socket.SCM_RIGHTS,
3088 array.array("i", [fd0])),
3089 (socket.SOL_SOCKET,
3090 socket.SCM_RIGHTS,
3091 array.array("i", [fd1]))]),
3092 len(MSG))
3093
3094 def sendAncillaryIfPossible(self, msg, ancdata):
3095 # Try to send msg and ancdata to server, but if the system
3096 # call fails, just send msg with no ancillary data.
3097 try:
3098 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003099 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003100 # Check that it was the system call that failed
3101 self.assertIsInstance(e.errno, int)
3102 nbytes = self.sendmsgToServer([msg])
3103 self.assertEqual(nbytes, len(msg))
3104
Brett Cannon3bbad122015-12-28 17:21:44 -08003105 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003106 def testFDPassEmpty(self):
3107 # Try to pass an empty FD array. Can receive either no array
3108 # or an empty array.
3109 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3110 len(MSG), 10240),
3111 ignoreflags=socket.MSG_CTRUNC)
3112
3113 def _testFDPassEmpty(self):
3114 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3115 socket.SCM_RIGHTS,
3116 b"")])
3117
3118 def testFDPassPartialInt(self):
3119 # Try to pass a truncated FD array.
3120 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3121 len(MSG), 10240)
3122 self.assertEqual(msg, MSG)
3123 self.checkRecvmsgAddress(addr, self.cli_addr)
3124 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3125 self.assertLessEqual(len(ancdata), 1)
3126 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3127 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3128 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3129 self.assertLess(len(cmsg_data), SIZEOF_INT)
3130
3131 def _testFDPassPartialInt(self):
3132 self.sendAncillaryIfPossible(
3133 MSG,
3134 [(socket.SOL_SOCKET,
3135 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003136 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003137
3138 @requireAttrs(socket, "CMSG_SPACE")
3139 def testFDPassPartialIntInMiddle(self):
3140 # Try to pass two FD arrays, the first of which is truncated.
3141 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3142 len(MSG), 10240)
3143 self.assertEqual(msg, MSG)
3144 self.checkRecvmsgAddress(addr, self.cli_addr)
3145 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3146 self.assertLessEqual(len(ancdata), 2)
3147 fds = array.array("i")
3148 # Arrays may have been combined in a single control message
3149 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3150 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3151 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003152 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003153 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3154 self.assertLessEqual(len(fds), 2)
3155 self.checkFDs(fds)
3156
3157 @testFDPassPartialIntInMiddle.client_skip
3158 def _testFDPassPartialIntInMiddle(self):
3159 fd0, fd1 = self.newFDs(2)
3160 self.sendAncillaryIfPossible(
3161 MSG,
3162 [(socket.SOL_SOCKET,
3163 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003164 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003165 (socket.SOL_SOCKET,
3166 socket.SCM_RIGHTS,
3167 array.array("i", [fd1]))])
3168
3169 def checkTruncatedHeader(self, result, ignoreflags=0):
3170 # Check that no ancillary data items are returned when data is
3171 # truncated inside the cmsghdr structure.
3172 msg, ancdata, flags, addr = result
3173 self.assertEqual(msg, MSG)
3174 self.checkRecvmsgAddress(addr, self.cli_addr)
3175 self.assertEqual(ancdata, [])
3176 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3177 ignore=ignoreflags)
3178
3179 def testCmsgTruncNoBufSize(self):
3180 # Check that no ancillary data is received when no buffer size
3181 # is specified.
3182 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3183 # BSD seems to set MSG_CTRUNC only
3184 # if an item has been partially
3185 # received.
3186 ignoreflags=socket.MSG_CTRUNC)
3187
3188 def _testCmsgTruncNoBufSize(self):
3189 self.createAndSendFDs(1)
3190
3191 def testCmsgTrunc0(self):
3192 # Check that no ancillary data is received when buffer size is 0.
3193 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3194 ignoreflags=socket.MSG_CTRUNC)
3195
3196 def _testCmsgTrunc0(self):
3197 self.createAndSendFDs(1)
3198
3199 # Check that no ancillary data is returned for various non-zero
3200 # (but still too small) buffer sizes.
3201
3202 def testCmsgTrunc1(self):
3203 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3204
3205 def _testCmsgTrunc1(self):
3206 self.createAndSendFDs(1)
3207
3208 def testCmsgTrunc2Int(self):
3209 # The cmsghdr structure has at least three members, two of
3210 # which are ints, so we still shouldn't see any ancillary
3211 # data.
3212 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3213 SIZEOF_INT * 2))
3214
3215 def _testCmsgTrunc2Int(self):
3216 self.createAndSendFDs(1)
3217
3218 def testCmsgTruncLen0Minus1(self):
3219 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3220 socket.CMSG_LEN(0) - 1))
3221
3222 def _testCmsgTruncLen0Minus1(self):
3223 self.createAndSendFDs(1)
3224
3225 # The following tests try to truncate the control message in the
3226 # middle of the FD array.
3227
3228 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3229 # Check that file descriptor data is truncated to between
3230 # mindata and maxdata bytes when received with buffer size
3231 # ancbuf, and that any complete file descriptor numbers are
3232 # valid.
3233 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3234 len(MSG), ancbuf)
3235 self.assertEqual(msg, MSG)
3236 self.checkRecvmsgAddress(addr, self.cli_addr)
3237 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3238
3239 if mindata == 0 and ancdata == []:
3240 return
3241 self.assertEqual(len(ancdata), 1)
3242 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3243 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3244 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3245 self.assertGreaterEqual(len(cmsg_data), mindata)
3246 self.assertLessEqual(len(cmsg_data), maxdata)
3247 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003248 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003249 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3250 self.checkFDs(fds)
3251
3252 def testCmsgTruncLen0(self):
3253 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3254
3255 def _testCmsgTruncLen0(self):
3256 self.createAndSendFDs(1)
3257
3258 def testCmsgTruncLen0Plus1(self):
3259 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3260
3261 def _testCmsgTruncLen0Plus1(self):
3262 self.createAndSendFDs(2)
3263
3264 def testCmsgTruncLen1(self):
3265 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3266 maxdata=SIZEOF_INT)
3267
3268 def _testCmsgTruncLen1(self):
3269 self.createAndSendFDs(2)
3270
3271 def testCmsgTruncLen2Minus1(self):
3272 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3273 maxdata=(2 * SIZEOF_INT) - 1)
3274
3275 def _testCmsgTruncLen2Minus1(self):
3276 self.createAndSendFDs(2)
3277
3278
3279class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3280 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3281 # features of the RFC 3542 Advanced Sockets API for IPv6.
3282 # Currently we can only handle certain data items (e.g. traffic
3283 # class, hop limit, MTU discovery and fragmentation settings)
3284 # without resorting to unportable means such as the struct module,
3285 # but the tests here are aimed at testing the ancillary data
3286 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3287 # itself.
3288
3289 # Test value to use when setting hop limit of packet
3290 hop_limit = 2
3291
3292 # Test value to use when setting traffic class of packet.
3293 # -1 means "use kernel default".
3294 traffic_class = -1
3295
3296 def ancillaryMapping(self, ancdata):
3297 # Given ancillary data list ancdata, return a mapping from
3298 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3299 # Check that no (level, type) pair appears more than once.
3300 d = {}
3301 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3302 self.assertNotIn((cmsg_level, cmsg_type), d)
3303 d[(cmsg_level, cmsg_type)] = cmsg_data
3304 return d
3305
3306 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3307 # Receive hop limit into ancbufsize bytes of ancillary data
3308 # space. Check that data is MSG, ancillary data is not
3309 # truncated (but ignore any flags in ignoreflags), and hop
3310 # limit is between 0 and maxhop inclusive.
3311 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3312 socket.IPV6_RECVHOPLIMIT, 1)
3313 self.misc_event.set()
3314 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3315 len(MSG), ancbufsize)
3316
3317 self.assertEqual(msg, MSG)
3318 self.checkRecvmsgAddress(addr, self.cli_addr)
3319 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3320 ignore=ignoreflags)
3321
3322 self.assertEqual(len(ancdata), 1)
3323 self.assertIsInstance(ancdata[0], tuple)
3324 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3325 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3326 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3327 self.assertIsInstance(cmsg_data, bytes)
3328 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3329 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003330 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003331 self.assertGreaterEqual(a[0], 0)
3332 self.assertLessEqual(a[0], maxhop)
3333
3334 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3335 def testRecvHopLimit(self):
3336 # Test receiving the packet hop limit as ancillary data.
3337 self.checkHopLimit(ancbufsize=10240)
3338
3339 @testRecvHopLimit.client_skip
3340 def _testRecvHopLimit(self):
3341 # Need to wait until server has asked to receive ancillary
3342 # data, as implementations are not required to buffer it
3343 # otherwise.
3344 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3345 self.sendToServer(MSG)
3346
3347 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3348 def testRecvHopLimitCMSG_SPACE(self):
3349 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3350 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3351
3352 @testRecvHopLimitCMSG_SPACE.client_skip
3353 def _testRecvHopLimitCMSG_SPACE(self):
3354 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3355 self.sendToServer(MSG)
3356
3357 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3358 # 3542 says portable applications must provide space for trailing
3359 # padding. Implementations may set MSG_CTRUNC if there isn't
3360 # enough space for the padding.
3361
3362 @requireAttrs(socket.socket, "sendmsg")
3363 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3364 def testSetHopLimit(self):
3365 # Test setting hop limit on outgoing packet and receiving it
3366 # at the other end.
3367 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3368
3369 @testSetHopLimit.client_skip
3370 def _testSetHopLimit(self):
3371 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3372 self.assertEqual(
3373 self.sendmsgToServer([MSG],
3374 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3375 array.array("i", [self.hop_limit]))]),
3376 len(MSG))
3377
3378 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3379 ignoreflags=0):
3380 # Receive traffic class and hop limit into ancbufsize bytes of
3381 # ancillary data space. Check that data is MSG, ancillary
3382 # data is not truncated (but ignore any flags in ignoreflags),
3383 # and traffic class and hop limit are in range (hop limit no
3384 # more than maxhop).
3385 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3386 socket.IPV6_RECVHOPLIMIT, 1)
3387 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3388 socket.IPV6_RECVTCLASS, 1)
3389 self.misc_event.set()
3390 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3391 len(MSG), ancbufsize)
3392
3393 self.assertEqual(msg, MSG)
3394 self.checkRecvmsgAddress(addr, self.cli_addr)
3395 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3396 ignore=ignoreflags)
3397 self.assertEqual(len(ancdata), 2)
3398 ancmap = self.ancillaryMapping(ancdata)
3399
3400 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3401 self.assertEqual(len(tcdata), SIZEOF_INT)
3402 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003403 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003404 self.assertGreaterEqual(a[0], 0)
3405 self.assertLessEqual(a[0], 255)
3406
3407 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3408 self.assertEqual(len(hldata), SIZEOF_INT)
3409 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003410 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003411 self.assertGreaterEqual(a[0], 0)
3412 self.assertLessEqual(a[0], maxhop)
3413
3414 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3415 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3416 def testRecvTrafficClassAndHopLimit(self):
3417 # Test receiving traffic class and hop limit as ancillary data.
3418 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3419
3420 @testRecvTrafficClassAndHopLimit.client_skip
3421 def _testRecvTrafficClassAndHopLimit(self):
3422 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3423 self.sendToServer(MSG)
3424
3425 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3426 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3427 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3428 # Test receiving traffic class and hop limit, using
3429 # CMSG_SPACE() to calculate buffer size.
3430 self.checkTrafficClassAndHopLimit(
3431 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3432
3433 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3434 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3435 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3436 self.sendToServer(MSG)
3437
3438 @requireAttrs(socket.socket, "sendmsg")
3439 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3440 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3441 def testSetTrafficClassAndHopLimit(self):
3442 # Test setting traffic class and hop limit on outgoing packet,
3443 # and receiving them at the other end.
3444 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3445 maxhop=self.hop_limit)
3446
3447 @testSetTrafficClassAndHopLimit.client_skip
3448 def _testSetTrafficClassAndHopLimit(self):
3449 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3450 self.assertEqual(
3451 self.sendmsgToServer([MSG],
3452 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3453 array.array("i", [self.traffic_class])),
3454 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3455 array.array("i", [self.hop_limit]))]),
3456 len(MSG))
3457
3458 @requireAttrs(socket.socket, "sendmsg")
3459 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3460 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3461 def testOddCmsgSize(self):
3462 # Try to send ancillary data with first item one byte too
3463 # long. Fall back to sending with correct size if this fails,
3464 # and check that second item was handled correctly.
3465 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3466 maxhop=self.hop_limit)
3467
3468 @testOddCmsgSize.client_skip
3469 def _testOddCmsgSize(self):
3470 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3471 try:
3472 nbytes = self.sendmsgToServer(
3473 [MSG],
3474 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003475 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003476 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3477 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003478 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003479 self.assertIsInstance(e.errno, int)
3480 nbytes = self.sendmsgToServer(
3481 [MSG],
3482 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3483 array.array("i", [self.traffic_class])),
3484 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3485 array.array("i", [self.hop_limit]))])
3486 self.assertEqual(nbytes, len(MSG))
3487
3488 # Tests for proper handling of truncated ancillary data
3489
3490 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3491 # Receive hop limit into ancbufsize bytes of ancillary data
3492 # space, which should be too small to contain the ancillary
3493 # data header (if ancbufsize is None, pass no second argument
3494 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3495 # (unless included in ignoreflags), and no ancillary data is
3496 # returned.
3497 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3498 socket.IPV6_RECVHOPLIMIT, 1)
3499 self.misc_event.set()
3500 args = () if ancbufsize is None else (ancbufsize,)
3501 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3502 len(MSG), *args)
3503
3504 self.assertEqual(msg, MSG)
3505 self.checkRecvmsgAddress(addr, self.cli_addr)
3506 self.assertEqual(ancdata, [])
3507 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3508 ignore=ignoreflags)
3509
3510 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3511 def testCmsgTruncNoBufSize(self):
3512 # Check that no ancillary data is received when no ancillary
3513 # buffer size is provided.
3514 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3515 # BSD seems to set
3516 # MSG_CTRUNC only if an item
3517 # has been partially
3518 # received.
3519 ignoreflags=socket.MSG_CTRUNC)
3520
3521 @testCmsgTruncNoBufSize.client_skip
3522 def _testCmsgTruncNoBufSize(self):
3523 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3524 self.sendToServer(MSG)
3525
3526 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3527 def testSingleCmsgTrunc0(self):
3528 # Check that no ancillary data is received when ancillary
3529 # buffer size is zero.
3530 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3531 ignoreflags=socket.MSG_CTRUNC)
3532
3533 @testSingleCmsgTrunc0.client_skip
3534 def _testSingleCmsgTrunc0(self):
3535 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3536 self.sendToServer(MSG)
3537
3538 # Check that no ancillary data is returned for various non-zero
3539 # (but still too small) buffer sizes.
3540
3541 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3542 def testSingleCmsgTrunc1(self):
3543 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3544
3545 @testSingleCmsgTrunc1.client_skip
3546 def _testSingleCmsgTrunc1(self):
3547 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3548 self.sendToServer(MSG)
3549
3550 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3551 def testSingleCmsgTrunc2Int(self):
3552 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3553
3554 @testSingleCmsgTrunc2Int.client_skip
3555 def _testSingleCmsgTrunc2Int(self):
3556 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3557 self.sendToServer(MSG)
3558
3559 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3560 def testSingleCmsgTruncLen0Minus1(self):
3561 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3562
3563 @testSingleCmsgTruncLen0Minus1.client_skip
3564 def _testSingleCmsgTruncLen0Minus1(self):
3565 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3566 self.sendToServer(MSG)
3567
3568 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3569 def testSingleCmsgTruncInData(self):
3570 # Test truncation of a control message inside its associated
3571 # data. The message may be returned with its data truncated,
3572 # or not returned at all.
3573 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3574 socket.IPV6_RECVHOPLIMIT, 1)
3575 self.misc_event.set()
3576 msg, ancdata, flags, addr = self.doRecvmsg(
3577 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3578
3579 self.assertEqual(msg, MSG)
3580 self.checkRecvmsgAddress(addr, self.cli_addr)
3581 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3582
3583 self.assertLessEqual(len(ancdata), 1)
3584 if ancdata:
3585 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3586 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3587 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3588 self.assertLess(len(cmsg_data), SIZEOF_INT)
3589
3590 @testSingleCmsgTruncInData.client_skip
3591 def _testSingleCmsgTruncInData(self):
3592 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3593 self.sendToServer(MSG)
3594
3595 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3596 # Receive traffic class and hop limit into ancbufsize bytes of
3597 # ancillary data space, which should be large enough to
3598 # contain the first item, but too small to contain the header
3599 # of the second. Check that data is MSG, MSG_CTRUNC is set
3600 # (unless included in ignoreflags), and only one ancillary
3601 # data item is returned.
3602 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3603 socket.IPV6_RECVHOPLIMIT, 1)
3604 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3605 socket.IPV6_RECVTCLASS, 1)
3606 self.misc_event.set()
3607 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3608 len(MSG), ancbufsize)
3609
3610 self.assertEqual(msg, MSG)
3611 self.checkRecvmsgAddress(addr, self.cli_addr)
3612 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3613 ignore=ignoreflags)
3614
3615 self.assertEqual(len(ancdata), 1)
3616 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3617 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3618 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3619 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3620 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003621 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003622 self.assertGreaterEqual(a[0], 0)
3623 self.assertLessEqual(a[0], 255)
3624
3625 # Try the above test with various buffer sizes.
3626
3627 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3628 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3629 def testSecondCmsgTrunc0(self):
3630 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3631 ignoreflags=socket.MSG_CTRUNC)
3632
3633 @testSecondCmsgTrunc0.client_skip
3634 def _testSecondCmsgTrunc0(self):
3635 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3636 self.sendToServer(MSG)
3637
3638 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3639 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3640 def testSecondCmsgTrunc1(self):
3641 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3642
3643 @testSecondCmsgTrunc1.client_skip
3644 def _testSecondCmsgTrunc1(self):
3645 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3646 self.sendToServer(MSG)
3647
3648 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3649 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3650 def testSecondCmsgTrunc2Int(self):
3651 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3652 2 * SIZEOF_INT)
3653
3654 @testSecondCmsgTrunc2Int.client_skip
3655 def _testSecondCmsgTrunc2Int(self):
3656 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3657 self.sendToServer(MSG)
3658
3659 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3660 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3661 def testSecondCmsgTruncLen0Minus1(self):
3662 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3663 socket.CMSG_LEN(0) - 1)
3664
3665 @testSecondCmsgTruncLen0Minus1.client_skip
3666 def _testSecondCmsgTruncLen0Minus1(self):
3667 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3668 self.sendToServer(MSG)
3669
3670 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3671 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3672 def testSecomdCmsgTruncInData(self):
3673 # Test truncation of the second of two control messages inside
3674 # its associated data.
3675 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3676 socket.IPV6_RECVHOPLIMIT, 1)
3677 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3678 socket.IPV6_RECVTCLASS, 1)
3679 self.misc_event.set()
3680 msg, ancdata, flags, addr = self.doRecvmsg(
3681 self.serv_sock, len(MSG),
3682 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3683
3684 self.assertEqual(msg, MSG)
3685 self.checkRecvmsgAddress(addr, self.cli_addr)
3686 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3687
3688 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3689
3690 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3691 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3692 cmsg_types.remove(cmsg_type)
3693 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3694 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003695 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003696 self.assertGreaterEqual(a[0], 0)
3697 self.assertLessEqual(a[0], 255)
3698
3699 if ancdata:
3700 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3701 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3702 cmsg_types.remove(cmsg_type)
3703 self.assertLess(len(cmsg_data), SIZEOF_INT)
3704
3705 self.assertEqual(ancdata, [])
3706
3707 @testSecomdCmsgTruncInData.client_skip
3708 def _testSecomdCmsgTruncInData(self):
3709 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3710 self.sendToServer(MSG)
3711
3712
3713# Derive concrete test classes for different socket types.
3714
3715class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3716 SendrecvmsgConnectionlessBase,
3717 ThreadedSocketTestMixin, UDPTestBase):
3718 pass
3719
3720@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003721class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3722 pass
3723
3724@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003725class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3726 pass
3727
3728@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003729class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3730 pass
3731
3732
3733class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3734 SendrecvmsgConnectionlessBase,
3735 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003736
3737 def checkRecvmsgAddress(self, addr1, addr2):
3738 # Called to compare the received address with the address of
3739 # the peer, ignoring scope ID
3740 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003741
3742@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003743@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003744@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003745class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3746 pass
3747
3748@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003749@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003750@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003751class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3752 pass
3753
3754@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003755@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003756@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003757class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3758 pass
3759
3760@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003761@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003762@requireAttrs(socket, "IPPROTO_IPV6")
3763@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003764class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3765 SendrecvmsgUDP6TestBase):
3766 pass
3767
3768@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003769@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003770@requireAttrs(socket, "IPPROTO_IPV6")
3771@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003772class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3773 RFC3542AncillaryTest,
3774 SendrecvmsgUDP6TestBase):
3775 pass
3776
3777
3778class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3779 ConnectedStreamTestMixin, TCPTestBase):
3780 pass
3781
3782@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003783class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3784 pass
3785
3786@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003787class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3788 SendrecvmsgTCPTestBase):
3789 pass
3790
3791@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003792class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3793 SendrecvmsgTCPTestBase):
3794 pass
3795
3796
3797class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3798 SendrecvmsgConnectedBase,
3799 ConnectedStreamTestMixin, SCTPStreamBase):
3800 pass
3801
3802@requireAttrs(socket.socket, "sendmsg")
3803@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003804class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3805 pass
3806
3807@requireAttrs(socket.socket, "recvmsg")
3808@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003809class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3810 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003811
3812 def testRecvmsgEOF(self):
3813 try:
3814 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3815 except OSError as e:
3816 if e.errno != errno.ENOTCONN:
3817 raise
3818 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003819
3820@requireAttrs(socket.socket, "recvmsg_into")
3821@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003822class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3823 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003824
3825 def testRecvmsgEOF(self):
3826 try:
3827 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3828 except OSError as e:
3829 if e.errno != errno.ENOTCONN:
3830 raise
3831 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003832
3833
3834class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3835 ConnectedStreamTestMixin, UnixStreamBase):
3836 pass
3837
3838@requireAttrs(socket.socket, "sendmsg")
3839@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003840class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3841 pass
3842
3843@requireAttrs(socket.socket, "recvmsg")
3844@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003845class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3846 SendrecvmsgUnixStreamTestBase):
3847 pass
3848
3849@requireAttrs(socket.socket, "recvmsg_into")
3850@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003851class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3852 SendrecvmsgUnixStreamTestBase):
3853 pass
3854
3855@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3856@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003857class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3858 pass
3859
3860@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3861@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003862class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3863 SendrecvmsgUnixStreamTestBase):
3864 pass
3865
3866
3867# Test interrupting the interruptible send/receive methods with a
3868# signal when a timeout is set. These tests avoid having multiple
3869# threads alive during the test so that the OS cannot deliver the
3870# signal to the wrong one.
3871
3872class InterruptedTimeoutBase(unittest.TestCase):
3873 # Base class for interrupted send/receive tests. Installs an
3874 # empty handler for SIGALRM and removes it on teardown, along with
3875 # any scheduled alarms.
3876
3877 def setUp(self):
3878 super().setUp()
3879 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003880 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003881 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003882
3883 # Timeout for socket operations
3884 timeout = 4.0
3885
3886 # Provide setAlarm() method to schedule delivery of SIGALRM after
3887 # given number of seconds, or cancel it if zero, and an
3888 # appropriate time value to use. Use setitimer() if available.
3889 if hasattr(signal, "setitimer"):
3890 alarm_time = 0.05
3891
3892 def setAlarm(self, seconds):
3893 signal.setitimer(signal.ITIMER_REAL, seconds)
3894 else:
3895 # Old systems may deliver the alarm up to one second early
3896 alarm_time = 2
3897
3898 def setAlarm(self, seconds):
3899 signal.alarm(seconds)
3900
3901
3902# Require siginterrupt() in order to ensure that system calls are
3903# interrupted by default.
3904@requireAttrs(signal, "siginterrupt")
3905@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3906 "Don't have signal.alarm or signal.setitimer")
3907class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3908 # Test interrupting the recv*() methods with signals when a
3909 # timeout is set.
3910
3911 def setUp(self):
3912 super().setUp()
3913 self.serv.settimeout(self.timeout)
3914
3915 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003916 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003917 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07003918 try:
3919 self.setAlarm(self.alarm_time)
3920 with self.assertRaises(ZeroDivisionError) as cm:
3921 func(*args, **kwargs)
3922 finally:
3923 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003924
3925 def testInterruptedRecvTimeout(self):
3926 self.checkInterruptedRecv(self.serv.recv, 1024)
3927
3928 def testInterruptedRecvIntoTimeout(self):
3929 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3930
3931 def testInterruptedRecvfromTimeout(self):
3932 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3933
3934 def testInterruptedRecvfromIntoTimeout(self):
3935 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3936
3937 @requireAttrs(socket.socket, "recvmsg")
3938 def testInterruptedRecvmsgTimeout(self):
3939 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3940
3941 @requireAttrs(socket.socket, "recvmsg_into")
3942 def testInterruptedRecvmsgIntoTimeout(self):
3943 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3944
3945
3946# Require siginterrupt() in order to ensure that system calls are
3947# interrupted by default.
3948@requireAttrs(signal, "siginterrupt")
3949@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3950 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003951class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3952 ThreadSafeCleanupTestCase,
3953 SocketListeningTestMixin, TCPTestBase):
3954 # Test interrupting the interruptible send*() methods with signals
3955 # when a timeout is set.
3956
3957 def setUp(self):
3958 super().setUp()
3959 self.serv_conn = self.newSocket()
3960 self.addCleanup(self.serv_conn.close)
3961 # Use a thread to complete the connection, but wait for it to
3962 # terminate before running the test, so that there is only one
3963 # thread to accept the signal.
3964 cli_thread = threading.Thread(target=self.doConnect)
3965 cli_thread.start()
3966 self.cli_conn, addr = self.serv.accept()
3967 self.addCleanup(self.cli_conn.close)
3968 cli_thread.join()
3969 self.serv_conn.settimeout(self.timeout)
3970
3971 def doConnect(self):
3972 self.serv_conn.connect(self.serv_addr)
3973
3974 def checkInterruptedSend(self, func, *args, **kwargs):
3975 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003976 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07003978 try:
3979 with self.assertRaises(ZeroDivisionError) as cm:
3980 while True:
3981 self.setAlarm(self.alarm_time)
3982 func(*args, **kwargs)
3983 finally:
3984 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003985
Ned Deilyc5640382014-02-03 13:58:31 -08003986 # Issue #12958: The following tests have problems on OS X prior to 10.7
3987 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003988 def testInterruptedSendTimeout(self):
3989 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3990
Ned Deilyc5640382014-02-03 13:58:31 -08003991 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003992 def testInterruptedSendtoTimeout(self):
3993 # Passing an actual address here as Python's wrapper for
3994 # sendto() doesn't allow passing a zero-length one; POSIX
3995 # requires that the address is ignored since the socket is
3996 # connection-mode, however.
3997 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3998 self.serv_addr)
3999
Ned Deilyc5640382014-02-03 13:58:31 -08004000 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004001 @requireAttrs(socket.socket, "sendmsg")
4002 def testInterruptedSendmsgTimeout(self):
4003 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
4004
4005
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004006class TCPCloserTest(ThreadedTCPSocketTest):
4007
4008 def testClose(self):
4009 conn, addr = self.serv.accept()
4010 conn.close()
4011
4012 sd = self.cli
4013 read, write, err = select.select([sd], [], [], 1.0)
4014 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004015 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004016
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004017 # Calling close() many times should be safe.
4018 conn.close()
4019 conn.close()
4020
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004021 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004022 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004023 time.sleep(1.0)
4024
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004025
Dave Cole331708b2004-08-09 04:51:41 +00004026class BasicSocketPairTest(SocketPairTest):
4027
4028 def __init__(self, methodName='runTest'):
4029 SocketPairTest.__init__(self, methodName=methodName)
4030
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004031 def _check_defaults(self, sock):
4032 self.assertIsInstance(sock, socket.socket)
4033 if hasattr(socket, 'AF_UNIX'):
4034 self.assertEqual(sock.family, socket.AF_UNIX)
4035 else:
4036 self.assertEqual(sock.family, socket.AF_INET)
4037 self.assertEqual(sock.type, socket.SOCK_STREAM)
4038 self.assertEqual(sock.proto, 0)
4039
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004040 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004041 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004042
4043 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004044 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004045
Dave Cole331708b2004-08-09 04:51:41 +00004046 def testRecv(self):
4047 msg = self.serv.recv(1024)
4048 self.assertEqual(msg, MSG)
4049
4050 def _testRecv(self):
4051 self.cli.send(MSG)
4052
4053 def testSend(self):
4054 self.serv.send(MSG)
4055
4056 def _testSend(self):
4057 msg = self.cli.recv(1024)
4058 self.assertEqual(msg, MSG)
4059
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004060
Guido van Rossum24e4af82002-06-12 19:18:08 +00004061class NonBlockingTCPTests(ThreadedTCPSocketTest):
4062
4063 def __init__(self, methodName='runTest'):
4064 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4065
4066 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004067 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004068 self.serv.setblocking(True)
4069 self.assertIsNone(self.serv.gettimeout())
4070 self.serv.setblocking(False)
4071 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004072 start = time.time()
4073 try:
4074 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004075 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004076 pass
4077 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004078 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004079
4080 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004081 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004082
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004083 @support.cpython_only
4084 def testSetBlocking_overflow(self):
4085 # Issue 15989
4086 import _testcapi
4087 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4088 self.skipTest('needs UINT_MAX < ULONG_MAX')
4089 self.serv.setblocking(False)
4090 self.assertEqual(self.serv.gettimeout(), 0.0)
4091 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4092 self.assertIsNone(self.serv.gettimeout())
4093
4094 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4095
Serhiy Storchaka43767632013-11-03 21:31:38 +02004096 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4097 'test needs socket.SOCK_NONBLOCK')
4098 @support.requires_linux_version(2, 6, 28)
4099 def testInitNonBlocking(self):
4100 # reinit server socket
4101 self.serv.close()
4102 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4103 socket.SOCK_NONBLOCK)
4104 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004105 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004106 # actual testing
4107 start = time.time()
4108 try:
4109 self.serv.accept()
4110 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004111 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004112 end = time.time()
4113 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4114
4115 def _testInitNonBlocking(self):
4116 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004117
Antoine Pitrou600232b2011-01-05 21:03:42 +00004118 def testInheritFlags(self):
4119 # Issue #7995: when calling accept() on a listening socket with a
4120 # timeout, the resulting socket should not be non-blocking.
4121 self.serv.settimeout(10)
4122 try:
4123 conn, addr = self.serv.accept()
4124 message = conn.recv(len(MSG))
4125 finally:
4126 conn.close()
4127 self.serv.settimeout(None)
4128
4129 def _testInheritFlags(self):
4130 time.sleep(0.1)
4131 self.cli.connect((HOST, self.port))
4132 time.sleep(0.5)
4133 self.cli.send(MSG)
4134
Guido van Rossum24e4af82002-06-12 19:18:08 +00004135 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004136 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004137 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004138 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004139 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004140 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004141 pass
4142 else:
4143 self.fail("Error trying to do non-blocking accept.")
4144 read, write, err = select.select([self.serv], [], [])
4145 if self.serv in read:
4146 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004147 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004148 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004149 else:
4150 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004151
Guido van Rossum24e4af82002-06-12 19:18:08 +00004152 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004153 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004154 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004155
4156 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004157 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004158 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004159 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004160
4161 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004162 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004163 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004164
4165 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004166 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004167 conn, addr = self.serv.accept()
4168 conn.setblocking(0)
4169 try:
4170 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004171 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004172 pass
4173 else:
4174 self.fail("Error trying to do non-blocking recv.")
4175 read, write, err = select.select([conn], [], [])
4176 if conn in read:
4177 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004178 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004179 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004180 else:
4181 self.fail("Error during select call to non-blocking socket.")
4182
4183 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004184 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004185 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004186 self.cli.send(MSG)
4187
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004188
Guido van Rossum24e4af82002-06-12 19:18:08 +00004189class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004190 """Unit tests for the object returned by socket.makefile()
4191
Antoine Pitrou834bd812010-10-13 16:17:14 +00004192 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004193 the client connection. You can read from this file to
4194 get output from the server.
4195
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004197 server connection. You can write to this file to send output
4198 to the client.
4199 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004200
Guido van Rossume9f66142002-08-07 15:46:19 +00004201 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004202 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004203 errors = 'strict'
4204 newline = None
4205
4206 read_mode = 'rb'
4207 read_msg = MSG
4208 write_mode = 'wb'
4209 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004210
Guido van Rossum24e4af82002-06-12 19:18:08 +00004211 def __init__(self, methodName='runTest'):
4212 SocketConnectedTest.__init__(self, methodName=methodName)
4213
4214 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004215 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4216 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004217 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004218 self.read_file = self.cli_conn.makefile(
4219 self.read_mode, self.bufsize,
4220 encoding = self.encoding,
4221 errors = self.errors,
4222 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004223
4224 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004225 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004226 self.read_file.close()
4227 self.assertTrue(self.read_file.closed)
4228 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004229 SocketConnectedTest.tearDown(self)
4230
4231 def clientSetUp(self):
4232 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004233 self.write_file = self.serv_conn.makefile(
4234 self.write_mode, self.bufsize,
4235 encoding = self.encoding,
4236 errors = self.errors,
4237 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004238
4239 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004240 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004241 self.write_file.close()
4242 self.assertTrue(self.write_file.closed)
4243 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004244 SocketConnectedTest.clientTearDown(self)
4245
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004246 def testReadAfterTimeout(self):
4247 # Issue #7322: A file object must disallow further reads
4248 # after a timeout has occurred.
4249 self.cli_conn.settimeout(1)
4250 self.read_file.read(3)
4251 # First read raises a timeout
4252 self.assertRaises(socket.timeout, self.read_file.read, 1)
4253 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004254 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004255 self.read_file.read(1)
4256 self.assertIn("cannot read from timed out object", str(ctx.exception))
4257
4258 def _testReadAfterTimeout(self):
4259 self.write_file.write(self.write_msg[0:3])
4260 self.write_file.flush()
4261 self.serv_finished.wait()
4262
Guido van Rossum24e4af82002-06-12 19:18:08 +00004263 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004264 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004265 first_seg = self.read_file.read(len(self.read_msg)-3)
4266 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004267 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004268 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004269
4270 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004271 self.write_file.write(self.write_msg)
4272 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004273
Guido van Rossum8c943832002-08-08 01:00:28 +00004274 def testFullRead(self):
4275 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004276 msg = self.read_file.read()
4277 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004278
4279 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004280 self.write_file.write(self.write_msg)
4281 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004282
Guido van Rossum24e4af82002-06-12 19:18:08 +00004283 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004284 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004285 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004286 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004287 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004288 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004289 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004290 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004291 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004292
4293 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004294 self.write_file.write(self.write_msg)
4295 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004296
4297 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004298 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004299 line = self.read_file.readline()
4300 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004301
4302 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004303 self.write_file.write(self.write_msg)
4304 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004305
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004306 def testCloseAfterMakefile(self):
4307 # The file returned by makefile should keep the socket open.
4308 self.cli_conn.close()
4309 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004310 msg = self.read_file.read()
4311 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004312
4313 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004314 self.write_file.write(self.write_msg)
4315 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004316
4317 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004318 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004319 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004320 if isinstance(self.read_msg, str):
4321 msg = msg.decode()
4322 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004323
4324 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004325 self.write_file.write(self.write_msg)
4326 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004327
Tim Peters116d83c2004-03-28 02:20:45 +00004328 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004329 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004330
4331 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004332 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004333
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004334 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004335 self.assertEqual(self.read_file.mode, self.read_mode)
4336 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004337
4338 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004339 self.assertEqual(self.write_file.mode, self.write_mode)
4340 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004341
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004342 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004343 self.read_file.close()
4344 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004345 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004346 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004347
4348 def _testRealClose(self):
4349 pass
4350
4351
Guido van Rossume9f66142002-08-07 15:46:19 +00004352class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4353
4354 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004355
Guido van Rossume9f66142002-08-07 15:46:19 +00004356 In this case (and in this case only), it should be possible to
4357 create a file object, read a line from it, create another file
4358 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004359 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004360 when reading multiple requests from the same socket."""
4361
4362 bufsize = 0 # Use unbuffered mode
4363
4364 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004365 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004366 line = self.read_file.readline() # first line
4367 self.assertEqual(line, b"A. " + self.write_msg) # first line
4368 self.read_file = self.cli_conn.makefile('rb', 0)
4369 line = self.read_file.readline() # second line
4370 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004371
4372 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004373 self.write_file.write(b"A. " + self.write_msg)
4374 self.write_file.write(b"B. " + self.write_msg)
4375 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004376
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004377 def testMakefileClose(self):
4378 # The file returned by makefile should keep the socket open...
4379 self.cli_conn.close()
4380 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004381 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004382 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004383 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004384 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004385
4386 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004387 self.write_file.write(self.write_msg)
4388 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004389
4390 def testMakefileCloseSocketDestroy(self):
4391 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004392 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004393 refcount_after = sys.getrefcount(self.cli_conn)
4394 self.assertEqual(refcount_before - 1, refcount_after)
4395
4396 def _testMakefileCloseSocketDestroy(self):
4397 pass
4398
Antoine Pitrou98b46702010-09-18 22:59:00 +00004399 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004400 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004401 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4402
4403 def testSmallReadNonBlocking(self):
4404 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004405 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4406 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004407 self.evt1.set()
4408 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004409 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004410 if first_seg is None:
4411 # Data not arrived (can happen under Windows), wait a bit
4412 time.sleep(0.5)
4413 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004414 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004415 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004416 self.assertEqual(n, 3)
4417 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004418 self.assertEqual(msg, self.read_msg)
4419 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4420 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004421
4422 def _testSmallReadNonBlocking(self):
4423 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004424 self.write_file.write(self.write_msg)
4425 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004426 self.evt2.set()
Mike53f7a7c2017-12-14 14:04:53 +03004427 # Avoid closing the socket before the server test has finished,
Antoine Pitrou98b46702010-09-18 22:59:00 +00004428 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4429 self.serv_finished.wait(5.0)
4430
4431 def testWriteNonBlocking(self):
4432 self.cli_finished.wait(5.0)
4433 # The client thread can't skip directly - the SkipTest exception
4434 # would appear as a failure.
4435 if self.serv_skipped:
4436 self.skipTest(self.serv_skipped)
4437
4438 def _testWriteNonBlocking(self):
4439 self.serv_skipped = None
4440 self.serv_conn.setblocking(False)
4441 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004442 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004443 LIMIT = 10
4444 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004445 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004446 self.assertGreater(n, 0)
4447 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004448 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004449 if n is None:
4450 # Succeeded
4451 break
4452 self.assertGreater(n, 0)
4453 else:
4454 # Let us know that this test didn't manage to establish
4455 # the expected conditions. This is not a failure in itself but,
4456 # if it happens repeatedly, the test should be fixed.
4457 self.serv_skipped = "failed to saturate the socket buffer"
4458
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004459
Guido van Rossum8c943832002-08-08 01:00:28 +00004460class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4461
4462 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4463
4464
4465class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4466
4467 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004468
Thomas Woutersb2137042007-02-01 18:02:27 +00004469
Antoine Pitrou834bd812010-10-13 16:17:14 +00004470class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4471 """Tests for socket.makefile() in text mode (rather than binary)"""
4472
4473 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004474 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004475 write_mode = 'wb'
4476 write_msg = MSG
4477 newline = ''
4478
4479
4480class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4481 """Tests for socket.makefile() in text mode (rather than binary)"""
4482
4483 read_mode = 'rb'
4484 read_msg = MSG
4485 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004486 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004487 newline = ''
4488
4489
4490class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4491 """Tests for socket.makefile() in text mode (rather than binary)"""
4492
4493 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004494 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004495 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004496 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004497 newline = ''
4498
4499
Guido van Rossumd8faa362007-04-27 19:54:29 +00004500class NetworkConnectionTest(object):
4501 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004502
Guido van Rossumd8faa362007-04-27 19:54:29 +00004503 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004504 # We're inherited below by BasicTCPTest2, which also inherits
4505 # BasicTCPTest, which defines self.port referenced below.
4506 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004507 self.serv_conn = self.cli
4508
4509class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4510 """Tests that NetworkConnection does not break existing TCP functionality.
4511 """
4512
4513class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004514
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004515 class MockSocket(socket.socket):
4516 def connect(self, *args):
4517 raise socket.timeout('timed out')
4518
4519 @contextlib.contextmanager
4520 def mocked_socket_module(self):
4521 """Return a socket which times out on connect"""
4522 old_socket = socket.socket
4523 socket.socket = self.MockSocket
4524 try:
4525 yield
4526 finally:
4527 socket.socket = old_socket
4528
4529 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004530 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004531 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004532 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004533 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004534 cli.connect((HOST, port))
4535 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4536
4537 def test_create_connection(self):
4538 # Issue #9792: errors raised by create_connection() should have
4539 # a proper errno attribute.
4540 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004541 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004542 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004543
4544 # Issue #16257: create_connection() calls getaddrinfo() against
4545 # 'localhost'. This may result in an IPV6 addr being returned
4546 # as well as an IPV4 one:
4547 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4548 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4549 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4550 #
4551 # create_connection() enumerates through all the addresses returned
4552 # and if it doesn't successfully bind to any of them, it propagates
4553 # the last exception it encountered.
4554 #
4555 # On Solaris, ENETUNREACH is returned in this circumstance instead
4556 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4557 # expected errnos.
4558 expected_errnos = [ errno.ECONNREFUSED, ]
4559 if hasattr(errno, 'ENETUNREACH'):
4560 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004561 if hasattr(errno, 'EADDRNOTAVAIL'):
4562 # bpo-31910: socket.create_connection() fails randomly
4563 # with EADDRNOTAVAIL on Travis CI
4564 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004565
4566 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004567
4568 def test_create_connection_timeout(self):
4569 # Issue #9792: create_connection() should not recast timeout errors
4570 # as generic socket errors.
4571 with self.mocked_socket_module():
4572 with self.assertRaises(socket.timeout):
4573 socket.create_connection((HOST, 1234))
4574
Guido van Rossumd8faa362007-04-27 19:54:29 +00004575
4576class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4577
4578 def __init__(self, methodName='runTest'):
4579 SocketTCPTest.__init__(self, methodName=methodName)
4580 ThreadableTest.__init__(self)
4581
4582 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004583 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004584
4585 def clientTearDown(self):
4586 self.cli.close()
4587 self.cli = None
4588 ThreadableTest.clientTearDown(self)
4589
4590 def _justAccept(self):
4591 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004592 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004593
4594 testFamily = _justAccept
4595 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004596 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004597 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004598 self.assertEqual(self.cli.family, 2)
4599
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004600 testSourceAddress = _justAccept
4601 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004602 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4603 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004604 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004605 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004606 # The port number being used is sufficient to show that the bind()
4607 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004608
Guido van Rossumd8faa362007-04-27 19:54:29 +00004609 testTimeoutDefault = _justAccept
4610 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004611 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004612 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004613 socket.setdefaulttimeout(42)
4614 try:
4615 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004616 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004617 finally:
4618 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004619 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004620
4621 testTimeoutNone = _justAccept
4622 def _testTimeoutNone(self):
4623 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004624 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004625 socket.setdefaulttimeout(30)
4626 try:
4627 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004628 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004629 finally:
4630 socket.setdefaulttimeout(None)
4631 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004632
4633 testTimeoutValueNamed = _justAccept
4634 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004635 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004636 self.assertEqual(self.cli.gettimeout(), 30)
4637
4638 testTimeoutValueNonamed = _justAccept
4639 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004640 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004641 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004642 self.assertEqual(self.cli.gettimeout(), 30)
4643
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004644
Guido van Rossumd8faa362007-04-27 19:54:29 +00004645class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4646
4647 def __init__(self, methodName='runTest'):
4648 SocketTCPTest.__init__(self, methodName=methodName)
4649 ThreadableTest.__init__(self)
4650
4651 def clientSetUp(self):
4652 pass
4653
4654 def clientTearDown(self):
4655 self.cli.close()
4656 self.cli = None
4657 ThreadableTest.clientTearDown(self)
4658
4659 def testInsideTimeout(self):
4660 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004661 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004662 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004663 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004664 testOutsideTimeout = testInsideTimeout
4665
4666 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004667 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004668 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004669 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004670
4671 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004672 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004673 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004674
4675
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004676class TCPTimeoutTest(SocketTCPTest):
4677
4678 def testTCPTimeout(self):
4679 def raise_timeout(*args, **kwargs):
4680 self.serv.settimeout(1.0)
4681 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004682 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004683 "Error generating a timeout exception (TCP)")
4684
4685 def testTimeoutZero(self):
4686 ok = False
4687 try:
4688 self.serv.settimeout(0.0)
4689 foo = self.serv.accept()
4690 except socket.timeout:
4691 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004692 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004693 ok = True
4694 except:
4695 self.fail("caught unexpected exception (TCP)")
4696 if not ok:
4697 self.fail("accept() returned success when we did not expect it")
4698
Serhiy Storchaka43767632013-11-03 21:31:38 +02004699 @unittest.skipUnless(hasattr(signal, 'alarm'),
4700 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004701 def testInterruptedTimeout(self):
4702 # XXX I don't know how to do this test on MSWindows or any other
luzpaza5293b42017-11-05 07:37:50 -06004703 # platform that doesn't support signal.alarm() or os.kill(), though
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004704 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004705 self.serv.settimeout(5.0) # must be longer than alarm
4706 class Alarm(Exception):
4707 pass
4708 def alarm_handler(signal, frame):
4709 raise Alarm
4710 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4711 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004712 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004713 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004714 foo = self.serv.accept()
4715 except socket.timeout:
4716 self.fail("caught timeout instead of Alarm")
4717 except Alarm:
4718 pass
4719 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004720 self.fail("caught other exception instead of Alarm:"
4721 " %s(%s):\n%s" %
4722 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004723 else:
4724 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004725 finally:
4726 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004727 except Alarm:
4728 self.fail("got Alarm in wrong place")
4729 finally:
4730 # no alarm can be pending. Safe to restore old handler.
4731 signal.signal(signal.SIGALRM, old_alarm)
4732
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004733class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004734
4735 def testUDPTimeout(self):
4736 def raise_timeout(*args, **kwargs):
4737 self.serv.settimeout(1.0)
4738 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004739 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004740 "Error generating a timeout exception (UDP)")
4741
4742 def testTimeoutZero(self):
4743 ok = False
4744 try:
4745 self.serv.settimeout(0.0)
4746 foo = self.serv.recv(1024)
4747 except socket.timeout:
4748 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004749 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004750 ok = True
4751 except:
4752 self.fail("caught unexpected exception (UDP)")
4753 if not ok:
4754 self.fail("recv() returned success when we did not expect it")
4755
4756class TestExceptions(unittest.TestCase):
4757
4758 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004759 self.assertTrue(issubclass(OSError, Exception))
4760 self.assertTrue(issubclass(socket.herror, OSError))
4761 self.assertTrue(issubclass(socket.gaierror, OSError))
4762 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004763
Yury Selivanovfa22b292016-10-18 16:03:52 -04004764 def test_setblocking_invalidfd(self):
4765 # Regression test for issue #28471
4766
4767 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4768 sock = socket.socket(
4769 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4770 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004771 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004772
4773 with self.assertRaises(OSError):
4774 sock.setblocking(False)
4775
4776
Serhiy Storchaka43767632013-11-03 21:31:38 +02004777@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004778class TestLinuxAbstractNamespace(unittest.TestCase):
4779
4780 UNIX_PATH_MAX = 108
4781
4782 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004783 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004784 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4785 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004786 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004787 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4788 s2.connect(s1.getsockname())
4789 with s1.accept()[0] as s3:
4790 self.assertEqual(s1.getsockname(), address)
4791 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004792
4793 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004794 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004795 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4796 s.bind(address)
4797 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004798
4799 def testNameOverflow(self):
4800 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004801 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004802 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004803
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004804 def testStrName(self):
4805 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004806 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4807 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004808 s.bind("\x00python\x00test\x00")
4809 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004810 finally:
4811 s.close()
4812
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004813 def testBytearrayName(self):
4814 # Check that an abstract name can be passed as a bytearray.
4815 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4816 s.bind(bytearray(b"\x00python\x00test\x00"))
4817 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4818
Serhiy Storchaka43767632013-11-03 21:31:38 +02004819@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004820class TestUnixDomain(unittest.TestCase):
4821
4822 def setUp(self):
4823 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4824
4825 def tearDown(self):
4826 self.sock.close()
4827
4828 def encoded(self, path):
4829 # Return the given path encoded in the file system encoding,
4830 # or skip the test if this is not possible.
4831 try:
4832 return os.fsencode(path)
4833 except UnicodeEncodeError:
4834 self.skipTest(
4835 "Pathname {0!a} cannot be represented in file "
4836 "system encoding {1!r}".format(
4837 path, sys.getfilesystemencoding()))
4838
Antoine Pitrou16374872011-12-16 15:04:12 +01004839 def bind(self, sock, path):
4840 # Bind the socket
4841 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004842 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004843 except OSError as e:
4844 if str(e) == "AF_UNIX path too long":
4845 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004846 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004847 .format(path))
4848 else:
4849 raise
4850
Antoine Pitrou495b5022017-05-02 17:20:00 +02004851 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004852 # Issue #30205 (note getsockname() can return None on OS X)
4853 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004854
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004855 def testStrAddr(self):
4856 # Test binding to and retrieving a normal string pathname.
4857 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004858 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004859 self.addCleanup(support.unlink, path)
4860 self.assertEqual(self.sock.getsockname(), path)
4861
4862 def testBytesAddr(self):
4863 # Test binding to a bytes pathname.
4864 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004865 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004866 self.addCleanup(support.unlink, path)
4867 self.assertEqual(self.sock.getsockname(), path)
4868
4869 def testSurrogateescapeBind(self):
4870 # Test binding to a valid non-ASCII pathname, with the
4871 # non-ASCII bytes supplied using surrogateescape encoding.
4872 path = os.path.abspath(support.TESTFN_UNICODE)
4873 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004874 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004875 self.addCleanup(support.unlink, path)
4876 self.assertEqual(self.sock.getsockname(), path)
4877
4878 def testUnencodableAddr(self):
4879 # Test binding to a pathname that cannot be encoded in the
4880 # file system encoding.
4881 if support.TESTFN_UNENCODABLE is None:
4882 self.skipTest("No unencodable filename available")
4883 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004884 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004885 self.addCleanup(support.unlink, path)
4886 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004887
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004888
Thomas Wouters477c8d52006-05-27 19:21:47 +00004889class BufferIOTest(SocketConnectedTest):
4890 """
4891 Test the buffer versions of socket.recv() and socket.send().
4892 """
4893 def __init__(self, methodName='runTest'):
4894 SocketConnectedTest.__init__(self, methodName=methodName)
4895
Antoine Pitrou25480782010-03-17 22:50:28 +00004896 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004897 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004898 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004899 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004900 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004901 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004902 self.assertEqual(msg, MSG)
4903
Antoine Pitrou25480782010-03-17 22:50:28 +00004904 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004905 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004906 self.serv_conn.send(buf)
4907
Antoine Pitrou25480782010-03-17 22:50:28 +00004908 def testRecvIntoBytearray(self):
4909 buf = bytearray(1024)
4910 nbytes = self.cli_conn.recv_into(buf)
4911 self.assertEqual(nbytes, len(MSG))
4912 msg = buf[:len(MSG)]
4913 self.assertEqual(msg, MSG)
4914
4915 _testRecvIntoBytearray = _testRecvIntoArray
4916
4917 def testRecvIntoMemoryview(self):
4918 buf = bytearray(1024)
4919 nbytes = self.cli_conn.recv_into(memoryview(buf))
4920 self.assertEqual(nbytes, len(MSG))
4921 msg = buf[:len(MSG)]
4922 self.assertEqual(msg, MSG)
4923
4924 _testRecvIntoMemoryview = _testRecvIntoArray
4925
4926 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004927 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004928 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004929 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004930 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004931 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004932 self.assertEqual(msg, MSG)
4933
Antoine Pitrou25480782010-03-17 22:50:28 +00004934 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004935 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004936 self.serv_conn.send(buf)
4937
Antoine Pitrou25480782010-03-17 22:50:28 +00004938 def testRecvFromIntoBytearray(self):
4939 buf = bytearray(1024)
4940 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4941 self.assertEqual(nbytes, len(MSG))
4942 msg = buf[:len(MSG)]
4943 self.assertEqual(msg, MSG)
4944
4945 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4946
4947 def testRecvFromIntoMemoryview(self):
4948 buf = bytearray(1024)
4949 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4950 self.assertEqual(nbytes, len(MSG))
4951 msg = buf[:len(MSG)]
4952 self.assertEqual(msg, MSG)
4953
4954 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4955
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004956 def testRecvFromIntoSmallBuffer(self):
4957 # See issue #20246.
4958 buf = bytearray(8)
4959 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4960
4961 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004962 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004963
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004964 def testRecvFromIntoEmptyBuffer(self):
4965 buf = bytearray()
4966 self.cli_conn.recvfrom_into(buf)
4967 self.cli_conn.recvfrom_into(buf, 0)
4968
4969 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4970
Christian Heimes043d6f62008-01-07 17:19:16 +00004971
4972TIPC_STYPE = 2000
4973TIPC_LOWER = 200
4974TIPC_UPPER = 210
4975
4976def isTipcAvailable():
4977 """Check if the TIPC module is loaded
4978
4979 The TIPC module is not loaded automatically on Ubuntu and probably
4980 other Linux distros.
4981 """
4982 if not hasattr(socket, "AF_TIPC"):
4983 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004984 try:
4985 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004986 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004987 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004988 # have not the permission to read it.
4989 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004990 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004991 for line in f:
4992 if line.startswith("tipc "):
4993 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004994 return False
4995
Serhiy Storchaka43767632013-11-03 21:31:38 +02004996@unittest.skipUnless(isTipcAvailable(),
4997 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004998class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004999 def testRDM(self):
5000 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
5001 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005002 self.addCleanup(srv.close)
5003 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005004
5005 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5006 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5007 TIPC_LOWER, TIPC_UPPER)
5008 srv.bind(srvaddr)
5009
5010 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5011 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5012 cli.sendto(MSG, sendaddr)
5013
5014 msg, recvaddr = srv.recvfrom(1024)
5015
5016 self.assertEqual(cli.getsockname(), recvaddr)
5017 self.assertEqual(msg, MSG)
5018
5019
Serhiy Storchaka43767632013-11-03 21:31:38 +02005020@unittest.skipUnless(isTipcAvailable(),
5021 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005022class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005023 def __init__(self, methodName = 'runTest'):
5024 unittest.TestCase.__init__(self, methodName = methodName)
5025 ThreadableTest.__init__(self)
5026
5027 def setUp(self):
5028 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005029 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005030 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5031 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5032 TIPC_LOWER, TIPC_UPPER)
5033 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005034 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005035 self.serverExplicitReady()
5036 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005037 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005038
5039 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005040 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005041 # accept() call; sleep a little while to avoid it, otherwise
5042 # we could get an exception
5043 time.sleep(0.1)
5044 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005045 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005046 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5047 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5048 self.cli.connect(addr)
5049 self.cliaddr = self.cli.getsockname()
5050
5051 def testStream(self):
5052 msg = self.conn.recv(1024)
5053 self.assertEqual(msg, MSG)
5054 self.assertEqual(self.cliaddr, self.connaddr)
5055
5056 def _testStream(self):
5057 self.cli.send(MSG)
5058 self.cli.close()
5059
5060
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005061class ContextManagersTest(ThreadedTCPSocketTest):
5062
5063 def _testSocketClass(self):
5064 # base test
5065 with socket.socket() as sock:
5066 self.assertFalse(sock._closed)
5067 self.assertTrue(sock._closed)
5068 # close inside with block
5069 with socket.socket() as sock:
5070 sock.close()
5071 self.assertTrue(sock._closed)
5072 # exception inside with block
5073 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005074 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005075 self.assertTrue(sock._closed)
5076
5077 def testCreateConnectionBase(self):
5078 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005079 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005080 data = conn.recv(1024)
5081 conn.sendall(data)
5082
5083 def _testCreateConnectionBase(self):
5084 address = self.serv.getsockname()
5085 with socket.create_connection(address) as sock:
5086 self.assertFalse(sock._closed)
5087 sock.sendall(b'foo')
5088 self.assertEqual(sock.recv(1024), b'foo')
5089 self.assertTrue(sock._closed)
5090
5091 def testCreateConnectionClose(self):
5092 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005093 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005094 data = conn.recv(1024)
5095 conn.sendall(data)
5096
5097 def _testCreateConnectionClose(self):
5098 address = self.serv.getsockname()
5099 with socket.create_connection(address) as sock:
5100 sock.close()
5101 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005102 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005103
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005104
Victor Stinnerdaf45552013-08-28 00:53:59 +02005105class InheritanceTest(unittest.TestCase):
5106 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5107 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005108 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005109 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005110 with socket.socket(socket.AF_INET,
5111 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
Yury Selivanov98181422017-12-18 20:02:54 -05005112 self.assertEqual(s.type, socket.SOCK_STREAM)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005113 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005114
5115 def test_default_inheritable(self):
5116 sock = socket.socket()
5117 with sock:
5118 self.assertEqual(sock.get_inheritable(), False)
5119
5120 def test_dup(self):
5121 sock = socket.socket()
5122 with sock:
5123 newsock = sock.dup()
5124 sock.close()
5125 with newsock:
5126 self.assertEqual(newsock.get_inheritable(), False)
5127
5128 def test_set_inheritable(self):
5129 sock = socket.socket()
5130 with sock:
5131 sock.set_inheritable(True)
5132 self.assertEqual(sock.get_inheritable(), True)
5133
5134 sock.set_inheritable(False)
5135 self.assertEqual(sock.get_inheritable(), False)
5136
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005137 @unittest.skipIf(fcntl is None, "need fcntl")
5138 def test_get_inheritable_cloexec(self):
5139 sock = socket.socket()
5140 with sock:
5141 fd = sock.fileno()
5142 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005143
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005144 # clear FD_CLOEXEC flag
5145 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5146 flags &= ~fcntl.FD_CLOEXEC
5147 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005148
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005149 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005150
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005151 @unittest.skipIf(fcntl is None, "need fcntl")
5152 def test_set_inheritable_cloexec(self):
5153 sock = socket.socket()
5154 with sock:
5155 fd = sock.fileno()
5156 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5157 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005158
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005159 sock.set_inheritable(True)
5160 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5161 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005162
5163
Victor Stinnerdaf45552013-08-28 00:53:59 +02005164 def test_socketpair(self):
5165 s1, s2 = socket.socketpair()
5166 self.addCleanup(s1.close)
5167 self.addCleanup(s2.close)
5168 self.assertEqual(s1.get_inheritable(), False)
5169 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005170
5171
5172@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5173 "SOCK_NONBLOCK not defined")
5174class NonblockConstantTest(unittest.TestCase):
5175 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5176 if nonblock:
Yury Selivanov98181422017-12-18 20:02:54 -05005177 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005178 self.assertEqual(s.gettimeout(), timeout)
Yury Selivanov98181422017-12-18 20:02:54 -05005179 self.assertTrue(
5180 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005181 else:
Yury Selivanov98181422017-12-18 20:02:54 -05005182 self.assertEqual(s.type, socket.SOCK_STREAM)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005183 self.assertEqual(s.gettimeout(), None)
Yury Selivanov98181422017-12-18 20:02:54 -05005184 self.assertFalse(
5185 fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005186
Charles-François Natali239bb962011-06-03 12:55:15 +02005187 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005188 def test_SOCK_NONBLOCK(self):
5189 # a lot of it seems silly and redundant, but I wanted to test that
5190 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005191 with socket.socket(socket.AF_INET,
5192 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5193 self.checkNonblock(s)
5194 s.setblocking(1)
5195 self.checkNonblock(s, False)
5196 s.setblocking(0)
5197 self.checkNonblock(s)
5198 s.settimeout(None)
5199 self.checkNonblock(s, False)
5200 s.settimeout(2.0)
5201 self.checkNonblock(s, timeout=2.0)
5202 s.setblocking(1)
5203 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005204 # defaulttimeout
5205 t = socket.getdefaulttimeout()
5206 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005207 with socket.socket() as s:
5208 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005209 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005210 with socket.socket() as s:
5211 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005212 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005213 with socket.socket() as s:
5214 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005215 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005216 with socket.socket() as s:
5217 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005218 socket.setdefaulttimeout(t)
5219
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005220
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005221@unittest.skipUnless(os.name == "nt", "Windows specific")
5222@unittest.skipUnless(multiprocessing, "need multiprocessing")
5223class TestSocketSharing(SocketTCPTest):
5224 # This must be classmethod and not staticmethod or multiprocessing
5225 # won't be able to bootstrap it.
5226 @classmethod
5227 def remoteProcessServer(cls, q):
5228 # Recreate socket from shared data
5229 sdata = q.get()
5230 message = q.get()
5231
5232 s = socket.fromshare(sdata)
5233 s2, c = s.accept()
5234
5235 # Send the message
5236 s2.sendall(message)
5237 s2.close()
5238 s.close()
5239
5240 def testShare(self):
5241 # Transfer the listening server socket to another process
5242 # and service it from there.
5243
5244 # Create process:
5245 q = multiprocessing.Queue()
5246 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5247 p.start()
5248
5249 # Get the shared socket data
5250 data = self.serv.share(p.pid)
5251
5252 # Pass the shared socket to the other process
5253 addr = self.serv.getsockname()
5254 self.serv.close()
5255 q.put(data)
5256
5257 # The data that the server will send us
5258 message = b"slapmahfro"
5259 q.put(message)
5260
5261 # Connect
5262 s = socket.create_connection(addr)
5263 # listen for the data
5264 m = []
5265 while True:
5266 data = s.recv(100)
5267 if not data:
5268 break
5269 m.append(data)
5270 s.close()
5271 received = b"".join(m)
5272 self.assertEqual(received, message)
5273 p.join()
5274
5275 def testShareLength(self):
5276 data = self.serv.share(os.getpid())
5277 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5278 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5279
5280 def compareSockets(self, org, other):
5281 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005282 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005283 self.assertEqual(org.gettimeout(), None)
5284 self.assertEqual(org.gettimeout(), other.gettimeout())
5285
5286 self.assertEqual(org.family, other.family)
5287 self.assertEqual(org.type, other.type)
5288 # If the user specified "0" for proto, then
5289 # internally windows will have picked the correct value.
5290 # Python introspection on the socket however will still return
5291 # 0. For the shared socket, the python value is recreated
5292 # from the actual value, so it may not compare correctly.
5293 if org.proto != 0:
5294 self.assertEqual(org.proto, other.proto)
5295
5296 def testShareLocal(self):
5297 data = self.serv.share(os.getpid())
5298 s = socket.fromshare(data)
5299 try:
5300 self.compareSockets(self.serv, s)
5301 finally:
5302 s.close()
5303
5304 def testTypes(self):
5305 families = [socket.AF_INET, socket.AF_INET6]
5306 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5307 for f in families:
5308 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005309 try:
5310 source = socket.socket(f, t)
5311 except OSError:
5312 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005313 try:
5314 data = source.share(os.getpid())
5315 shared = socket.fromshare(data)
5316 try:
5317 self.compareSockets(source, shared)
5318 finally:
5319 shared.close()
5320 finally:
5321 source.close()
5322
5323
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005324class SendfileUsingSendTest(ThreadedTCPSocketTest):
5325 """
5326 Test the send() implementation of socket.sendfile().
5327 """
5328
Victor Stinner8c663fd2017-11-08 14:44:44 -08005329 FILESIZE = (10 * 1024 * 1024) # 10 MiB
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005330 BUFSIZE = 8192
5331 FILEDATA = b""
5332 TIMEOUT = 2
5333
5334 @classmethod
5335 def setUpClass(cls):
5336 def chunks(total, step):
5337 assert total >= step
5338 while total > step:
5339 yield step
5340 total -= step
5341 if total:
5342 yield total
5343
5344 chunk = b"".join([random.choice(string.ascii_letters).encode()
5345 for i in range(cls.BUFSIZE)])
5346 with open(support.TESTFN, 'wb') as f:
5347 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5348 f.write(chunk)
5349 with open(support.TESTFN, 'rb') as f:
5350 cls.FILEDATA = f.read()
5351 assert len(cls.FILEDATA) == cls.FILESIZE
5352
5353 @classmethod
5354 def tearDownClass(cls):
5355 support.unlink(support.TESTFN)
5356
5357 def accept_conn(self):
5358 self.serv.settimeout(self.TIMEOUT)
5359 conn, addr = self.serv.accept()
5360 conn.settimeout(self.TIMEOUT)
5361 self.addCleanup(conn.close)
5362 return conn
5363
5364 def recv_data(self, conn):
5365 received = []
5366 while True:
5367 chunk = conn.recv(self.BUFSIZE)
5368 if not chunk:
5369 break
5370 received.append(chunk)
5371 return b''.join(received)
5372
5373 def meth_from_sock(self, sock):
5374 # Depending on the mixin class being run return either send()
5375 # or sendfile() method implementation.
5376 return getattr(sock, "_sendfile_use_send")
5377
5378 # regular file
5379
5380 def _testRegularFile(self):
5381 address = self.serv.getsockname()
5382 file = open(support.TESTFN, 'rb')
5383 with socket.create_connection(address) as sock, file as file:
5384 meth = self.meth_from_sock(sock)
5385 sent = meth(file)
5386 self.assertEqual(sent, self.FILESIZE)
5387 self.assertEqual(file.tell(), self.FILESIZE)
5388
5389 def testRegularFile(self):
5390 conn = self.accept_conn()
5391 data = self.recv_data(conn)
5392 self.assertEqual(len(data), self.FILESIZE)
5393 self.assertEqual(data, self.FILEDATA)
5394
5395 # non regular file
5396
5397 def _testNonRegularFile(self):
5398 address = self.serv.getsockname()
5399 file = io.BytesIO(self.FILEDATA)
5400 with socket.create_connection(address) as sock, file as file:
5401 sent = sock.sendfile(file)
5402 self.assertEqual(sent, self.FILESIZE)
5403 self.assertEqual(file.tell(), self.FILESIZE)
5404 self.assertRaises(socket._GiveupOnSendfile,
5405 sock._sendfile_use_sendfile, file)
5406
5407 def testNonRegularFile(self):
5408 conn = self.accept_conn()
5409 data = self.recv_data(conn)
5410 self.assertEqual(len(data), self.FILESIZE)
5411 self.assertEqual(data, self.FILEDATA)
5412
5413 # empty file
5414
5415 def _testEmptyFileSend(self):
5416 address = self.serv.getsockname()
5417 filename = support.TESTFN + "2"
5418 with open(filename, 'wb'):
5419 self.addCleanup(support.unlink, filename)
5420 file = open(filename, 'rb')
5421 with socket.create_connection(address) as sock, file as file:
5422 meth = self.meth_from_sock(sock)
5423 sent = meth(file)
5424 self.assertEqual(sent, 0)
5425 self.assertEqual(file.tell(), 0)
5426
5427 def testEmptyFileSend(self):
5428 conn = self.accept_conn()
5429 data = self.recv_data(conn)
5430 self.assertEqual(data, b"")
5431
5432 # offset
5433
5434 def _testOffset(self):
5435 address = self.serv.getsockname()
5436 file = open(support.TESTFN, 'rb')
5437 with socket.create_connection(address) as sock, file as file:
5438 meth = self.meth_from_sock(sock)
5439 sent = meth(file, offset=5000)
5440 self.assertEqual(sent, self.FILESIZE - 5000)
5441 self.assertEqual(file.tell(), self.FILESIZE)
5442
5443 def testOffset(self):
5444 conn = self.accept_conn()
5445 data = self.recv_data(conn)
5446 self.assertEqual(len(data), self.FILESIZE - 5000)
5447 self.assertEqual(data, self.FILEDATA[5000:])
5448
5449 # count
5450
5451 def _testCount(self):
5452 address = self.serv.getsockname()
5453 file = open(support.TESTFN, 'rb')
5454 with socket.create_connection(address, timeout=2) as sock, file as file:
5455 count = 5000007
5456 meth = self.meth_from_sock(sock)
5457 sent = meth(file, count=count)
5458 self.assertEqual(sent, count)
5459 self.assertEqual(file.tell(), count)
5460
5461 def testCount(self):
5462 count = 5000007
5463 conn = self.accept_conn()
5464 data = self.recv_data(conn)
5465 self.assertEqual(len(data), count)
5466 self.assertEqual(data, self.FILEDATA[:count])
5467
5468 # count small
5469
5470 def _testCountSmall(self):
5471 address = self.serv.getsockname()
5472 file = open(support.TESTFN, 'rb')
5473 with socket.create_connection(address, timeout=2) as sock, file as file:
5474 count = 1
5475 meth = self.meth_from_sock(sock)
5476 sent = meth(file, count=count)
5477 self.assertEqual(sent, count)
5478 self.assertEqual(file.tell(), count)
5479
5480 def testCountSmall(self):
5481 count = 1
5482 conn = self.accept_conn()
5483 data = self.recv_data(conn)
5484 self.assertEqual(len(data), count)
5485 self.assertEqual(data, self.FILEDATA[:count])
5486
5487 # count + offset
5488
5489 def _testCountWithOffset(self):
5490 address = self.serv.getsockname()
5491 file = open(support.TESTFN, 'rb')
5492 with socket.create_connection(address, timeout=2) as sock, file as file:
5493 count = 100007
5494 meth = self.meth_from_sock(sock)
5495 sent = meth(file, offset=2007, count=count)
5496 self.assertEqual(sent, count)
5497 self.assertEqual(file.tell(), count + 2007)
5498
5499 def testCountWithOffset(self):
5500 count = 100007
5501 conn = self.accept_conn()
5502 data = self.recv_data(conn)
5503 self.assertEqual(len(data), count)
5504 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5505
5506 # non blocking sockets are not supposed to work
5507
5508 def _testNonBlocking(self):
5509 address = self.serv.getsockname()
5510 file = open(support.TESTFN, 'rb')
5511 with socket.create_connection(address) as sock, file as file:
5512 sock.setblocking(False)
5513 meth = self.meth_from_sock(sock)
5514 self.assertRaises(ValueError, meth, file)
5515 self.assertRaises(ValueError, sock.sendfile, file)
5516
5517 def testNonBlocking(self):
5518 conn = self.accept_conn()
5519 if conn.recv(8192):
5520 self.fail('was not supposed to receive any data')
5521
5522 # timeout (non-triggered)
5523
5524 def _testWithTimeout(self):
5525 address = self.serv.getsockname()
5526 file = open(support.TESTFN, 'rb')
5527 with socket.create_connection(address, timeout=2) as sock, file as file:
5528 meth = self.meth_from_sock(sock)
5529 sent = meth(file)
5530 self.assertEqual(sent, self.FILESIZE)
5531
5532 def testWithTimeout(self):
5533 conn = self.accept_conn()
5534 data = self.recv_data(conn)
5535 self.assertEqual(len(data), self.FILESIZE)
5536 self.assertEqual(data, self.FILEDATA)
5537
5538 # timeout (triggered)
5539
5540 def _testWithTimeoutTriggeredSend(self):
5541 address = self.serv.getsockname()
5542 file = open(support.TESTFN, 'rb')
5543 with socket.create_connection(address, timeout=0.01) as sock, \
5544 file as file:
5545 meth = self.meth_from_sock(sock)
5546 self.assertRaises(socket.timeout, meth, file)
5547
5548 def testWithTimeoutTriggeredSend(self):
5549 conn = self.accept_conn()
5550 conn.recv(88192)
5551
5552 # errors
5553
5554 def _test_errors(self):
5555 pass
5556
5557 def test_errors(self):
5558 with open(support.TESTFN, 'rb') as file:
5559 with socket.socket(type=socket.SOCK_DGRAM) as s:
5560 meth = self.meth_from_sock(s)
5561 self.assertRaisesRegex(
5562 ValueError, "SOCK_STREAM", meth, file)
5563 with open(support.TESTFN, 'rt') as file:
5564 with socket.socket() as s:
5565 meth = self.meth_from_sock(s)
5566 self.assertRaisesRegex(
5567 ValueError, "binary mode", meth, file)
5568 with open(support.TESTFN, 'rb') as file:
5569 with socket.socket() as s:
5570 meth = self.meth_from_sock(s)
5571 self.assertRaisesRegex(TypeError, "positive integer",
5572 meth, file, count='2')
5573 self.assertRaisesRegex(TypeError, "positive integer",
5574 meth, file, count=0.1)
5575 self.assertRaisesRegex(ValueError, "positive integer",
5576 meth, file, count=0)
5577 self.assertRaisesRegex(ValueError, "positive integer",
5578 meth, file, count=-1)
5579
5580
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005581@unittest.skipUnless(hasattr(os, "sendfile"),
5582 'os.sendfile() required for this test.')
5583class SendfileUsingSendfileTest(SendfileUsingSendTest):
5584 """
5585 Test the sendfile() implementation of socket.sendfile().
5586 """
5587 def meth_from_sock(self, sock):
5588 return getattr(sock, "_sendfile_use_sendfile")
5589
Christian Heimes48371412016-09-06 00:37:46 +02005590
5591@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005592class LinuxKernelCryptoAPI(unittest.TestCase):
5593 # tests for AF_ALG
5594 def create_alg(self, typ, name):
5595 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005596 try:
5597 sock.bind((typ, name))
5598 except FileNotFoundError as e:
5599 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005600 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005601 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005602 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005603 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005604
Victor Stinner86afc1f2017-11-30 13:58:43 +01005605 # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
5606 # at least on ppc64le architecture
5607 @support.requires_linux_version(4, 5)
Christian Heimesdffa3942016-09-05 23:54:41 +02005608 def test_sha256(self):
5609 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5610 "177a9cb410ff61f20015ad")
5611 with self.create_alg('hash', 'sha256') as algo:
5612 op, _ = algo.accept()
5613 with op:
5614 op.sendall(b"abc")
5615 self.assertEqual(op.recv(512), expected)
5616
5617 op, _ = algo.accept()
5618 with op:
5619 op.send(b'a', socket.MSG_MORE)
5620 op.send(b'b', socket.MSG_MORE)
5621 op.send(b'c', socket.MSG_MORE)
5622 op.send(b'')
5623 self.assertEqual(op.recv(512), expected)
5624
5625 def test_hmac_sha1(self):
5626 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5627 with self.create_alg('hash', 'hmac(sha1)') as algo:
5628 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5629 op, _ = algo.accept()
5630 with op:
5631 op.sendall(b"what do ya want for nothing?")
5632 self.assertEqual(op.recv(512), expected)
5633
Christian Heimese084f842016-09-11 20:11:30 +02005634 # Although it should work with 3.19 and newer the test blocks on
5635 # Ubuntu 15.10 with Kernel 4.2.0-19.
5636 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005637 def test_aes_cbc(self):
5638 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5639 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5640 msg = b"Single block msg"
5641 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5642 msglen = len(msg)
5643 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5644 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5645 op, _ = algo.accept()
5646 with op:
5647 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5648 flags=socket.MSG_MORE)
5649 op.sendall(msg)
5650 self.assertEqual(op.recv(msglen), ciphertext)
5651
5652 op, _ = algo.accept()
5653 with op:
5654 op.sendmsg_afalg([ciphertext],
5655 op=socket.ALG_OP_DECRYPT, iv=iv)
5656 self.assertEqual(op.recv(msglen), msg)
5657
5658 # long message
5659 multiplier = 1024
5660 longmsg = [msg] * multiplier
5661 op, _ = algo.accept()
5662 with op:
5663 op.sendmsg_afalg(longmsg,
5664 op=socket.ALG_OP_ENCRYPT, iv=iv)
5665 enc = op.recv(msglen * multiplier)
5666 self.assertEqual(len(enc), msglen * multiplier)
5667 self.assertTrue(enc[:msglen], ciphertext)
5668
5669 op, _ = algo.accept()
5670 with op:
5671 op.sendmsg_afalg([enc],
5672 op=socket.ALG_OP_DECRYPT, iv=iv)
5673 dec = op.recv(msglen * multiplier)
5674 self.assertEqual(len(dec), msglen * multiplier)
5675 self.assertEqual(dec, msg * multiplier)
5676
matejcik9764c152017-02-16 14:41:31 +01005677 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005678 def test_aead_aes_gcm(self):
5679 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5680 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5681 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5682 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5683 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5684 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5685
5686 taglen = len(expected_tag)
5687 assoclen = len(assoc)
5688
5689 with self.create_alg('aead', 'gcm(aes)') as algo:
5690 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5691 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5692 None, taglen)
5693
5694 # send assoc, plain and tag buffer in separate steps
5695 op, _ = algo.accept()
5696 with op:
5697 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5698 assoclen=assoclen, flags=socket.MSG_MORE)
5699 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005700 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005701 res = op.recv(assoclen + len(plain) + taglen)
5702 self.assertEqual(expected_ct, res[assoclen:-taglen])
5703 self.assertEqual(expected_tag, res[-taglen:])
5704
5705 # now with msg
5706 op, _ = algo.accept()
5707 with op:
matejcik9764c152017-02-16 14:41:31 +01005708 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005709 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5710 assoclen=assoclen)
5711 res = op.recv(assoclen + len(plain) + taglen)
5712 self.assertEqual(expected_ct, res[assoclen:-taglen])
5713 self.assertEqual(expected_tag, res[-taglen:])
5714
5715 # create anc data manually
5716 pack_uint32 = struct.Struct('I').pack
5717 op, _ = algo.accept()
5718 with op:
matejcik9764c152017-02-16 14:41:31 +01005719 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005720 op.sendmsg(
5721 [msg],
5722 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5723 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5724 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5725 )
5726 )
matejcik9764c152017-02-16 14:41:31 +01005727 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005728 self.assertEqual(expected_ct, res[assoclen:-taglen])
5729 self.assertEqual(expected_tag, res[-taglen:])
5730
5731 # decrypt and verify
5732 op, _ = algo.accept()
5733 with op:
5734 msg = assoc + expected_ct + expected_tag
5735 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5736 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005737 res = op.recv(len(msg) - taglen)
5738 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005739
Christian Heimese084f842016-09-11 20:11:30 +02005740 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005741 def test_drbg_pr_sha256(self):
5742 # deterministic random bit generator, prediction resistance, sha256
5743 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5744 extra_seed = os.urandom(32)
5745 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5746 op, _ = algo.accept()
5747 with op:
5748 rn = op.recv(32)
5749 self.assertEqual(len(rn), 32)
5750
5751 def test_sendmsg_afalg_args(self):
5752 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005753 with sock:
5754 with self.assertRaises(TypeError):
5755 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005756
Christian Heimes02b30352016-09-11 19:49:56 +02005757 with self.assertRaises(TypeError):
5758 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005759
Christian Heimes02b30352016-09-11 19:49:56 +02005760 with self.assertRaises(TypeError):
5761 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005762
Christian Heimes02b30352016-09-11 19:49:56 +02005763 with self.assertRaises(TypeError):
5764 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005765
Christian Heimes02b30352016-09-11 19:49:56 +02005766 with self.assertRaises(TypeError):
5767 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5768
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005769
Guido van Rossumb995eb72002-07-31 16:08:40 +00005770def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005771 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005772 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005773
5774 tests.extend([
5775 NonBlockingTCPTests,
5776 FileObjectClassTestCase,
5777 UnbufferedFileObjectClassTestCase,
5778 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005779 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005780 UnicodeReadFileObjectClassTestCase,
5781 UnicodeWriteFileObjectClassTestCase,
5782 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005783 NetworkConnectionNoServer,
5784 NetworkConnectionAttributesTest,
5785 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005786 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005787 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005788 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005789 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005790 tests.append(BasicSocketPairTest)
5791 tests.append(TestUnixDomain)
5792 tests.append(TestLinuxAbstractNamespace)
5793 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005794 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005795 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005796 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005797 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005798 BasicVSOCKTest,
5799 ThreadedVSOCKSocketStreamTest,
5800 ])
5801 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005802 CmsgMacroTests,
5803 SendmsgUDPTest,
5804 RecvmsgUDPTest,
5805 RecvmsgIntoUDPTest,
5806 SendmsgUDP6Test,
5807 RecvmsgUDP6Test,
5808 RecvmsgRFC3542AncillaryUDP6Test,
5809 RecvmsgIntoRFC3542AncillaryUDP6Test,
5810 RecvmsgIntoUDP6Test,
5811 SendmsgTCPTest,
5812 RecvmsgTCPTest,
5813 RecvmsgIntoTCPTest,
5814 SendmsgSCTPStreamTest,
5815 RecvmsgSCTPStreamTest,
5816 RecvmsgIntoSCTPStreamTest,
5817 SendmsgUnixStreamTest,
5818 RecvmsgUnixStreamTest,
5819 RecvmsgIntoUnixStreamTest,
5820 RecvmsgSCMRightsStreamTest,
5821 RecvmsgIntoSCMRightsStreamTest,
5822 # These are slow when setitimer() is not available
5823 InterruptedRecvTimeoutTest,
5824 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005825 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005826 SendfileUsingSendTest,
5827 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005828 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005829
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005830 thread_info = support.threading_setup()
5831 support.run_unittest(*tests)
5832 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005833
5834if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005835 test_main()