blob: 41eac2396bb4102e5a9924afad38c037dd2ae24b [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)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001447 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1448 # 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
1580 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1581 def test_uknown_socket_family_repr(self):
1582 # Test that when created with a family that's not one of the known
1583 # AF_*/SOCK_* constants, socket.family just returns the number.
1584 #
1585 # To do this we fool socket.socket into believing it already has an
1586 # open fd because on this path it doesn't actually verify the family and
1587 # type and populates the socket object.
1588 #
1589 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001590 fd, path = tempfile.mkstemp()
1591 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001592 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1593 self.assertEqual(s.family, 42424)
1594 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001595
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001596 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1597 def test__sendfile_use_sendfile(self):
1598 class File:
1599 def __init__(self, fd):
1600 self.fd = fd
1601
1602 def fileno(self):
1603 return self.fd
1604 with socket.socket() as sock:
1605 fd = os.open(os.curdir, os.O_RDONLY)
1606 os.close(fd)
1607 with self.assertRaises(socket._GiveupOnSendfile):
1608 sock._sendfile_use_sendfile(File(fd))
1609 with self.assertRaises(OverflowError):
1610 sock._sendfile_use_sendfile(File(2**1000))
1611 with self.assertRaises(TypeError):
1612 sock._sendfile_use_sendfile(File(None))
1613
1614
Charles-François Natali47413c12011-10-06 19:47:44 +02001615@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1616class BasicCANTest(unittest.TestCase):
1617
1618 def testCrucialConstants(self):
1619 socket.AF_CAN
1620 socket.PF_CAN
1621 socket.CAN_RAW
1622
Charles-François Natali773e42d2013-02-05 19:42:01 +01001623 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1624 'socket.CAN_BCM required for this test.')
1625 def testBCMConstants(self):
1626 socket.CAN_BCM
1627
1628 # opcodes
1629 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1630 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1631 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1632 socket.CAN_BCM_TX_SEND # send one CAN frame
1633 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1634 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1635 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1636 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1637 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1638 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1639 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1640 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1641
Charles-François Natali47413c12011-10-06 19:47:44 +02001642 def testCreateSocket(self):
1643 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1644 pass
1645
Charles-François Natali773e42d2013-02-05 19:42:01 +01001646 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1647 'socket.CAN_BCM required for this test.')
1648 def testCreateBCMSocket(self):
1649 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1650 pass
1651
Charles-François Natali47413c12011-10-06 19:47:44 +02001652 def testBindAny(self):
1653 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1654 s.bind(('', ))
1655
1656 def testTooLongInterfaceName(self):
1657 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1658 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001659 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001660 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001661
1662 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1663 'socket.CAN_RAW_LOOPBACK required for this test.')
1664 def testLoopback(self):
1665 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1666 for loopback in (0, 1):
1667 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1668 loopback)
1669 self.assertEqual(loopback,
1670 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1671
1672 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1673 'socket.CAN_RAW_FILTER required for this test.')
1674 def testFilter(self):
1675 can_id, can_mask = 0x200, 0x700
1676 can_filter = struct.pack("=II", can_id, can_mask)
1677 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1678 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1679 self.assertEqual(can_filter,
1680 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001681 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001682
1683
1684@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001685class CANTest(ThreadedCANSocketTest):
1686
Charles-François Natali47413c12011-10-06 19:47:44 +02001687 def __init__(self, methodName='runTest'):
1688 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1689
1690 @classmethod
1691 def build_can_frame(cls, can_id, data):
1692 """Build a CAN frame."""
1693 can_dlc = len(data)
1694 data = data.ljust(8, b'\x00')
1695 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1696
1697 @classmethod
1698 def dissect_can_frame(cls, frame):
1699 """Dissect a CAN frame."""
1700 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1701 return (can_id, can_dlc, data[:can_dlc])
1702
1703 def testSendFrame(self):
1704 cf, addr = self.s.recvfrom(self.bufsize)
1705 self.assertEqual(self.cf, cf)
1706 self.assertEqual(addr[0], self.interface)
1707 self.assertEqual(addr[1], socket.AF_CAN)
1708
1709 def _testSendFrame(self):
1710 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1711 self.cli.send(self.cf)
1712
1713 def testSendMaxFrame(self):
1714 cf, addr = self.s.recvfrom(self.bufsize)
1715 self.assertEqual(self.cf, cf)
1716
1717 def _testSendMaxFrame(self):
1718 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1719 self.cli.send(self.cf)
1720
1721 def testSendMultiFrames(self):
1722 cf, addr = self.s.recvfrom(self.bufsize)
1723 self.assertEqual(self.cf1, cf)
1724
1725 cf, addr = self.s.recvfrom(self.bufsize)
1726 self.assertEqual(self.cf2, cf)
1727
1728 def _testSendMultiFrames(self):
1729 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1730 self.cli.send(self.cf1)
1731
1732 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1733 self.cli.send(self.cf2)
1734
Charles-François Natali773e42d2013-02-05 19:42:01 +01001735 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1736 'socket.CAN_BCM required for this test.')
1737 def _testBCM(self):
1738 cf, addr = self.cli.recvfrom(self.bufsize)
1739 self.assertEqual(self.cf, cf)
1740 can_id, can_dlc, data = self.dissect_can_frame(cf)
1741 self.assertEqual(self.can_id, can_id)
1742 self.assertEqual(self.data, data)
1743
1744 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1745 'socket.CAN_BCM required for this test.')
1746 def testBCM(self):
1747 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1748 self.addCleanup(bcm.close)
1749 bcm.connect((self.interface,))
1750 self.can_id = 0x123
1751 self.data = bytes([0xc0, 0xff, 0xee])
1752 self.cf = self.build_can_frame(self.can_id, self.data)
1753 opcode = socket.CAN_BCM_TX_SEND
1754 flags = 0
1755 count = 0
1756 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1757 bcm_can_id = 0x0222
1758 nframes = 1
1759 assert len(self.cf) == 16
1760 header = struct.pack(self.bcm_cmd_msg_fmt,
1761 opcode,
1762 flags,
1763 count,
1764 ival1_seconds,
1765 ival1_usec,
1766 ival2_seconds,
1767 ival2_usec,
1768 bcm_can_id,
1769 nframes,
1770 )
1771 header_plus_frame = header + self.cf
1772 bytes_sent = bcm.send(header_plus_frame)
1773 self.assertEqual(bytes_sent, len(header_plus_frame))
1774
Charles-François Natali47413c12011-10-06 19:47:44 +02001775
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001776@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1777class ISOTPTest(unittest.TestCase):
1778
1779 def __init__(self, *args, **kwargs):
1780 super().__init__(*args, **kwargs)
1781 self.interface = "vcan0"
1782
1783 def testCrucialConstants(self):
1784 socket.AF_CAN
1785 socket.PF_CAN
1786 socket.CAN_ISOTP
1787 socket.SOCK_DGRAM
1788
1789 def testCreateSocket(self):
1790 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1791 pass
1792
1793 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1794 'socket.CAN_ISOTP required for this test.')
1795 def testCreateISOTPSocket(self):
1796 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1797 pass
1798
1799 def testTooLongInterfaceName(self):
1800 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1801 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1802 with self.assertRaisesRegex(OSError, 'interface name too long'):
1803 s.bind(('x' * 1024, 1, 2))
1804
1805 def testBind(self):
1806 try:
1807 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1808 addr = self.interface, 0x123, 0x456
1809 s.bind(addr)
1810 self.assertEqual(s.getsockname(), addr)
1811 except OSError as e:
1812 if e.errno == errno.ENODEV:
1813 self.skipTest('network interface `%s` does not exist' %
1814 self.interface)
1815 else:
1816 raise
1817
1818
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001819@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1820class BasicRDSTest(unittest.TestCase):
1821
1822 def testCrucialConstants(self):
1823 socket.AF_RDS
1824 socket.PF_RDS
1825
1826 def testCreateSocket(self):
1827 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1828 pass
1829
1830 def testSocketBufferSize(self):
1831 bufsize = 16384
1832 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1833 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1834 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1835
1836
1837@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001838class RDSTest(ThreadedRDSSocketTest):
1839
1840 def __init__(self, methodName='runTest'):
1841 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1842
Charles-François Natali240c55f2011-11-10 20:33:36 +01001843 def setUp(self):
1844 super().setUp()
1845 self.evt = threading.Event()
1846
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001847 def testSendAndRecv(self):
1848 data, addr = self.serv.recvfrom(self.bufsize)
1849 self.assertEqual(self.data, data)
1850 self.assertEqual(self.cli_addr, addr)
1851
1852 def _testSendAndRecv(self):
1853 self.data = b'spam'
1854 self.cli.sendto(self.data, 0, (HOST, self.port))
1855
1856 def testPeek(self):
1857 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1858 self.assertEqual(self.data, data)
1859 data, addr = self.serv.recvfrom(self.bufsize)
1860 self.assertEqual(self.data, data)
1861
1862 def _testPeek(self):
1863 self.data = b'spam'
1864 self.cli.sendto(self.data, 0, (HOST, self.port))
1865
1866 @requireAttrs(socket.socket, 'recvmsg')
1867 def testSendAndRecvMsg(self):
1868 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1869 self.assertEqual(self.data, data)
1870
1871 @requireAttrs(socket.socket, 'sendmsg')
1872 def _testSendAndRecvMsg(self):
1873 self.data = b'hello ' * 10
1874 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1875
1876 def testSendAndRecvMulti(self):
1877 data, addr = self.serv.recvfrom(self.bufsize)
1878 self.assertEqual(self.data1, data)
1879
1880 data, addr = self.serv.recvfrom(self.bufsize)
1881 self.assertEqual(self.data2, data)
1882
1883 def _testSendAndRecvMulti(self):
1884 self.data1 = b'bacon'
1885 self.cli.sendto(self.data1, 0, (HOST, self.port))
1886
1887 self.data2 = b'egg'
1888 self.cli.sendto(self.data2, 0, (HOST, self.port))
1889
1890 def testSelect(self):
1891 r, w, x = select.select([self.serv], [], [], 3.0)
1892 self.assertIn(self.serv, r)
1893 data, addr = self.serv.recvfrom(self.bufsize)
1894 self.assertEqual(self.data, data)
1895
1896 def _testSelect(self):
1897 self.data = b'select'
1898 self.cli.sendto(self.data, 0, (HOST, self.port))
1899
1900 def testCongestion(self):
1901 # wait until the sender is done
1902 self.evt.wait()
1903
1904 def _testCongestion(self):
1905 # test the behavior in case of congestion
1906 self.data = b'fill'
1907 self.cli.setblocking(False)
1908 try:
1909 # try to lower the receiver's socket buffer size
1910 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1911 except OSError:
1912 pass
1913 with self.assertRaises(OSError) as cm:
1914 try:
1915 # fill the receiver's socket buffer
1916 while True:
1917 self.cli.sendto(self.data, 0, (HOST, self.port))
1918 finally:
1919 # signal the receiver we're done
1920 self.evt.set()
1921 # sendto() should have failed with ENOBUFS
1922 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1923 # and we should have received a congestion notification through poll
1924 r, w, x = select.select([self.serv], [], [], 3.0)
1925 self.assertIn(self.serv, r)
1926
1927
caaveryeffc12f2017-09-06 18:18:10 -04001928@unittest.skipIf(fcntl is None, "need fcntl")
1929@unittest.skipUnless(HAVE_SOCKET_VSOCK,
1930 'VSOCK sockets required for this test.')
1931class BasicVSOCKTest(unittest.TestCase):
1932
1933 def testCrucialConstants(self):
1934 socket.AF_VSOCK
1935
1936 def testVSOCKConstants(self):
1937 socket.SO_VM_SOCKETS_BUFFER_SIZE
1938 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
1939 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
1940 socket.VMADDR_CID_ANY
1941 socket.VMADDR_PORT_ANY
1942 socket.VMADDR_CID_HOST
1943 socket.VM_SOCKETS_INVALID_VERSION
1944 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
1945
1946 def testCreateSocket(self):
1947 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1948 pass
1949
1950 def testSocketBufferSize(self):
1951 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1952 orig_max = s.getsockopt(socket.AF_VSOCK,
1953 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
1954 orig = s.getsockopt(socket.AF_VSOCK,
1955 socket.SO_VM_SOCKETS_BUFFER_SIZE)
1956 orig_min = s.getsockopt(socket.AF_VSOCK,
1957 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
1958
1959 s.setsockopt(socket.AF_VSOCK,
1960 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
1961 s.setsockopt(socket.AF_VSOCK,
1962 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
1963 s.setsockopt(socket.AF_VSOCK,
1964 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
1965
1966 self.assertEqual(orig_max * 2,
1967 s.getsockopt(socket.AF_VSOCK,
1968 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
1969 self.assertEqual(orig * 2,
1970 s.getsockopt(socket.AF_VSOCK,
1971 socket.SO_VM_SOCKETS_BUFFER_SIZE))
1972 self.assertEqual(orig_min * 2,
1973 s.getsockopt(socket.AF_VSOCK,
1974 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
1975
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001976
Guido van Rossum24e4af82002-06-12 19:18:08 +00001977class BasicTCPTest(SocketConnectedTest):
1978
1979 def __init__(self, methodName='runTest'):
1980 SocketConnectedTest.__init__(self, methodName=methodName)
1981
1982 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001983 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001984 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001985 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001986
1987 def _testRecv(self):
1988 self.serv_conn.send(MSG)
1989
1990 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001991 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001992 seg1 = self.cli_conn.recv(len(MSG) - 3)
1993 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001994 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001995 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001996
1997 def _testOverFlowRecv(self):
1998 self.serv_conn.send(MSG)
1999
2000 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002001 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002002 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002003 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002004
2005 def _testRecvFrom(self):
2006 self.serv_conn.send(MSG)
2007
2008 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002009 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002010 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2011 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002012 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002013 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002014
2015 def _testOverFlowRecvFrom(self):
2016 self.serv_conn.send(MSG)
2017
2018 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002019 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002020 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002021 while 1:
2022 read = self.cli_conn.recv(1024)
2023 if not read:
2024 break
Guido van Rossume531e292002-08-08 20:28:34 +00002025 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002026 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002027
2028 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002029 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002030 self.serv_conn.sendall(big_chunk)
2031
2032 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002033 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002034 fd = self.cli_conn.fileno()
2035 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002036 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002037 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002038 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002039 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002040
2041 def _testFromFd(self):
2042 self.serv_conn.send(MSG)
2043
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002044 def testDup(self):
2045 # Testing dup()
2046 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002047 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002048 msg = sock.recv(1024)
2049 self.assertEqual(msg, MSG)
2050
2051 def _testDup(self):
2052 self.serv_conn.send(MSG)
2053
Guido van Rossum24e4af82002-06-12 19:18:08 +00002054 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002055 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002056 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002057 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002058 # wait for _testShutdown to finish: on OS X, when the server
2059 # closes the connection the client also becomes disconnected,
2060 # and the client's shutdown call will fail. (Issue #4397.)
2061 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002062
2063 def _testShutdown(self):
2064 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002065 self.serv_conn.shutdown(2)
2066
2067 testShutdown_overflow = support.cpython_only(testShutdown)
2068
2069 @support.cpython_only
2070 def _testShutdown_overflow(self):
2071 import _testcapi
2072 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002073 # Issue 15989
2074 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2075 _testcapi.INT_MAX + 1)
2076 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2077 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002078 self.serv_conn.shutdown(2)
2079
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002080 def testDetach(self):
2081 # Testing detach()
2082 fileno = self.cli_conn.fileno()
2083 f = self.cli_conn.detach()
2084 self.assertEqual(f, fileno)
2085 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002086 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002087 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002088 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002089 # ...but we can create another socket using the (still open)
2090 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002091 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002092 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002093 msg = sock.recv(1024)
2094 self.assertEqual(msg, MSG)
2095
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002096 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002097 self.serv_conn.send(MSG)
2098
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002099
Guido van Rossum24e4af82002-06-12 19:18:08 +00002100class BasicUDPTest(ThreadedUDPSocketTest):
2101
2102 def __init__(self, methodName='runTest'):
2103 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2104
2105 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002106 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002107 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002108 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002109
2110 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002111 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002112
Guido van Rossum1c938012002-06-12 21:17:20 +00002113 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002114 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002115 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002116 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002117
Guido van Rossum1c938012002-06-12 21:17:20 +00002118 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002119 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002120
Guido van Rossumd8faa362007-04-27 19:54:29 +00002121 def testRecvFromNegative(self):
2122 # Negative lengths passed to recvfrom should give ValueError.
2123 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2124
2125 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002126 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002127
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002128# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2129# same test code is used with different families and types of socket
2130# (e.g. stream, datagram), and tests using recvmsg() are repeated
2131# using recvmsg_into().
2132#
2133# The generic test classes such as SendmsgTests and
2134# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2135# supplied with sockets cli_sock and serv_sock representing the
2136# client's and the server's end of the connection respectively, and
2137# attributes cli_addr and serv_addr holding their (numeric where
2138# appropriate) addresses.
2139#
2140# The final concrete test classes combine these with subclasses of
2141# SocketTestBase which set up client and server sockets of a specific
2142# type, and with subclasses of SendrecvmsgBase such as
2143# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2144# sockets to cli_sock and serv_sock and override the methods and
2145# attributes of SendrecvmsgBase to fill in destination addresses if
2146# needed when sending, check for specific flags in msg_flags, etc.
2147#
2148# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2149# recvmsg_into().
2150
2151# XXX: like the other datagram (UDP) tests in this module, the code
2152# here assumes that datagram delivery on the local machine will be
2153# reliable.
2154
2155class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2156 # Base class for sendmsg()/recvmsg() tests.
2157
2158 # Time in seconds to wait before considering a test failed, or
2159 # None for no timeout. Not all tests actually set a timeout.
2160 fail_timeout = 3.0
2161
2162 def setUp(self):
2163 self.misc_event = threading.Event()
2164 super().setUp()
2165
2166 def sendToServer(self, msg):
2167 # Send msg to the server.
2168 return self.cli_sock.send(msg)
2169
2170 # Tuple of alternative default arguments for sendmsg() when called
2171 # via sendmsgToServer() (e.g. to include a destination address).
2172 sendmsg_to_server_defaults = ()
2173
2174 def sendmsgToServer(self, *args):
2175 # Call sendmsg() on self.cli_sock with the given arguments,
2176 # filling in any arguments which are not supplied with the
2177 # corresponding items of self.sendmsg_to_server_defaults, if
2178 # any.
2179 return self.cli_sock.sendmsg(
2180 *(args + self.sendmsg_to_server_defaults[len(args):]))
2181
2182 def doRecvmsg(self, sock, bufsize, *args):
2183 # Call recvmsg() on sock with given arguments and return its
2184 # result. Should be used for tests which can use either
2185 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2186 # this method with one which emulates it using recvmsg_into(),
2187 # thus allowing the same test to be used for both methods.
2188 result = sock.recvmsg(bufsize, *args)
2189 self.registerRecvmsgResult(result)
2190 return result
2191
2192 def registerRecvmsgResult(self, result):
2193 # Called by doRecvmsg() with the return value of recvmsg() or
2194 # recvmsg_into(). Can be overridden to arrange cleanup based
2195 # on the returned ancillary data, for instance.
2196 pass
2197
2198 def checkRecvmsgAddress(self, addr1, addr2):
2199 # Called to compare the received address with the address of
2200 # the peer.
2201 self.assertEqual(addr1, addr2)
2202
2203 # Flags that are normally unset in msg_flags
2204 msg_flags_common_unset = 0
2205 for name in ("MSG_CTRUNC", "MSG_OOB"):
2206 msg_flags_common_unset |= getattr(socket, name, 0)
2207
2208 # Flags that are normally set
2209 msg_flags_common_set = 0
2210
2211 # Flags set when a complete record has been received (e.g. MSG_EOR
2212 # for SCTP)
2213 msg_flags_eor_indicator = 0
2214
2215 # Flags set when a complete record has not been received
2216 # (e.g. MSG_TRUNC for datagram sockets)
2217 msg_flags_non_eor_indicator = 0
2218
2219 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2220 # Method to check the value of msg_flags returned by recvmsg[_into]().
2221 #
2222 # Checks that all bits in msg_flags_common_set attribute are
2223 # set in "flags" and all bits in msg_flags_common_unset are
2224 # unset.
2225 #
2226 # The "eor" argument specifies whether the flags should
2227 # indicate that a full record (or datagram) has been received.
2228 # If "eor" is None, no checks are done; otherwise, checks
2229 # that:
2230 #
2231 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2232 # set and all bits in msg_flags_non_eor_indicator are unset
2233 #
2234 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2235 # are set and all bits in msg_flags_eor_indicator are unset
2236 #
2237 # If "checkset" and/or "checkunset" are supplied, they require
2238 # the given bits to be set or unset respectively, overriding
2239 # what the attributes require for those bits.
2240 #
2241 # If any bits are set in "ignore", they will not be checked,
2242 # regardless of the other inputs.
2243 #
2244 # Will raise Exception if the inputs require a bit to be both
2245 # set and unset, and it is not ignored.
2246
2247 defaultset = self.msg_flags_common_set
2248 defaultunset = self.msg_flags_common_unset
2249
2250 if eor:
2251 defaultset |= self.msg_flags_eor_indicator
2252 defaultunset |= self.msg_flags_non_eor_indicator
2253 elif eor is not None:
2254 defaultset |= self.msg_flags_non_eor_indicator
2255 defaultunset |= self.msg_flags_eor_indicator
2256
2257 # Function arguments override defaults
2258 defaultset &= ~checkunset
2259 defaultunset &= ~checkset
2260
2261 # Merge arguments with remaining defaults, and check for conflicts
2262 checkset |= defaultset
2263 checkunset |= defaultunset
2264 inboth = checkset & checkunset & ~ignore
2265 if inboth:
2266 raise Exception("contradictory set, unset requirements for flags "
2267 "{0:#x}".format(inboth))
2268
2269 # Compare with given msg_flags value
2270 mask = (checkset | checkunset) & ~ignore
2271 self.assertEqual(flags & mask, checkset & mask)
2272
2273
2274class RecvmsgIntoMixin(SendrecvmsgBase):
2275 # Mixin to implement doRecvmsg() using recvmsg_into().
2276
2277 def doRecvmsg(self, sock, bufsize, *args):
2278 buf = bytearray(bufsize)
2279 result = sock.recvmsg_into([buf], *args)
2280 self.registerRecvmsgResult(result)
2281 self.assertGreaterEqual(result[0], 0)
2282 self.assertLessEqual(result[0], bufsize)
2283 return (bytes(buf[:result[0]]),) + result[1:]
2284
2285
2286class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2287 # Defines flags to be checked in msg_flags for datagram sockets.
2288
2289 @property
2290 def msg_flags_non_eor_indicator(self):
2291 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2292
2293
2294class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2295 # Defines flags to be checked in msg_flags for SCTP sockets.
2296
2297 @property
2298 def msg_flags_eor_indicator(self):
2299 return super().msg_flags_eor_indicator | socket.MSG_EOR
2300
2301
2302class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2303 # Base class for tests on connectionless-mode sockets. Users must
2304 # supply sockets on attributes cli and serv to be mapped to
2305 # cli_sock and serv_sock respectively.
2306
2307 @property
2308 def serv_sock(self):
2309 return self.serv
2310
2311 @property
2312 def cli_sock(self):
2313 return self.cli
2314
2315 @property
2316 def sendmsg_to_server_defaults(self):
2317 return ([], [], 0, self.serv_addr)
2318
2319 def sendToServer(self, msg):
2320 return self.cli_sock.sendto(msg, self.serv_addr)
2321
2322
2323class SendrecvmsgConnectedBase(SendrecvmsgBase):
2324 # Base class for tests on connected sockets. Users must supply
2325 # sockets on attributes serv_conn and cli_conn (representing the
2326 # connections *to* the server and the client), to be mapped to
2327 # cli_sock and serv_sock respectively.
2328
2329 @property
2330 def serv_sock(self):
2331 return self.cli_conn
2332
2333 @property
2334 def cli_sock(self):
2335 return self.serv_conn
2336
2337 def checkRecvmsgAddress(self, addr1, addr2):
2338 # Address is currently "unspecified" for a connected socket,
2339 # so we don't examine it
2340 pass
2341
2342
2343class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2344 # Base class to set a timeout on server's socket.
2345
2346 def setUp(self):
2347 super().setUp()
2348 self.serv_sock.settimeout(self.fail_timeout)
2349
2350
2351class SendmsgTests(SendrecvmsgServerTimeoutBase):
2352 # Tests for sendmsg() which can use any socket type and do not
2353 # involve recvmsg() or recvmsg_into().
2354
2355 def testSendmsg(self):
2356 # Send a simple message with sendmsg().
2357 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2358
2359 def _testSendmsg(self):
2360 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2361
2362 def testSendmsgDataGenerator(self):
2363 # Send from buffer obtained from a generator (not a sequence).
2364 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2365
2366 def _testSendmsgDataGenerator(self):
2367 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2368 len(MSG))
2369
2370 def testSendmsgAncillaryGenerator(self):
2371 # Gather (empty) ancillary data from a generator.
2372 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2373
2374 def _testSendmsgAncillaryGenerator(self):
2375 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2376 len(MSG))
2377
2378 def testSendmsgArray(self):
2379 # Send data from an array instead of the usual bytes object.
2380 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2381
2382 def _testSendmsgArray(self):
2383 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2384 len(MSG))
2385
2386 def testSendmsgGather(self):
2387 # Send message data from more than one buffer (gather write).
2388 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2389
2390 def _testSendmsgGather(self):
2391 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2392
2393 def testSendmsgBadArgs(self):
2394 # Check that sendmsg() rejects invalid arguments.
2395 self.assertEqual(self.serv_sock.recv(1000), b"done")
2396
2397 def _testSendmsgBadArgs(self):
2398 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2399 self.assertRaises(TypeError, self.sendmsgToServer,
2400 b"not in an iterable")
2401 self.assertRaises(TypeError, self.sendmsgToServer,
2402 object())
2403 self.assertRaises(TypeError, self.sendmsgToServer,
2404 [object()])
2405 self.assertRaises(TypeError, self.sendmsgToServer,
2406 [MSG, object()])
2407 self.assertRaises(TypeError, self.sendmsgToServer,
2408 [MSG], object())
2409 self.assertRaises(TypeError, self.sendmsgToServer,
2410 [MSG], [], object())
2411 self.assertRaises(TypeError, self.sendmsgToServer,
2412 [MSG], [], 0, object())
2413 self.sendToServer(b"done")
2414
2415 def testSendmsgBadCmsg(self):
2416 # Check that invalid ancillary data items are rejected.
2417 self.assertEqual(self.serv_sock.recv(1000), b"done")
2418
2419 def _testSendmsgBadCmsg(self):
2420 self.assertRaises(TypeError, self.sendmsgToServer,
2421 [MSG], [object()])
2422 self.assertRaises(TypeError, self.sendmsgToServer,
2423 [MSG], [(object(), 0, b"data")])
2424 self.assertRaises(TypeError, self.sendmsgToServer,
2425 [MSG], [(0, object(), b"data")])
2426 self.assertRaises(TypeError, self.sendmsgToServer,
2427 [MSG], [(0, 0, object())])
2428 self.assertRaises(TypeError, self.sendmsgToServer,
2429 [MSG], [(0, 0)])
2430 self.assertRaises(TypeError, self.sendmsgToServer,
2431 [MSG], [(0, 0, b"data", 42)])
2432 self.sendToServer(b"done")
2433
2434 @requireAttrs(socket, "CMSG_SPACE")
2435 def testSendmsgBadMultiCmsg(self):
2436 # Check that invalid ancillary data items are rejected when
2437 # more than one item is present.
2438 self.assertEqual(self.serv_sock.recv(1000), b"done")
2439
2440 @testSendmsgBadMultiCmsg.client_skip
2441 def _testSendmsgBadMultiCmsg(self):
2442 self.assertRaises(TypeError, self.sendmsgToServer,
2443 [MSG], [0, 0, b""])
2444 self.assertRaises(TypeError, self.sendmsgToServer,
2445 [MSG], [(0, 0, b""), object()])
2446 self.sendToServer(b"done")
2447
2448 def testSendmsgExcessCmsgReject(self):
2449 # Check that sendmsg() rejects excess ancillary data items
2450 # when the number that can be sent is limited.
2451 self.assertEqual(self.serv_sock.recv(1000), b"done")
2452
2453 def _testSendmsgExcessCmsgReject(self):
2454 if not hasattr(socket, "CMSG_SPACE"):
2455 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002456 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002457 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2458 self.assertIsNone(cm.exception.errno)
2459 self.sendToServer(b"done")
2460
2461 def testSendmsgAfterClose(self):
2462 # Check that sendmsg() fails on a closed socket.
2463 pass
2464
2465 def _testSendmsgAfterClose(self):
2466 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002467 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002468
2469
2470class SendmsgStreamTests(SendmsgTests):
2471 # Tests for sendmsg() which require a stream socket and do not
2472 # involve recvmsg() or recvmsg_into().
2473
2474 def testSendmsgExplicitNoneAddr(self):
2475 # Check that peer address can be specified as None.
2476 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2477
2478 def _testSendmsgExplicitNoneAddr(self):
2479 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2480
2481 def testSendmsgTimeout(self):
2482 # Check that timeout works with sendmsg().
2483 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2484 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2485
2486 def _testSendmsgTimeout(self):
2487 try:
2488 self.cli_sock.settimeout(0.03)
2489 with self.assertRaises(socket.timeout):
2490 while True:
2491 self.sendmsgToServer([b"a"*512])
2492 finally:
2493 self.misc_event.set()
2494
2495 # XXX: would be nice to have more tests for sendmsg flags argument.
2496
2497 # Linux supports MSG_DONTWAIT when sending, but in general, it
2498 # only works when receiving. Could add other platforms if they
2499 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002500 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002501 "MSG_DONTWAIT not known to work on this platform when "
2502 "sending")
2503 def testSendmsgDontWait(self):
2504 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2505 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2506 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2507
2508 @testSendmsgDontWait.client_skip
2509 def _testSendmsgDontWait(self):
2510 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002511 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002512 while True:
2513 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2514 self.assertIn(cm.exception.errno,
2515 (errno.EAGAIN, errno.EWOULDBLOCK))
2516 finally:
2517 self.misc_event.set()
2518
2519
2520class SendmsgConnectionlessTests(SendmsgTests):
2521 # Tests for sendmsg() which require a connectionless-mode
2522 # (e.g. datagram) socket, and do not involve recvmsg() or
2523 # recvmsg_into().
2524
2525 def testSendmsgNoDestAddr(self):
2526 # Check that sendmsg() fails when no destination address is
2527 # given for unconnected socket.
2528 pass
2529
2530 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002531 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002532 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002533 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002534 [MSG], [], 0, None)
2535
2536
2537class RecvmsgGenericTests(SendrecvmsgBase):
2538 # Tests for recvmsg() which can also be emulated using
2539 # recvmsg_into(), and can use any socket type.
2540
2541 def testRecvmsg(self):
2542 # Receive a simple message with recvmsg[_into]().
2543 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2544 self.assertEqual(msg, MSG)
2545 self.checkRecvmsgAddress(addr, self.cli_addr)
2546 self.assertEqual(ancdata, [])
2547 self.checkFlags(flags, eor=True)
2548
2549 def _testRecvmsg(self):
2550 self.sendToServer(MSG)
2551
2552 def testRecvmsgExplicitDefaults(self):
2553 # Test recvmsg[_into]() with default arguments provided explicitly.
2554 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2555 len(MSG), 0, 0)
2556 self.assertEqual(msg, MSG)
2557 self.checkRecvmsgAddress(addr, self.cli_addr)
2558 self.assertEqual(ancdata, [])
2559 self.checkFlags(flags, eor=True)
2560
2561 def _testRecvmsgExplicitDefaults(self):
2562 self.sendToServer(MSG)
2563
2564 def testRecvmsgShorter(self):
2565 # Receive a message smaller than buffer.
2566 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2567 len(MSG) + 42)
2568 self.assertEqual(msg, MSG)
2569 self.checkRecvmsgAddress(addr, self.cli_addr)
2570 self.assertEqual(ancdata, [])
2571 self.checkFlags(flags, eor=True)
2572
2573 def _testRecvmsgShorter(self):
2574 self.sendToServer(MSG)
2575
Charles-François Natali8619cd72011-10-03 19:43:15 +02002576 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2577 # datagram is received (issue #13001).
2578 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002579 def testRecvmsgTrunc(self):
2580 # Receive part of message, check for truncation indicators.
2581 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2582 len(MSG) - 3)
2583 self.assertEqual(msg, MSG[:-3])
2584 self.checkRecvmsgAddress(addr, self.cli_addr)
2585 self.assertEqual(ancdata, [])
2586 self.checkFlags(flags, eor=False)
2587
Charles-François Natali8619cd72011-10-03 19:43:15 +02002588 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002589 def _testRecvmsgTrunc(self):
2590 self.sendToServer(MSG)
2591
2592 def testRecvmsgShortAncillaryBuf(self):
2593 # Test ancillary data buffer too small to hold any ancillary data.
2594 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2595 len(MSG), 1)
2596 self.assertEqual(msg, MSG)
2597 self.checkRecvmsgAddress(addr, self.cli_addr)
2598 self.assertEqual(ancdata, [])
2599 self.checkFlags(flags, eor=True)
2600
2601 def _testRecvmsgShortAncillaryBuf(self):
2602 self.sendToServer(MSG)
2603
2604 def testRecvmsgLongAncillaryBuf(self):
2605 # Test large ancillary data buffer.
2606 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2607 len(MSG), 10240)
2608 self.assertEqual(msg, MSG)
2609 self.checkRecvmsgAddress(addr, self.cli_addr)
2610 self.assertEqual(ancdata, [])
2611 self.checkFlags(flags, eor=True)
2612
2613 def _testRecvmsgLongAncillaryBuf(self):
2614 self.sendToServer(MSG)
2615
2616 def testRecvmsgAfterClose(self):
2617 # Check that recvmsg[_into]() fails on a closed socket.
2618 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002619 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002620
2621 def _testRecvmsgAfterClose(self):
2622 pass
2623
2624 def testRecvmsgTimeout(self):
2625 # Check that timeout works.
2626 try:
2627 self.serv_sock.settimeout(0.03)
2628 self.assertRaises(socket.timeout,
2629 self.doRecvmsg, self.serv_sock, len(MSG))
2630 finally:
2631 self.misc_event.set()
2632
2633 def _testRecvmsgTimeout(self):
2634 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2635
2636 @requireAttrs(socket, "MSG_PEEK")
2637 def testRecvmsgPeek(self):
2638 # Check that MSG_PEEK in flags enables examination of pending
2639 # data without consuming it.
2640
2641 # Receive part of data with MSG_PEEK.
2642 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2643 len(MSG) - 3, 0,
2644 socket.MSG_PEEK)
2645 self.assertEqual(msg, MSG[:-3])
2646 self.checkRecvmsgAddress(addr, self.cli_addr)
2647 self.assertEqual(ancdata, [])
2648 # Ignoring MSG_TRUNC here (so this test is the same for stream
2649 # and datagram sockets). Some wording in POSIX seems to
2650 # suggest that it needn't be set when peeking, but that may
2651 # just be a slip.
2652 self.checkFlags(flags, eor=False,
2653 ignore=getattr(socket, "MSG_TRUNC", 0))
2654
2655 # Receive all data with MSG_PEEK.
2656 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2657 len(MSG), 0,
2658 socket.MSG_PEEK)
2659 self.assertEqual(msg, MSG)
2660 self.checkRecvmsgAddress(addr, self.cli_addr)
2661 self.assertEqual(ancdata, [])
2662 self.checkFlags(flags, eor=True)
2663
2664 # Check that the same data can still be received normally.
2665 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2666 self.assertEqual(msg, MSG)
2667 self.checkRecvmsgAddress(addr, self.cli_addr)
2668 self.assertEqual(ancdata, [])
2669 self.checkFlags(flags, eor=True)
2670
2671 @testRecvmsgPeek.client_skip
2672 def _testRecvmsgPeek(self):
2673 self.sendToServer(MSG)
2674
2675 @requireAttrs(socket.socket, "sendmsg")
2676 def testRecvmsgFromSendmsg(self):
2677 # Test receiving with recvmsg[_into]() when message is sent
2678 # using sendmsg().
2679 self.serv_sock.settimeout(self.fail_timeout)
2680 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2681 self.assertEqual(msg, MSG)
2682 self.checkRecvmsgAddress(addr, self.cli_addr)
2683 self.assertEqual(ancdata, [])
2684 self.checkFlags(flags, eor=True)
2685
2686 @testRecvmsgFromSendmsg.client_skip
2687 def _testRecvmsgFromSendmsg(self):
2688 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2689
2690
2691class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2692 # Tests which require a stream socket and can use either recvmsg()
2693 # or recvmsg_into().
2694
2695 def testRecvmsgEOF(self):
2696 # Receive end-of-stream indicator (b"", peer socket closed).
2697 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2698 self.assertEqual(msg, b"")
2699 self.checkRecvmsgAddress(addr, self.cli_addr)
2700 self.assertEqual(ancdata, [])
2701 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2702
2703 def _testRecvmsgEOF(self):
2704 self.cli_sock.close()
2705
2706 def testRecvmsgOverflow(self):
2707 # Receive a message in more than one chunk.
2708 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2709 len(MSG) - 3)
2710 self.checkRecvmsgAddress(addr, self.cli_addr)
2711 self.assertEqual(ancdata, [])
2712 self.checkFlags(flags, eor=False)
2713
2714 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2715 self.checkRecvmsgAddress(addr, self.cli_addr)
2716 self.assertEqual(ancdata, [])
2717 self.checkFlags(flags, eor=True)
2718
2719 msg = seg1 + seg2
2720 self.assertEqual(msg, MSG)
2721
2722 def _testRecvmsgOverflow(self):
2723 self.sendToServer(MSG)
2724
2725
2726class RecvmsgTests(RecvmsgGenericTests):
2727 # Tests for recvmsg() which can use any socket type.
2728
2729 def testRecvmsgBadArgs(self):
2730 # Check that recvmsg() rejects invalid arguments.
2731 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2732 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2733 -1, 0, 0)
2734 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2735 len(MSG), -1, 0)
2736 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2737 [bytearray(10)], 0, 0)
2738 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2739 object(), 0, 0)
2740 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2741 len(MSG), object(), 0)
2742 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2743 len(MSG), 0, object())
2744
2745 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2746 self.assertEqual(msg, MSG)
2747 self.checkRecvmsgAddress(addr, self.cli_addr)
2748 self.assertEqual(ancdata, [])
2749 self.checkFlags(flags, eor=True)
2750
2751 def _testRecvmsgBadArgs(self):
2752 self.sendToServer(MSG)
2753
2754
2755class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2756 # Tests for recvmsg_into() which can use any socket type.
2757
2758 def testRecvmsgIntoBadArgs(self):
2759 # Check that recvmsg_into() rejects invalid arguments.
2760 buf = bytearray(len(MSG))
2761 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2762 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2763 len(MSG), 0, 0)
2764 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2765 buf, 0, 0)
2766 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2767 [object()], 0, 0)
2768 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2769 [b"I'm not writable"], 0, 0)
2770 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2771 [buf, object()], 0, 0)
2772 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2773 [buf], -1, 0)
2774 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2775 [buf], object(), 0)
2776 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2777 [buf], 0, object())
2778
2779 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2780 self.assertEqual(nbytes, len(MSG))
2781 self.assertEqual(buf, bytearray(MSG))
2782 self.checkRecvmsgAddress(addr, self.cli_addr)
2783 self.assertEqual(ancdata, [])
2784 self.checkFlags(flags, eor=True)
2785
2786 def _testRecvmsgIntoBadArgs(self):
2787 self.sendToServer(MSG)
2788
2789 def testRecvmsgIntoGenerator(self):
2790 # Receive into buffer obtained from a generator (not a sequence).
2791 buf = bytearray(len(MSG))
2792 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2793 (o for o in [buf]))
2794 self.assertEqual(nbytes, len(MSG))
2795 self.assertEqual(buf, bytearray(MSG))
2796 self.checkRecvmsgAddress(addr, self.cli_addr)
2797 self.assertEqual(ancdata, [])
2798 self.checkFlags(flags, eor=True)
2799
2800 def _testRecvmsgIntoGenerator(self):
2801 self.sendToServer(MSG)
2802
2803 def testRecvmsgIntoArray(self):
2804 # Receive into an array rather than the usual bytearray.
2805 buf = array.array("B", [0] * len(MSG))
2806 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2807 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002808 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002809 self.checkRecvmsgAddress(addr, self.cli_addr)
2810 self.assertEqual(ancdata, [])
2811 self.checkFlags(flags, eor=True)
2812
2813 def _testRecvmsgIntoArray(self):
2814 self.sendToServer(MSG)
2815
2816 def testRecvmsgIntoScatter(self):
2817 # Receive into multiple buffers (scatter write).
2818 b1 = bytearray(b"----")
2819 b2 = bytearray(b"0123456789")
2820 b3 = bytearray(b"--------------")
2821 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2822 [b1, memoryview(b2)[2:9], b3])
2823 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2824 self.assertEqual(b1, bytearray(b"Mary"))
2825 self.assertEqual(b2, bytearray(b"01 had a 9"))
2826 self.assertEqual(b3, bytearray(b"little lamb---"))
2827 self.checkRecvmsgAddress(addr, self.cli_addr)
2828 self.assertEqual(ancdata, [])
2829 self.checkFlags(flags, eor=True)
2830
2831 def _testRecvmsgIntoScatter(self):
2832 self.sendToServer(b"Mary had a little lamb")
2833
2834
2835class CmsgMacroTests(unittest.TestCase):
2836 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2837 # assumptions used by sendmsg() and recvmsg[_into](), which share
2838 # code with these functions.
2839
2840 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002841 try:
2842 import _testcapi
2843 except ImportError:
2844 socklen_t_limit = 0x7fffffff
2845 else:
2846 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002847
2848 @requireAttrs(socket, "CMSG_LEN")
2849 def testCMSG_LEN(self):
2850 # Test CMSG_LEN() with various valid and invalid values,
2851 # checking the assumptions used by recvmsg() and sendmsg().
2852 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2853 values = list(range(257)) + list(range(toobig - 257, toobig))
2854
2855 # struct cmsghdr has at least three members, two of which are ints
2856 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2857 for n in values:
2858 ret = socket.CMSG_LEN(n)
2859 # This is how recvmsg() calculates the data size
2860 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2861 self.assertLessEqual(ret, self.socklen_t_limit)
2862
2863 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2864 # sendmsg() shares code with these functions, and requires
2865 # that it reject values over the limit.
2866 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2867 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2868
2869 @requireAttrs(socket, "CMSG_SPACE")
2870 def testCMSG_SPACE(self):
2871 # Test CMSG_SPACE() with various valid and invalid values,
2872 # checking the assumptions used by sendmsg().
2873 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2874 values = list(range(257)) + list(range(toobig - 257, toobig))
2875
2876 last = socket.CMSG_SPACE(0)
2877 # struct cmsghdr has at least three members, two of which are ints
2878 self.assertGreater(last, array.array("i").itemsize * 2)
2879 for n in values:
2880 ret = socket.CMSG_SPACE(n)
2881 self.assertGreaterEqual(ret, last)
2882 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2883 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2884 self.assertLessEqual(ret, self.socklen_t_limit)
2885 last = ret
2886
2887 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2888 # sendmsg() shares code with these functions, and requires
2889 # that it reject values over the limit.
2890 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2891 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2892
2893
2894class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2895 # Tests for file descriptor passing on Unix-domain sockets.
2896
2897 # Invalid file descriptor value that's unlikely to evaluate to a
2898 # real FD even if one of its bytes is replaced with a different
2899 # value (which shouldn't actually happen).
2900 badfd = -0x5555
2901
2902 def newFDs(self, n):
2903 # Return a list of n file descriptors for newly-created files
2904 # containing their list indices as ASCII numbers.
2905 fds = []
2906 for i in range(n):
2907 fd, path = tempfile.mkstemp()
2908 self.addCleanup(os.unlink, path)
2909 self.addCleanup(os.close, fd)
2910 os.write(fd, str(i).encode())
2911 fds.append(fd)
2912 return fds
2913
2914 def checkFDs(self, fds):
2915 # Check that the file descriptors in the given list contain
2916 # their correct list indices as ASCII numbers.
2917 for n, fd in enumerate(fds):
2918 os.lseek(fd, 0, os.SEEK_SET)
2919 self.assertEqual(os.read(fd, 1024), str(n).encode())
2920
2921 def registerRecvmsgResult(self, result):
2922 self.addCleanup(self.closeRecvmsgFDs, result)
2923
2924 def closeRecvmsgFDs(self, recvmsg_result):
2925 # Close all file descriptors specified in the ancillary data
2926 # of the given return value from recvmsg() or recvmsg_into().
2927 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2928 if (cmsg_level == socket.SOL_SOCKET and
2929 cmsg_type == socket.SCM_RIGHTS):
2930 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002931 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002932 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2933 for fd in fds:
2934 os.close(fd)
2935
2936 def createAndSendFDs(self, n):
2937 # Send n new file descriptors created by newFDs() to the
2938 # server, with the constant MSG as the non-ancillary data.
2939 self.assertEqual(
2940 self.sendmsgToServer([MSG],
2941 [(socket.SOL_SOCKET,
2942 socket.SCM_RIGHTS,
2943 array.array("i", self.newFDs(n)))]),
2944 len(MSG))
2945
2946 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2947 # Check that constant MSG was received with numfds file
2948 # descriptors in a maximum of maxcmsgs control messages (which
2949 # must contain only complete integers). By default, check
2950 # that MSG_CTRUNC is unset, but ignore any flags in
2951 # ignoreflags.
2952 msg, ancdata, flags, addr = result
2953 self.assertEqual(msg, MSG)
2954 self.checkRecvmsgAddress(addr, self.cli_addr)
2955 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2956 ignore=ignoreflags)
2957
2958 self.assertIsInstance(ancdata, list)
2959 self.assertLessEqual(len(ancdata), maxcmsgs)
2960 fds = array.array("i")
2961 for item in ancdata:
2962 self.assertIsInstance(item, tuple)
2963 cmsg_level, cmsg_type, cmsg_data = item
2964 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2965 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2966 self.assertIsInstance(cmsg_data, bytes)
2967 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002968 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002969
2970 self.assertEqual(len(fds), numfds)
2971 self.checkFDs(fds)
2972
2973 def testFDPassSimple(self):
2974 # Pass a single FD (array read from bytes object).
2975 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2976 len(MSG), 10240))
2977
2978 def _testFDPassSimple(self):
2979 self.assertEqual(
2980 self.sendmsgToServer(
2981 [MSG],
2982 [(socket.SOL_SOCKET,
2983 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002984 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002985 len(MSG))
2986
2987 def testMultipleFDPass(self):
2988 # Pass multiple FDs in a single array.
2989 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2990 len(MSG), 10240))
2991
2992 def _testMultipleFDPass(self):
2993 self.createAndSendFDs(4)
2994
2995 @requireAttrs(socket, "CMSG_SPACE")
2996 def testFDPassCMSG_SPACE(self):
2997 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2998 self.checkRecvmsgFDs(
2999 4, self.doRecvmsg(self.serv_sock, len(MSG),
3000 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3001
3002 @testFDPassCMSG_SPACE.client_skip
3003 def _testFDPassCMSG_SPACE(self):
3004 self.createAndSendFDs(4)
3005
3006 def testFDPassCMSG_LEN(self):
3007 # Test using CMSG_LEN() to calculate ancillary buffer size.
3008 self.checkRecvmsgFDs(1,
3009 self.doRecvmsg(self.serv_sock, len(MSG),
3010 socket.CMSG_LEN(4 * SIZEOF_INT)),
3011 # RFC 3542 says implementations may set
3012 # MSG_CTRUNC if there isn't enough space
3013 # for trailing padding.
3014 ignoreflags=socket.MSG_CTRUNC)
3015
3016 def _testFDPassCMSG_LEN(self):
3017 self.createAndSendFDs(1)
3018
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003019 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003020 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003021 @requireAttrs(socket, "CMSG_SPACE")
3022 def testFDPassSeparate(self):
3023 # Pass two FDs in two separate arrays. Arrays may be combined
3024 # into a single control message by the OS.
3025 self.checkRecvmsgFDs(2,
3026 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3027 maxcmsgs=2)
3028
3029 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003030 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003031 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003032 def _testFDPassSeparate(self):
3033 fd0, fd1 = self.newFDs(2)
3034 self.assertEqual(
3035 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3036 socket.SCM_RIGHTS,
3037 array.array("i", [fd0])),
3038 (socket.SOL_SOCKET,
3039 socket.SCM_RIGHTS,
3040 array.array("i", [fd1]))]),
3041 len(MSG))
3042
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003043 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003044 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003045 @requireAttrs(socket, "CMSG_SPACE")
3046 def testFDPassSeparateMinSpace(self):
3047 # Pass two FDs in two separate arrays, receiving them into the
3048 # minimum space for two arrays.
3049 self.checkRecvmsgFDs(2,
3050 self.doRecvmsg(self.serv_sock, len(MSG),
3051 socket.CMSG_SPACE(SIZEOF_INT) +
3052 socket.CMSG_LEN(SIZEOF_INT)),
3053 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3054
3055 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003056 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003057 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003058 def _testFDPassSeparateMinSpace(self):
3059 fd0, fd1 = self.newFDs(2)
3060 self.assertEqual(
3061 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3062 socket.SCM_RIGHTS,
3063 array.array("i", [fd0])),
3064 (socket.SOL_SOCKET,
3065 socket.SCM_RIGHTS,
3066 array.array("i", [fd1]))]),
3067 len(MSG))
3068
3069 def sendAncillaryIfPossible(self, msg, ancdata):
3070 # Try to send msg and ancdata to server, but if the system
3071 # call fails, just send msg with no ancillary data.
3072 try:
3073 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003074 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003075 # Check that it was the system call that failed
3076 self.assertIsInstance(e.errno, int)
3077 nbytes = self.sendmsgToServer([msg])
3078 self.assertEqual(nbytes, len(msg))
3079
Brett Cannon3bbad122015-12-28 17:21:44 -08003080 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003081 def testFDPassEmpty(self):
3082 # Try to pass an empty FD array. Can receive either no array
3083 # or an empty array.
3084 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3085 len(MSG), 10240),
3086 ignoreflags=socket.MSG_CTRUNC)
3087
3088 def _testFDPassEmpty(self):
3089 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3090 socket.SCM_RIGHTS,
3091 b"")])
3092
3093 def testFDPassPartialInt(self):
3094 # Try to pass a truncated FD array.
3095 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3096 len(MSG), 10240)
3097 self.assertEqual(msg, MSG)
3098 self.checkRecvmsgAddress(addr, self.cli_addr)
3099 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3100 self.assertLessEqual(len(ancdata), 1)
3101 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3102 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3103 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3104 self.assertLess(len(cmsg_data), SIZEOF_INT)
3105
3106 def _testFDPassPartialInt(self):
3107 self.sendAncillaryIfPossible(
3108 MSG,
3109 [(socket.SOL_SOCKET,
3110 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003111 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003112
3113 @requireAttrs(socket, "CMSG_SPACE")
3114 def testFDPassPartialIntInMiddle(self):
3115 # Try to pass two FD arrays, the first of which is truncated.
3116 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3117 len(MSG), 10240)
3118 self.assertEqual(msg, MSG)
3119 self.checkRecvmsgAddress(addr, self.cli_addr)
3120 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3121 self.assertLessEqual(len(ancdata), 2)
3122 fds = array.array("i")
3123 # Arrays may have been combined in a single control message
3124 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3125 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3126 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003127 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003128 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3129 self.assertLessEqual(len(fds), 2)
3130 self.checkFDs(fds)
3131
3132 @testFDPassPartialIntInMiddle.client_skip
3133 def _testFDPassPartialIntInMiddle(self):
3134 fd0, fd1 = self.newFDs(2)
3135 self.sendAncillaryIfPossible(
3136 MSG,
3137 [(socket.SOL_SOCKET,
3138 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003139 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003140 (socket.SOL_SOCKET,
3141 socket.SCM_RIGHTS,
3142 array.array("i", [fd1]))])
3143
3144 def checkTruncatedHeader(self, result, ignoreflags=0):
3145 # Check that no ancillary data items are returned when data is
3146 # truncated inside the cmsghdr structure.
3147 msg, ancdata, flags, addr = result
3148 self.assertEqual(msg, MSG)
3149 self.checkRecvmsgAddress(addr, self.cli_addr)
3150 self.assertEqual(ancdata, [])
3151 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3152 ignore=ignoreflags)
3153
3154 def testCmsgTruncNoBufSize(self):
3155 # Check that no ancillary data is received when no buffer size
3156 # is specified.
3157 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3158 # BSD seems to set MSG_CTRUNC only
3159 # if an item has been partially
3160 # received.
3161 ignoreflags=socket.MSG_CTRUNC)
3162
3163 def _testCmsgTruncNoBufSize(self):
3164 self.createAndSendFDs(1)
3165
3166 def testCmsgTrunc0(self):
3167 # Check that no ancillary data is received when buffer size is 0.
3168 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3169 ignoreflags=socket.MSG_CTRUNC)
3170
3171 def _testCmsgTrunc0(self):
3172 self.createAndSendFDs(1)
3173
3174 # Check that no ancillary data is returned for various non-zero
3175 # (but still too small) buffer sizes.
3176
3177 def testCmsgTrunc1(self):
3178 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3179
3180 def _testCmsgTrunc1(self):
3181 self.createAndSendFDs(1)
3182
3183 def testCmsgTrunc2Int(self):
3184 # The cmsghdr structure has at least three members, two of
3185 # which are ints, so we still shouldn't see any ancillary
3186 # data.
3187 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3188 SIZEOF_INT * 2))
3189
3190 def _testCmsgTrunc2Int(self):
3191 self.createAndSendFDs(1)
3192
3193 def testCmsgTruncLen0Minus1(self):
3194 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3195 socket.CMSG_LEN(0) - 1))
3196
3197 def _testCmsgTruncLen0Minus1(self):
3198 self.createAndSendFDs(1)
3199
3200 # The following tests try to truncate the control message in the
3201 # middle of the FD array.
3202
3203 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3204 # Check that file descriptor data is truncated to between
3205 # mindata and maxdata bytes when received with buffer size
3206 # ancbuf, and that any complete file descriptor numbers are
3207 # valid.
3208 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3209 len(MSG), ancbuf)
3210 self.assertEqual(msg, MSG)
3211 self.checkRecvmsgAddress(addr, self.cli_addr)
3212 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3213
3214 if mindata == 0 and ancdata == []:
3215 return
3216 self.assertEqual(len(ancdata), 1)
3217 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3218 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3219 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3220 self.assertGreaterEqual(len(cmsg_data), mindata)
3221 self.assertLessEqual(len(cmsg_data), maxdata)
3222 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003223 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003224 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3225 self.checkFDs(fds)
3226
3227 def testCmsgTruncLen0(self):
3228 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3229
3230 def _testCmsgTruncLen0(self):
3231 self.createAndSendFDs(1)
3232
3233 def testCmsgTruncLen0Plus1(self):
3234 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3235
3236 def _testCmsgTruncLen0Plus1(self):
3237 self.createAndSendFDs(2)
3238
3239 def testCmsgTruncLen1(self):
3240 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3241 maxdata=SIZEOF_INT)
3242
3243 def _testCmsgTruncLen1(self):
3244 self.createAndSendFDs(2)
3245
3246 def testCmsgTruncLen2Minus1(self):
3247 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3248 maxdata=(2 * SIZEOF_INT) - 1)
3249
3250 def _testCmsgTruncLen2Minus1(self):
3251 self.createAndSendFDs(2)
3252
3253
3254class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3255 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3256 # features of the RFC 3542 Advanced Sockets API for IPv6.
3257 # Currently we can only handle certain data items (e.g. traffic
3258 # class, hop limit, MTU discovery and fragmentation settings)
3259 # without resorting to unportable means such as the struct module,
3260 # but the tests here are aimed at testing the ancillary data
3261 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3262 # itself.
3263
3264 # Test value to use when setting hop limit of packet
3265 hop_limit = 2
3266
3267 # Test value to use when setting traffic class of packet.
3268 # -1 means "use kernel default".
3269 traffic_class = -1
3270
3271 def ancillaryMapping(self, ancdata):
3272 # Given ancillary data list ancdata, return a mapping from
3273 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3274 # Check that no (level, type) pair appears more than once.
3275 d = {}
3276 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3277 self.assertNotIn((cmsg_level, cmsg_type), d)
3278 d[(cmsg_level, cmsg_type)] = cmsg_data
3279 return d
3280
3281 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3282 # Receive hop limit into ancbufsize bytes of ancillary data
3283 # space. Check that data is MSG, ancillary data is not
3284 # truncated (but ignore any flags in ignoreflags), and hop
3285 # limit is between 0 and maxhop inclusive.
3286 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3287 socket.IPV6_RECVHOPLIMIT, 1)
3288 self.misc_event.set()
3289 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3290 len(MSG), ancbufsize)
3291
3292 self.assertEqual(msg, MSG)
3293 self.checkRecvmsgAddress(addr, self.cli_addr)
3294 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3295 ignore=ignoreflags)
3296
3297 self.assertEqual(len(ancdata), 1)
3298 self.assertIsInstance(ancdata[0], tuple)
3299 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3300 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3301 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3302 self.assertIsInstance(cmsg_data, bytes)
3303 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3304 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003305 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003306 self.assertGreaterEqual(a[0], 0)
3307 self.assertLessEqual(a[0], maxhop)
3308
3309 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3310 def testRecvHopLimit(self):
3311 # Test receiving the packet hop limit as ancillary data.
3312 self.checkHopLimit(ancbufsize=10240)
3313
3314 @testRecvHopLimit.client_skip
3315 def _testRecvHopLimit(self):
3316 # Need to wait until server has asked to receive ancillary
3317 # data, as implementations are not required to buffer it
3318 # otherwise.
3319 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3320 self.sendToServer(MSG)
3321
3322 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3323 def testRecvHopLimitCMSG_SPACE(self):
3324 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3325 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3326
3327 @testRecvHopLimitCMSG_SPACE.client_skip
3328 def _testRecvHopLimitCMSG_SPACE(self):
3329 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3330 self.sendToServer(MSG)
3331
3332 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3333 # 3542 says portable applications must provide space for trailing
3334 # padding. Implementations may set MSG_CTRUNC if there isn't
3335 # enough space for the padding.
3336
3337 @requireAttrs(socket.socket, "sendmsg")
3338 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3339 def testSetHopLimit(self):
3340 # Test setting hop limit on outgoing packet and receiving it
3341 # at the other end.
3342 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3343
3344 @testSetHopLimit.client_skip
3345 def _testSetHopLimit(self):
3346 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3347 self.assertEqual(
3348 self.sendmsgToServer([MSG],
3349 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3350 array.array("i", [self.hop_limit]))]),
3351 len(MSG))
3352
3353 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3354 ignoreflags=0):
3355 # Receive traffic class and hop limit into ancbufsize bytes of
3356 # ancillary data space. Check that data is MSG, ancillary
3357 # data is not truncated (but ignore any flags in ignoreflags),
3358 # and traffic class and hop limit are in range (hop limit no
3359 # more than maxhop).
3360 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3361 socket.IPV6_RECVHOPLIMIT, 1)
3362 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3363 socket.IPV6_RECVTCLASS, 1)
3364 self.misc_event.set()
3365 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3366 len(MSG), ancbufsize)
3367
3368 self.assertEqual(msg, MSG)
3369 self.checkRecvmsgAddress(addr, self.cli_addr)
3370 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3371 ignore=ignoreflags)
3372 self.assertEqual(len(ancdata), 2)
3373 ancmap = self.ancillaryMapping(ancdata)
3374
3375 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3376 self.assertEqual(len(tcdata), SIZEOF_INT)
3377 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003378 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003379 self.assertGreaterEqual(a[0], 0)
3380 self.assertLessEqual(a[0], 255)
3381
3382 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3383 self.assertEqual(len(hldata), SIZEOF_INT)
3384 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003385 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003386 self.assertGreaterEqual(a[0], 0)
3387 self.assertLessEqual(a[0], maxhop)
3388
3389 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3390 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3391 def testRecvTrafficClassAndHopLimit(self):
3392 # Test receiving traffic class and hop limit as ancillary data.
3393 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3394
3395 @testRecvTrafficClassAndHopLimit.client_skip
3396 def _testRecvTrafficClassAndHopLimit(self):
3397 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3398 self.sendToServer(MSG)
3399
3400 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3401 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3402 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3403 # Test receiving traffic class and hop limit, using
3404 # CMSG_SPACE() to calculate buffer size.
3405 self.checkTrafficClassAndHopLimit(
3406 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3407
3408 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3409 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3410 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3411 self.sendToServer(MSG)
3412
3413 @requireAttrs(socket.socket, "sendmsg")
3414 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3415 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3416 def testSetTrafficClassAndHopLimit(self):
3417 # Test setting traffic class and hop limit on outgoing packet,
3418 # and receiving them at the other end.
3419 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3420 maxhop=self.hop_limit)
3421
3422 @testSetTrafficClassAndHopLimit.client_skip
3423 def _testSetTrafficClassAndHopLimit(self):
3424 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3425 self.assertEqual(
3426 self.sendmsgToServer([MSG],
3427 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3428 array.array("i", [self.traffic_class])),
3429 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3430 array.array("i", [self.hop_limit]))]),
3431 len(MSG))
3432
3433 @requireAttrs(socket.socket, "sendmsg")
3434 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3435 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3436 def testOddCmsgSize(self):
3437 # Try to send ancillary data with first item one byte too
3438 # long. Fall back to sending with correct size if this fails,
3439 # and check that second item was handled correctly.
3440 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3441 maxhop=self.hop_limit)
3442
3443 @testOddCmsgSize.client_skip
3444 def _testOddCmsgSize(self):
3445 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3446 try:
3447 nbytes = self.sendmsgToServer(
3448 [MSG],
3449 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003450 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3452 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003453 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003454 self.assertIsInstance(e.errno, int)
3455 nbytes = self.sendmsgToServer(
3456 [MSG],
3457 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3458 array.array("i", [self.traffic_class])),
3459 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3460 array.array("i", [self.hop_limit]))])
3461 self.assertEqual(nbytes, len(MSG))
3462
3463 # Tests for proper handling of truncated ancillary data
3464
3465 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3466 # Receive hop limit into ancbufsize bytes of ancillary data
3467 # space, which should be too small to contain the ancillary
3468 # data header (if ancbufsize is None, pass no second argument
3469 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3470 # (unless included in ignoreflags), and no ancillary data is
3471 # returned.
3472 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3473 socket.IPV6_RECVHOPLIMIT, 1)
3474 self.misc_event.set()
3475 args = () if ancbufsize is None else (ancbufsize,)
3476 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3477 len(MSG), *args)
3478
3479 self.assertEqual(msg, MSG)
3480 self.checkRecvmsgAddress(addr, self.cli_addr)
3481 self.assertEqual(ancdata, [])
3482 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3483 ignore=ignoreflags)
3484
3485 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3486 def testCmsgTruncNoBufSize(self):
3487 # Check that no ancillary data is received when no ancillary
3488 # buffer size is provided.
3489 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3490 # BSD seems to set
3491 # MSG_CTRUNC only if an item
3492 # has been partially
3493 # received.
3494 ignoreflags=socket.MSG_CTRUNC)
3495
3496 @testCmsgTruncNoBufSize.client_skip
3497 def _testCmsgTruncNoBufSize(self):
3498 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3499 self.sendToServer(MSG)
3500
3501 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3502 def testSingleCmsgTrunc0(self):
3503 # Check that no ancillary data is received when ancillary
3504 # buffer size is zero.
3505 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3506 ignoreflags=socket.MSG_CTRUNC)
3507
3508 @testSingleCmsgTrunc0.client_skip
3509 def _testSingleCmsgTrunc0(self):
3510 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3511 self.sendToServer(MSG)
3512
3513 # Check that no ancillary data is returned for various non-zero
3514 # (but still too small) buffer sizes.
3515
3516 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3517 def testSingleCmsgTrunc1(self):
3518 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3519
3520 @testSingleCmsgTrunc1.client_skip
3521 def _testSingleCmsgTrunc1(self):
3522 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3523 self.sendToServer(MSG)
3524
3525 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3526 def testSingleCmsgTrunc2Int(self):
3527 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3528
3529 @testSingleCmsgTrunc2Int.client_skip
3530 def _testSingleCmsgTrunc2Int(self):
3531 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3532 self.sendToServer(MSG)
3533
3534 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3535 def testSingleCmsgTruncLen0Minus1(self):
3536 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3537
3538 @testSingleCmsgTruncLen0Minus1.client_skip
3539 def _testSingleCmsgTruncLen0Minus1(self):
3540 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3541 self.sendToServer(MSG)
3542
3543 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3544 def testSingleCmsgTruncInData(self):
3545 # Test truncation of a control message inside its associated
3546 # data. The message may be returned with its data truncated,
3547 # or not returned at all.
3548 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3549 socket.IPV6_RECVHOPLIMIT, 1)
3550 self.misc_event.set()
3551 msg, ancdata, flags, addr = self.doRecvmsg(
3552 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3553
3554 self.assertEqual(msg, MSG)
3555 self.checkRecvmsgAddress(addr, self.cli_addr)
3556 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3557
3558 self.assertLessEqual(len(ancdata), 1)
3559 if ancdata:
3560 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3561 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3562 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3563 self.assertLess(len(cmsg_data), SIZEOF_INT)
3564
3565 @testSingleCmsgTruncInData.client_skip
3566 def _testSingleCmsgTruncInData(self):
3567 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3568 self.sendToServer(MSG)
3569
3570 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3571 # Receive traffic class and hop limit into ancbufsize bytes of
3572 # ancillary data space, which should be large enough to
3573 # contain the first item, but too small to contain the header
3574 # of the second. Check that data is MSG, MSG_CTRUNC is set
3575 # (unless included in ignoreflags), and only one ancillary
3576 # data item is returned.
3577 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3578 socket.IPV6_RECVHOPLIMIT, 1)
3579 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3580 socket.IPV6_RECVTCLASS, 1)
3581 self.misc_event.set()
3582 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3583 len(MSG), ancbufsize)
3584
3585 self.assertEqual(msg, MSG)
3586 self.checkRecvmsgAddress(addr, self.cli_addr)
3587 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3588 ignore=ignoreflags)
3589
3590 self.assertEqual(len(ancdata), 1)
3591 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3592 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3593 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3594 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3595 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003596 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003597 self.assertGreaterEqual(a[0], 0)
3598 self.assertLessEqual(a[0], 255)
3599
3600 # Try the above test with various buffer sizes.
3601
3602 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3603 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3604 def testSecondCmsgTrunc0(self):
3605 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3606 ignoreflags=socket.MSG_CTRUNC)
3607
3608 @testSecondCmsgTrunc0.client_skip
3609 def _testSecondCmsgTrunc0(self):
3610 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3611 self.sendToServer(MSG)
3612
3613 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3614 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3615 def testSecondCmsgTrunc1(self):
3616 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3617
3618 @testSecondCmsgTrunc1.client_skip
3619 def _testSecondCmsgTrunc1(self):
3620 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3621 self.sendToServer(MSG)
3622
3623 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3624 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3625 def testSecondCmsgTrunc2Int(self):
3626 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3627 2 * SIZEOF_INT)
3628
3629 @testSecondCmsgTrunc2Int.client_skip
3630 def _testSecondCmsgTrunc2Int(self):
3631 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3632 self.sendToServer(MSG)
3633
3634 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3635 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3636 def testSecondCmsgTruncLen0Minus1(self):
3637 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3638 socket.CMSG_LEN(0) - 1)
3639
3640 @testSecondCmsgTruncLen0Minus1.client_skip
3641 def _testSecondCmsgTruncLen0Minus1(self):
3642 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3643 self.sendToServer(MSG)
3644
3645 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3646 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3647 def testSecomdCmsgTruncInData(self):
3648 # Test truncation of the second of two control messages inside
3649 # its associated data.
3650 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3651 socket.IPV6_RECVHOPLIMIT, 1)
3652 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3653 socket.IPV6_RECVTCLASS, 1)
3654 self.misc_event.set()
3655 msg, ancdata, flags, addr = self.doRecvmsg(
3656 self.serv_sock, len(MSG),
3657 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3658
3659 self.assertEqual(msg, MSG)
3660 self.checkRecvmsgAddress(addr, self.cli_addr)
3661 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3662
3663 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3664
3665 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3666 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3667 cmsg_types.remove(cmsg_type)
3668 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3669 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003670 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003671 self.assertGreaterEqual(a[0], 0)
3672 self.assertLessEqual(a[0], 255)
3673
3674 if ancdata:
3675 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3676 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3677 cmsg_types.remove(cmsg_type)
3678 self.assertLess(len(cmsg_data), SIZEOF_INT)
3679
3680 self.assertEqual(ancdata, [])
3681
3682 @testSecomdCmsgTruncInData.client_skip
3683 def _testSecomdCmsgTruncInData(self):
3684 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3685 self.sendToServer(MSG)
3686
3687
3688# Derive concrete test classes for different socket types.
3689
3690class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3691 SendrecvmsgConnectionlessBase,
3692 ThreadedSocketTestMixin, UDPTestBase):
3693 pass
3694
3695@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003696class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3697 pass
3698
3699@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003700class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3701 pass
3702
3703@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003704class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3705 pass
3706
3707
3708class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3709 SendrecvmsgConnectionlessBase,
3710 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003711
3712 def checkRecvmsgAddress(self, addr1, addr2):
3713 # Called to compare the received address with the address of
3714 # the peer, ignoring scope ID
3715 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003716
3717@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003718@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003719@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003720class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3721 pass
3722
3723@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003724@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003725@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003726class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3727 pass
3728
3729@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003730@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003731@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003732class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3733 pass
3734
3735@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003736@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003737@requireAttrs(socket, "IPPROTO_IPV6")
3738@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003739class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3740 SendrecvmsgUDP6TestBase):
3741 pass
3742
3743@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003744@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003745@requireAttrs(socket, "IPPROTO_IPV6")
3746@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003747class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3748 RFC3542AncillaryTest,
3749 SendrecvmsgUDP6TestBase):
3750 pass
3751
3752
3753class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3754 ConnectedStreamTestMixin, TCPTestBase):
3755 pass
3756
3757@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003758class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3759 pass
3760
3761@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003762class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3763 SendrecvmsgTCPTestBase):
3764 pass
3765
3766@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003767class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3768 SendrecvmsgTCPTestBase):
3769 pass
3770
3771
3772class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3773 SendrecvmsgConnectedBase,
3774 ConnectedStreamTestMixin, SCTPStreamBase):
3775 pass
3776
3777@requireAttrs(socket.socket, "sendmsg")
3778@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003779class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3780 pass
3781
3782@requireAttrs(socket.socket, "recvmsg")
3783@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003784class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3785 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003786
3787 def testRecvmsgEOF(self):
3788 try:
3789 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3790 except OSError as e:
3791 if e.errno != errno.ENOTCONN:
3792 raise
3793 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003794
3795@requireAttrs(socket.socket, "recvmsg_into")
3796@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003797class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3798 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003799
3800 def testRecvmsgEOF(self):
3801 try:
3802 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3803 except OSError as e:
3804 if e.errno != errno.ENOTCONN:
3805 raise
3806 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003807
3808
3809class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3810 ConnectedStreamTestMixin, UnixStreamBase):
3811 pass
3812
3813@requireAttrs(socket.socket, "sendmsg")
3814@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003815class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3816 pass
3817
3818@requireAttrs(socket.socket, "recvmsg")
3819@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003820class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3821 SendrecvmsgUnixStreamTestBase):
3822 pass
3823
3824@requireAttrs(socket.socket, "recvmsg_into")
3825@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003826class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3827 SendrecvmsgUnixStreamTestBase):
3828 pass
3829
3830@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3831@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003832class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3833 pass
3834
3835@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3836@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003837class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3838 SendrecvmsgUnixStreamTestBase):
3839 pass
3840
3841
3842# Test interrupting the interruptible send/receive methods with a
3843# signal when a timeout is set. These tests avoid having multiple
3844# threads alive during the test so that the OS cannot deliver the
3845# signal to the wrong one.
3846
3847class InterruptedTimeoutBase(unittest.TestCase):
3848 # Base class for interrupted send/receive tests. Installs an
3849 # empty handler for SIGALRM and removes it on teardown, along with
3850 # any scheduled alarms.
3851
3852 def setUp(self):
3853 super().setUp()
3854 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003855 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003856 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003857
3858 # Timeout for socket operations
3859 timeout = 4.0
3860
3861 # Provide setAlarm() method to schedule delivery of SIGALRM after
3862 # given number of seconds, or cancel it if zero, and an
3863 # appropriate time value to use. Use setitimer() if available.
3864 if hasattr(signal, "setitimer"):
3865 alarm_time = 0.05
3866
3867 def setAlarm(self, seconds):
3868 signal.setitimer(signal.ITIMER_REAL, seconds)
3869 else:
3870 # Old systems may deliver the alarm up to one second early
3871 alarm_time = 2
3872
3873 def setAlarm(self, seconds):
3874 signal.alarm(seconds)
3875
3876
3877# Require siginterrupt() in order to ensure that system calls are
3878# interrupted by default.
3879@requireAttrs(signal, "siginterrupt")
3880@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3881 "Don't have signal.alarm or signal.setitimer")
3882class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3883 # Test interrupting the recv*() methods with signals when a
3884 # timeout is set.
3885
3886 def setUp(self):
3887 super().setUp()
3888 self.serv.settimeout(self.timeout)
3889
3890 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003891 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003892 # errno of EINTR when interrupted by a signal.
Victor Stinner9abee722017-09-19 09:36:54 -07003893 try:
3894 self.setAlarm(self.alarm_time)
3895 with self.assertRaises(ZeroDivisionError) as cm:
3896 func(*args, **kwargs)
3897 finally:
3898 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003899
3900 def testInterruptedRecvTimeout(self):
3901 self.checkInterruptedRecv(self.serv.recv, 1024)
3902
3903 def testInterruptedRecvIntoTimeout(self):
3904 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3905
3906 def testInterruptedRecvfromTimeout(self):
3907 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3908
3909 def testInterruptedRecvfromIntoTimeout(self):
3910 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3911
3912 @requireAttrs(socket.socket, "recvmsg")
3913 def testInterruptedRecvmsgTimeout(self):
3914 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3915
3916 @requireAttrs(socket.socket, "recvmsg_into")
3917 def testInterruptedRecvmsgIntoTimeout(self):
3918 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3919
3920
3921# Require siginterrupt() in order to ensure that system calls are
3922# interrupted by default.
3923@requireAttrs(signal, "siginterrupt")
3924@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3925 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003926class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3927 ThreadSafeCleanupTestCase,
3928 SocketListeningTestMixin, TCPTestBase):
3929 # Test interrupting the interruptible send*() methods with signals
3930 # when a timeout is set.
3931
3932 def setUp(self):
3933 super().setUp()
3934 self.serv_conn = self.newSocket()
3935 self.addCleanup(self.serv_conn.close)
3936 # Use a thread to complete the connection, but wait for it to
3937 # terminate before running the test, so that there is only one
3938 # thread to accept the signal.
3939 cli_thread = threading.Thread(target=self.doConnect)
3940 cli_thread.start()
3941 self.cli_conn, addr = self.serv.accept()
3942 self.addCleanup(self.cli_conn.close)
3943 cli_thread.join()
3944 self.serv_conn.settimeout(self.timeout)
3945
3946 def doConnect(self):
3947 self.serv_conn.connect(self.serv_addr)
3948
3949 def checkInterruptedSend(self, func, *args, **kwargs):
3950 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003951 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003952 # signal.
Victor Stinner9abee722017-09-19 09:36:54 -07003953 try:
3954 with self.assertRaises(ZeroDivisionError) as cm:
3955 while True:
3956 self.setAlarm(self.alarm_time)
3957 func(*args, **kwargs)
3958 finally:
3959 self.setAlarm(0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003960
Ned Deilyc5640382014-02-03 13:58:31 -08003961 # Issue #12958: The following tests have problems on OS X prior to 10.7
3962 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003963 def testInterruptedSendTimeout(self):
3964 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3965
Ned Deilyc5640382014-02-03 13:58:31 -08003966 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003967 def testInterruptedSendtoTimeout(self):
3968 # Passing an actual address here as Python's wrapper for
3969 # sendto() doesn't allow passing a zero-length one; POSIX
3970 # requires that the address is ignored since the socket is
3971 # connection-mode, however.
3972 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3973 self.serv_addr)
3974
Ned Deilyc5640382014-02-03 13:58:31 -08003975 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976 @requireAttrs(socket.socket, "sendmsg")
3977 def testInterruptedSendmsgTimeout(self):
3978 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3979
3980
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003981class TCPCloserTest(ThreadedTCPSocketTest):
3982
3983 def testClose(self):
3984 conn, addr = self.serv.accept()
3985 conn.close()
3986
3987 sd = self.cli
3988 read, write, err = select.select([sd], [], [], 1.0)
3989 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003990 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003991
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003992 # Calling close() many times should be safe.
3993 conn.close()
3994 conn.close()
3995
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003996 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003997 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003998 time.sleep(1.0)
3999
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004000
Dave Cole331708b2004-08-09 04:51:41 +00004001class BasicSocketPairTest(SocketPairTest):
4002
4003 def __init__(self, methodName='runTest'):
4004 SocketPairTest.__init__(self, methodName=methodName)
4005
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004006 def _check_defaults(self, sock):
4007 self.assertIsInstance(sock, socket.socket)
4008 if hasattr(socket, 'AF_UNIX'):
4009 self.assertEqual(sock.family, socket.AF_UNIX)
4010 else:
4011 self.assertEqual(sock.family, socket.AF_INET)
4012 self.assertEqual(sock.type, socket.SOCK_STREAM)
4013 self.assertEqual(sock.proto, 0)
4014
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004015 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004016 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004017
4018 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004019 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004020
Dave Cole331708b2004-08-09 04:51:41 +00004021 def testRecv(self):
4022 msg = self.serv.recv(1024)
4023 self.assertEqual(msg, MSG)
4024
4025 def _testRecv(self):
4026 self.cli.send(MSG)
4027
4028 def testSend(self):
4029 self.serv.send(MSG)
4030
4031 def _testSend(self):
4032 msg = self.cli.recv(1024)
4033 self.assertEqual(msg, MSG)
4034
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004035
Guido van Rossum24e4af82002-06-12 19:18:08 +00004036class NonBlockingTCPTests(ThreadedTCPSocketTest):
4037
4038 def __init__(self, methodName='runTest'):
4039 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4040
4041 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004042 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004043 self.serv.setblocking(True)
4044 self.assertIsNone(self.serv.gettimeout())
4045 self.serv.setblocking(False)
4046 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004047 start = time.time()
4048 try:
4049 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004050 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004051 pass
4052 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004053 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004054
4055 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004056 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004057
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004058 @support.cpython_only
4059 def testSetBlocking_overflow(self):
4060 # Issue 15989
4061 import _testcapi
4062 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4063 self.skipTest('needs UINT_MAX < ULONG_MAX')
4064 self.serv.setblocking(False)
4065 self.assertEqual(self.serv.gettimeout(), 0.0)
4066 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4067 self.assertIsNone(self.serv.gettimeout())
4068
4069 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4070
Serhiy Storchaka43767632013-11-03 21:31:38 +02004071 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4072 'test needs socket.SOCK_NONBLOCK')
4073 @support.requires_linux_version(2, 6, 28)
4074 def testInitNonBlocking(self):
4075 # reinit server socket
4076 self.serv.close()
4077 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4078 socket.SOCK_NONBLOCK)
4079 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004080 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004081 # actual testing
4082 start = time.time()
4083 try:
4084 self.serv.accept()
4085 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004086 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004087 end = time.time()
4088 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4089
4090 def _testInitNonBlocking(self):
4091 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004092
Antoine Pitrou600232b2011-01-05 21:03:42 +00004093 def testInheritFlags(self):
4094 # Issue #7995: when calling accept() on a listening socket with a
4095 # timeout, the resulting socket should not be non-blocking.
4096 self.serv.settimeout(10)
4097 try:
4098 conn, addr = self.serv.accept()
4099 message = conn.recv(len(MSG))
4100 finally:
4101 conn.close()
4102 self.serv.settimeout(None)
4103
4104 def _testInheritFlags(self):
4105 time.sleep(0.1)
4106 self.cli.connect((HOST, self.port))
4107 time.sleep(0.5)
4108 self.cli.send(MSG)
4109
Guido van Rossum24e4af82002-06-12 19:18:08 +00004110 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004111 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004112 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004113 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004114 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004115 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004116 pass
4117 else:
4118 self.fail("Error trying to do non-blocking accept.")
4119 read, write, err = select.select([self.serv], [], [])
4120 if self.serv in read:
4121 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004122 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004123 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004124 else:
4125 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004126
Guido van Rossum24e4af82002-06-12 19:18:08 +00004127 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004128 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004129 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004130
4131 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004132 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004133 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004134 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004135
4136 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004137 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004138 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004139
4140 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004141 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004142 conn, addr = self.serv.accept()
4143 conn.setblocking(0)
4144 try:
4145 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004146 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004147 pass
4148 else:
4149 self.fail("Error trying to do non-blocking recv.")
4150 read, write, err = select.select([conn], [], [])
4151 if conn in read:
4152 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004153 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004154 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004155 else:
4156 self.fail("Error during select call to non-blocking socket.")
4157
4158 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004159 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004160 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004161 self.cli.send(MSG)
4162
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004163
Guido van Rossum24e4af82002-06-12 19:18:08 +00004164class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004165 """Unit tests for the object returned by socket.makefile()
4166
Antoine Pitrou834bd812010-10-13 16:17:14 +00004167 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004168 the client connection. You can read from this file to
4169 get output from the server.
4170
Antoine Pitrou834bd812010-10-13 16:17:14 +00004171 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004172 server connection. You can write to this file to send output
4173 to the client.
4174 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004175
Guido van Rossume9f66142002-08-07 15:46:19 +00004176 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004177 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004178 errors = 'strict'
4179 newline = None
4180
4181 read_mode = 'rb'
4182 read_msg = MSG
4183 write_mode = 'wb'
4184 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004185
Guido van Rossum24e4af82002-06-12 19:18:08 +00004186 def __init__(self, methodName='runTest'):
4187 SocketConnectedTest.__init__(self, methodName=methodName)
4188
4189 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004190 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4191 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004192 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004193 self.read_file = self.cli_conn.makefile(
4194 self.read_mode, self.bufsize,
4195 encoding = self.encoding,
4196 errors = self.errors,
4197 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004198
4199 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004200 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004201 self.read_file.close()
4202 self.assertTrue(self.read_file.closed)
4203 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004204 SocketConnectedTest.tearDown(self)
4205
4206 def clientSetUp(self):
4207 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004208 self.write_file = self.serv_conn.makefile(
4209 self.write_mode, self.bufsize,
4210 encoding = self.encoding,
4211 errors = self.errors,
4212 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004213
4214 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004215 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004216 self.write_file.close()
4217 self.assertTrue(self.write_file.closed)
4218 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004219 SocketConnectedTest.clientTearDown(self)
4220
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004221 def testReadAfterTimeout(self):
4222 # Issue #7322: A file object must disallow further reads
4223 # after a timeout has occurred.
4224 self.cli_conn.settimeout(1)
4225 self.read_file.read(3)
4226 # First read raises a timeout
4227 self.assertRaises(socket.timeout, self.read_file.read, 1)
4228 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004229 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004230 self.read_file.read(1)
4231 self.assertIn("cannot read from timed out object", str(ctx.exception))
4232
4233 def _testReadAfterTimeout(self):
4234 self.write_file.write(self.write_msg[0:3])
4235 self.write_file.flush()
4236 self.serv_finished.wait()
4237
Guido van Rossum24e4af82002-06-12 19:18:08 +00004238 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004239 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004240 first_seg = self.read_file.read(len(self.read_msg)-3)
4241 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004242 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004243 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004244
4245 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004246 self.write_file.write(self.write_msg)
4247 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004248
Guido van Rossum8c943832002-08-08 01:00:28 +00004249 def testFullRead(self):
4250 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004251 msg = self.read_file.read()
4252 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004253
4254 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004255 self.write_file.write(self.write_msg)
4256 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004257
Guido van Rossum24e4af82002-06-12 19:18:08 +00004258 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004259 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004260 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004261 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004262 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004263 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004264 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004265 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004266 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004267
4268 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004269 self.write_file.write(self.write_msg)
4270 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004271
4272 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004273 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004274 line = self.read_file.readline()
4275 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004276
4277 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004278 self.write_file.write(self.write_msg)
4279 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004280
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004281 def testCloseAfterMakefile(self):
4282 # The file returned by makefile should keep the socket open.
4283 self.cli_conn.close()
4284 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004285 msg = self.read_file.read()
4286 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004287
4288 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004289 self.write_file.write(self.write_msg)
4290 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004291
4292 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004293 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004294 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004295 if isinstance(self.read_msg, str):
4296 msg = msg.decode()
4297 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004298
4299 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004300 self.write_file.write(self.write_msg)
4301 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004302
Tim Peters116d83c2004-03-28 02:20:45 +00004303 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004304 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004305
4306 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004307 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004308
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004309 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004310 self.assertEqual(self.read_file.mode, self.read_mode)
4311 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004312
4313 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004314 self.assertEqual(self.write_file.mode, self.write_mode)
4315 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004316
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004317 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004318 self.read_file.close()
4319 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004320 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004321 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004322
4323 def _testRealClose(self):
4324 pass
4325
4326
Guido van Rossume9f66142002-08-07 15:46:19 +00004327class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4328
4329 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004330
Guido van Rossume9f66142002-08-07 15:46:19 +00004331 In this case (and in this case only), it should be possible to
4332 create a file object, read a line from it, create another file
4333 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004334 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004335 when reading multiple requests from the same socket."""
4336
4337 bufsize = 0 # Use unbuffered mode
4338
4339 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004340 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004341 line = self.read_file.readline() # first line
4342 self.assertEqual(line, b"A. " + self.write_msg) # first line
4343 self.read_file = self.cli_conn.makefile('rb', 0)
4344 line = self.read_file.readline() # second line
4345 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004346
4347 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004348 self.write_file.write(b"A. " + self.write_msg)
4349 self.write_file.write(b"B. " + self.write_msg)
4350 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004351
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004352 def testMakefileClose(self):
4353 # The file returned by makefile should keep the socket open...
4354 self.cli_conn.close()
4355 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004356 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004357 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004358 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004359 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004360
4361 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004362 self.write_file.write(self.write_msg)
4363 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004364
4365 def testMakefileCloseSocketDestroy(self):
4366 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004367 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004368 refcount_after = sys.getrefcount(self.cli_conn)
4369 self.assertEqual(refcount_before - 1, refcount_after)
4370
4371 def _testMakefileCloseSocketDestroy(self):
4372 pass
4373
Antoine Pitrou98b46702010-09-18 22:59:00 +00004374 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004375 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004376 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4377
4378 def testSmallReadNonBlocking(self):
4379 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004380 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4381 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004382 self.evt1.set()
4383 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004384 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004385 if first_seg is None:
4386 # Data not arrived (can happen under Windows), wait a bit
4387 time.sleep(0.5)
4388 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004389 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004390 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004391 self.assertEqual(n, 3)
4392 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004393 self.assertEqual(msg, self.read_msg)
4394 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4395 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004396
4397 def _testSmallReadNonBlocking(self):
4398 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004399 self.write_file.write(self.write_msg)
4400 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004401 self.evt2.set()
4402 # Avoid cloding the socket before the server test has finished,
4403 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4404 self.serv_finished.wait(5.0)
4405
4406 def testWriteNonBlocking(self):
4407 self.cli_finished.wait(5.0)
4408 # The client thread can't skip directly - the SkipTest exception
4409 # would appear as a failure.
4410 if self.serv_skipped:
4411 self.skipTest(self.serv_skipped)
4412
4413 def _testWriteNonBlocking(self):
4414 self.serv_skipped = None
4415 self.serv_conn.setblocking(False)
4416 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004417 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004418 LIMIT = 10
4419 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004420 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004421 self.assertGreater(n, 0)
4422 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004423 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004424 if n is None:
4425 # Succeeded
4426 break
4427 self.assertGreater(n, 0)
4428 else:
4429 # Let us know that this test didn't manage to establish
4430 # the expected conditions. This is not a failure in itself but,
4431 # if it happens repeatedly, the test should be fixed.
4432 self.serv_skipped = "failed to saturate the socket buffer"
4433
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004434
Guido van Rossum8c943832002-08-08 01:00:28 +00004435class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4436
4437 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4438
4439
4440class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4441
4442 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004443
Thomas Woutersb2137042007-02-01 18:02:27 +00004444
Antoine Pitrou834bd812010-10-13 16:17:14 +00004445class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4446 """Tests for socket.makefile() in text mode (rather than binary)"""
4447
4448 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004449 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004450 write_mode = 'wb'
4451 write_msg = MSG
4452 newline = ''
4453
4454
4455class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4456 """Tests for socket.makefile() in text mode (rather than binary)"""
4457
4458 read_mode = 'rb'
4459 read_msg = MSG
4460 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004461 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004462 newline = ''
4463
4464
4465class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4466 """Tests for socket.makefile() in text mode (rather than binary)"""
4467
4468 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004469 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004470 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004471 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004472 newline = ''
4473
4474
Guido van Rossumd8faa362007-04-27 19:54:29 +00004475class NetworkConnectionTest(object):
4476 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004477
Guido van Rossumd8faa362007-04-27 19:54:29 +00004478 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004479 # We're inherited below by BasicTCPTest2, which also inherits
4480 # BasicTCPTest, which defines self.port referenced below.
4481 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004482 self.serv_conn = self.cli
4483
4484class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4485 """Tests that NetworkConnection does not break existing TCP functionality.
4486 """
4487
4488class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004489
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004490 class MockSocket(socket.socket):
4491 def connect(self, *args):
4492 raise socket.timeout('timed out')
4493
4494 @contextlib.contextmanager
4495 def mocked_socket_module(self):
4496 """Return a socket which times out on connect"""
4497 old_socket = socket.socket
4498 socket.socket = self.MockSocket
4499 try:
4500 yield
4501 finally:
4502 socket.socket = old_socket
4503
4504 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004505 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004506 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004507 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004508 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004509 cli.connect((HOST, port))
4510 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4511
4512 def test_create_connection(self):
4513 # Issue #9792: errors raised by create_connection() should have
4514 # a proper errno attribute.
4515 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004516 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004517 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004518
4519 # Issue #16257: create_connection() calls getaddrinfo() against
4520 # 'localhost'. This may result in an IPV6 addr being returned
4521 # as well as an IPV4 one:
4522 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4523 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4524 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4525 #
4526 # create_connection() enumerates through all the addresses returned
4527 # and if it doesn't successfully bind to any of them, it propagates
4528 # the last exception it encountered.
4529 #
4530 # On Solaris, ENETUNREACH is returned in this circumstance instead
4531 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4532 # expected errnos.
4533 expected_errnos = [ errno.ECONNREFUSED, ]
4534 if hasattr(errno, 'ENETUNREACH'):
4535 expected_errnos.append(errno.ENETUNREACH)
Victor Stinner280c22a2017-10-31 19:48:14 -07004536 if hasattr(errno, 'EADDRNOTAVAIL'):
4537 # bpo-31910: socket.create_connection() fails randomly
4538 # with EADDRNOTAVAIL on Travis CI
4539 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson45bb6132012-10-17 06:15:15 -04004540
4541 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004542
4543 def test_create_connection_timeout(self):
4544 # Issue #9792: create_connection() should not recast timeout errors
4545 # as generic socket errors.
4546 with self.mocked_socket_module():
4547 with self.assertRaises(socket.timeout):
4548 socket.create_connection((HOST, 1234))
4549
Guido van Rossumd8faa362007-04-27 19:54:29 +00004550
4551class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4552
4553 def __init__(self, methodName='runTest'):
4554 SocketTCPTest.__init__(self, methodName=methodName)
4555 ThreadableTest.__init__(self)
4556
4557 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004558 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004559
4560 def clientTearDown(self):
4561 self.cli.close()
4562 self.cli = None
4563 ThreadableTest.clientTearDown(self)
4564
4565 def _justAccept(self):
4566 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004567 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004568
4569 testFamily = _justAccept
4570 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004571 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004572 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004573 self.assertEqual(self.cli.family, 2)
4574
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004575 testSourceAddress = _justAccept
4576 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004577 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4578 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004579 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004580 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004581 # The port number being used is sufficient to show that the bind()
4582 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004583
Guido van Rossumd8faa362007-04-27 19:54:29 +00004584 testTimeoutDefault = _justAccept
4585 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004586 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004587 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004588 socket.setdefaulttimeout(42)
4589 try:
4590 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004591 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004592 finally:
4593 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004594 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004595
4596 testTimeoutNone = _justAccept
4597 def _testTimeoutNone(self):
4598 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004599 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004600 socket.setdefaulttimeout(30)
4601 try:
4602 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004603 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004604 finally:
4605 socket.setdefaulttimeout(None)
4606 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004607
4608 testTimeoutValueNamed = _justAccept
4609 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004610 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004611 self.assertEqual(self.cli.gettimeout(), 30)
4612
4613 testTimeoutValueNonamed = _justAccept
4614 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004615 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004616 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004617 self.assertEqual(self.cli.gettimeout(), 30)
4618
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004619
Guido van Rossumd8faa362007-04-27 19:54:29 +00004620class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4621
4622 def __init__(self, methodName='runTest'):
4623 SocketTCPTest.__init__(self, methodName=methodName)
4624 ThreadableTest.__init__(self)
4625
4626 def clientSetUp(self):
4627 pass
4628
4629 def clientTearDown(self):
4630 self.cli.close()
4631 self.cli = None
4632 ThreadableTest.clientTearDown(self)
4633
4634 def testInsideTimeout(self):
4635 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004636 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004637 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004638 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004639 testOutsideTimeout = testInsideTimeout
4640
4641 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004642 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004643 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004644 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004645
4646 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004647 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004648 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004649
4650
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004651class TCPTimeoutTest(SocketTCPTest):
4652
4653 def testTCPTimeout(self):
4654 def raise_timeout(*args, **kwargs):
4655 self.serv.settimeout(1.0)
4656 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004657 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004658 "Error generating a timeout exception (TCP)")
4659
4660 def testTimeoutZero(self):
4661 ok = False
4662 try:
4663 self.serv.settimeout(0.0)
4664 foo = self.serv.accept()
4665 except socket.timeout:
4666 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004667 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004668 ok = True
4669 except:
4670 self.fail("caught unexpected exception (TCP)")
4671 if not ok:
4672 self.fail("accept() returned success when we did not expect it")
4673
Serhiy Storchaka43767632013-11-03 21:31:38 +02004674 @unittest.skipUnless(hasattr(signal, 'alarm'),
4675 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004676 def testInterruptedTimeout(self):
4677 # XXX I don't know how to do this test on MSWindows or any other
4678 # plaform that doesn't support signal.alarm() or os.kill(), though
4679 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004680 self.serv.settimeout(5.0) # must be longer than alarm
4681 class Alarm(Exception):
4682 pass
4683 def alarm_handler(signal, frame):
4684 raise Alarm
4685 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4686 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004687 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004688 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004689 foo = self.serv.accept()
4690 except socket.timeout:
4691 self.fail("caught timeout instead of Alarm")
4692 except Alarm:
4693 pass
4694 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004695 self.fail("caught other exception instead of Alarm:"
4696 " %s(%s):\n%s" %
4697 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004698 else:
4699 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004700 finally:
4701 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004702 except Alarm:
4703 self.fail("got Alarm in wrong place")
4704 finally:
4705 # no alarm can be pending. Safe to restore old handler.
4706 signal.signal(signal.SIGALRM, old_alarm)
4707
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004708class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004709
4710 def testUDPTimeout(self):
4711 def raise_timeout(*args, **kwargs):
4712 self.serv.settimeout(1.0)
4713 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004714 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004715 "Error generating a timeout exception (UDP)")
4716
4717 def testTimeoutZero(self):
4718 ok = False
4719 try:
4720 self.serv.settimeout(0.0)
4721 foo = self.serv.recv(1024)
4722 except socket.timeout:
4723 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004724 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004725 ok = True
4726 except:
4727 self.fail("caught unexpected exception (UDP)")
4728 if not ok:
4729 self.fail("recv() returned success when we did not expect it")
4730
4731class TestExceptions(unittest.TestCase):
4732
4733 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004734 self.assertTrue(issubclass(OSError, Exception))
4735 self.assertTrue(issubclass(socket.herror, OSError))
4736 self.assertTrue(issubclass(socket.gaierror, OSError))
4737 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004738
Yury Selivanovfa22b292016-10-18 16:03:52 -04004739 def test_setblocking_invalidfd(self):
4740 # Regression test for issue #28471
4741
4742 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4743 sock = socket.socket(
4744 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4745 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004746 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004747
4748 with self.assertRaises(OSError):
4749 sock.setblocking(False)
4750
4751
Serhiy Storchaka43767632013-11-03 21:31:38 +02004752@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004753class TestLinuxAbstractNamespace(unittest.TestCase):
4754
4755 UNIX_PATH_MAX = 108
4756
4757 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004758 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004759 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4760 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004761 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004762 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4763 s2.connect(s1.getsockname())
4764 with s1.accept()[0] as s3:
4765 self.assertEqual(s1.getsockname(), address)
4766 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004767
4768 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004769 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004770 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4771 s.bind(address)
4772 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004773
4774 def testNameOverflow(self):
4775 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004776 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004777 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004778
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004779 def testStrName(self):
4780 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004781 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4782 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004783 s.bind("\x00python\x00test\x00")
4784 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004785 finally:
4786 s.close()
4787
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004788 def testBytearrayName(self):
4789 # Check that an abstract name can be passed as a bytearray.
4790 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4791 s.bind(bytearray(b"\x00python\x00test\x00"))
4792 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4793
Serhiy Storchaka43767632013-11-03 21:31:38 +02004794@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004795class TestUnixDomain(unittest.TestCase):
4796
4797 def setUp(self):
4798 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4799
4800 def tearDown(self):
4801 self.sock.close()
4802
4803 def encoded(self, path):
4804 # Return the given path encoded in the file system encoding,
4805 # or skip the test if this is not possible.
4806 try:
4807 return os.fsencode(path)
4808 except UnicodeEncodeError:
4809 self.skipTest(
4810 "Pathname {0!a} cannot be represented in file "
4811 "system encoding {1!r}".format(
4812 path, sys.getfilesystemencoding()))
4813
Antoine Pitrou16374872011-12-16 15:04:12 +01004814 def bind(self, sock, path):
4815 # Bind the socket
4816 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004817 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004818 except OSError as e:
4819 if str(e) == "AF_UNIX path too long":
4820 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004821 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004822 .format(path))
4823 else:
4824 raise
4825
Antoine Pitrou495b5022017-05-02 17:20:00 +02004826 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004827 # Issue #30205 (note getsockname() can return None on OS X)
4828 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004829
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004830 def testStrAddr(self):
4831 # Test binding to and retrieving a normal string pathname.
4832 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004833 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004834 self.addCleanup(support.unlink, path)
4835 self.assertEqual(self.sock.getsockname(), path)
4836
4837 def testBytesAddr(self):
4838 # Test binding to a bytes pathname.
4839 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004840 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004841 self.addCleanup(support.unlink, path)
4842 self.assertEqual(self.sock.getsockname(), path)
4843
4844 def testSurrogateescapeBind(self):
4845 # Test binding to a valid non-ASCII pathname, with the
4846 # non-ASCII bytes supplied using surrogateescape encoding.
4847 path = os.path.abspath(support.TESTFN_UNICODE)
4848 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004849 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004850 self.addCleanup(support.unlink, path)
4851 self.assertEqual(self.sock.getsockname(), path)
4852
4853 def testUnencodableAddr(self):
4854 # Test binding to a pathname that cannot be encoded in the
4855 # file system encoding.
4856 if support.TESTFN_UNENCODABLE is None:
4857 self.skipTest("No unencodable filename available")
4858 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004859 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004860 self.addCleanup(support.unlink, path)
4861 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004862
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004863
Thomas Wouters477c8d52006-05-27 19:21:47 +00004864class BufferIOTest(SocketConnectedTest):
4865 """
4866 Test the buffer versions of socket.recv() and socket.send().
4867 """
4868 def __init__(self, methodName='runTest'):
4869 SocketConnectedTest.__init__(self, methodName=methodName)
4870
Antoine Pitrou25480782010-03-17 22:50:28 +00004871 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004872 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004873 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004874 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004875 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004876 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004877 self.assertEqual(msg, MSG)
4878
Antoine Pitrou25480782010-03-17 22:50:28 +00004879 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004880 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004881 self.serv_conn.send(buf)
4882
Antoine Pitrou25480782010-03-17 22:50:28 +00004883 def testRecvIntoBytearray(self):
4884 buf = bytearray(1024)
4885 nbytes = self.cli_conn.recv_into(buf)
4886 self.assertEqual(nbytes, len(MSG))
4887 msg = buf[:len(MSG)]
4888 self.assertEqual(msg, MSG)
4889
4890 _testRecvIntoBytearray = _testRecvIntoArray
4891
4892 def testRecvIntoMemoryview(self):
4893 buf = bytearray(1024)
4894 nbytes = self.cli_conn.recv_into(memoryview(buf))
4895 self.assertEqual(nbytes, len(MSG))
4896 msg = buf[:len(MSG)]
4897 self.assertEqual(msg, MSG)
4898
4899 _testRecvIntoMemoryview = _testRecvIntoArray
4900
4901 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004902 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004903 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004904 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004905 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004906 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004907 self.assertEqual(msg, MSG)
4908
Antoine Pitrou25480782010-03-17 22:50:28 +00004909 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004910 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004911 self.serv_conn.send(buf)
4912
Antoine Pitrou25480782010-03-17 22:50:28 +00004913 def testRecvFromIntoBytearray(self):
4914 buf = bytearray(1024)
4915 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4916 self.assertEqual(nbytes, len(MSG))
4917 msg = buf[:len(MSG)]
4918 self.assertEqual(msg, MSG)
4919
4920 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4921
4922 def testRecvFromIntoMemoryview(self):
4923 buf = bytearray(1024)
4924 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4925 self.assertEqual(nbytes, len(MSG))
4926 msg = buf[:len(MSG)]
4927 self.assertEqual(msg, MSG)
4928
4929 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4930
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004931 def testRecvFromIntoSmallBuffer(self):
4932 # See issue #20246.
4933 buf = bytearray(8)
4934 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4935
4936 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004937 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004938
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004939 def testRecvFromIntoEmptyBuffer(self):
4940 buf = bytearray()
4941 self.cli_conn.recvfrom_into(buf)
4942 self.cli_conn.recvfrom_into(buf, 0)
4943
4944 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4945
Christian Heimes043d6f62008-01-07 17:19:16 +00004946
4947TIPC_STYPE = 2000
4948TIPC_LOWER = 200
4949TIPC_UPPER = 210
4950
4951def isTipcAvailable():
4952 """Check if the TIPC module is loaded
4953
4954 The TIPC module is not loaded automatically on Ubuntu and probably
4955 other Linux distros.
4956 """
4957 if not hasattr(socket, "AF_TIPC"):
4958 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004959 try:
4960 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004961 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004962 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004963 # have not the permission to read it.
4964 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004965 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004966 for line in f:
4967 if line.startswith("tipc "):
4968 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004969 return False
4970
Serhiy Storchaka43767632013-11-03 21:31:38 +02004971@unittest.skipUnless(isTipcAvailable(),
4972 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004973class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004974 def testRDM(self):
4975 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4976 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004977 self.addCleanup(srv.close)
4978 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004979
4980 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4981 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4982 TIPC_LOWER, TIPC_UPPER)
4983 srv.bind(srvaddr)
4984
4985 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4986 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4987 cli.sendto(MSG, sendaddr)
4988
4989 msg, recvaddr = srv.recvfrom(1024)
4990
4991 self.assertEqual(cli.getsockname(), recvaddr)
4992 self.assertEqual(msg, MSG)
4993
4994
Serhiy Storchaka43767632013-11-03 21:31:38 +02004995@unittest.skipUnless(isTipcAvailable(),
4996 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004997class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004998 def __init__(self, methodName = 'runTest'):
4999 unittest.TestCase.__init__(self, methodName = methodName)
5000 ThreadableTest.__init__(self)
5001
5002 def setUp(self):
5003 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005004 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005005 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5006 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5007 TIPC_LOWER, TIPC_UPPER)
5008 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005009 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005010 self.serverExplicitReady()
5011 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005012 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005013
5014 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005015 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005016 # accept() call; sleep a little while to avoid it, otherwise
5017 # we could get an exception
5018 time.sleep(0.1)
5019 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005020 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005021 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5022 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5023 self.cli.connect(addr)
5024 self.cliaddr = self.cli.getsockname()
5025
5026 def testStream(self):
5027 msg = self.conn.recv(1024)
5028 self.assertEqual(msg, MSG)
5029 self.assertEqual(self.cliaddr, self.connaddr)
5030
5031 def _testStream(self):
5032 self.cli.send(MSG)
5033 self.cli.close()
5034
5035
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005036class ContextManagersTest(ThreadedTCPSocketTest):
5037
5038 def _testSocketClass(self):
5039 # base test
5040 with socket.socket() as sock:
5041 self.assertFalse(sock._closed)
5042 self.assertTrue(sock._closed)
5043 # close inside with block
5044 with socket.socket() as sock:
5045 sock.close()
5046 self.assertTrue(sock._closed)
5047 # exception inside with block
5048 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005049 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005050 self.assertTrue(sock._closed)
5051
5052 def testCreateConnectionBase(self):
5053 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005054 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005055 data = conn.recv(1024)
5056 conn.sendall(data)
5057
5058 def _testCreateConnectionBase(self):
5059 address = self.serv.getsockname()
5060 with socket.create_connection(address) as sock:
5061 self.assertFalse(sock._closed)
5062 sock.sendall(b'foo')
5063 self.assertEqual(sock.recv(1024), b'foo')
5064 self.assertTrue(sock._closed)
5065
5066 def testCreateConnectionClose(self):
5067 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005068 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005069 data = conn.recv(1024)
5070 conn.sendall(data)
5071
5072 def _testCreateConnectionClose(self):
5073 address = self.serv.getsockname()
5074 with socket.create_connection(address) as sock:
5075 sock.close()
5076 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005077 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005078
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005079
Victor Stinnerdaf45552013-08-28 00:53:59 +02005080class InheritanceTest(unittest.TestCase):
5081 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5082 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005083 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005084 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005085 with socket.socket(socket.AF_INET,
5086 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
5087 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005088 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005089
5090 def test_default_inheritable(self):
5091 sock = socket.socket()
5092 with sock:
5093 self.assertEqual(sock.get_inheritable(), False)
5094
5095 def test_dup(self):
5096 sock = socket.socket()
5097 with sock:
5098 newsock = sock.dup()
5099 sock.close()
5100 with newsock:
5101 self.assertEqual(newsock.get_inheritable(), False)
5102
5103 def test_set_inheritable(self):
5104 sock = socket.socket()
5105 with sock:
5106 sock.set_inheritable(True)
5107 self.assertEqual(sock.get_inheritable(), True)
5108
5109 sock.set_inheritable(False)
5110 self.assertEqual(sock.get_inheritable(), False)
5111
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005112 @unittest.skipIf(fcntl is None, "need fcntl")
5113 def test_get_inheritable_cloexec(self):
5114 sock = socket.socket()
5115 with sock:
5116 fd = sock.fileno()
5117 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005118
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005119 # clear FD_CLOEXEC flag
5120 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5121 flags &= ~fcntl.FD_CLOEXEC
5122 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005123
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005124 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005125
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005126 @unittest.skipIf(fcntl is None, "need fcntl")
5127 def test_set_inheritable_cloexec(self):
5128 sock = socket.socket()
5129 with sock:
5130 fd = sock.fileno()
5131 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5132 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005133
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005134 sock.set_inheritable(True)
5135 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5136 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005137
5138
Victor Stinnerdaf45552013-08-28 00:53:59 +02005139 @unittest.skipUnless(hasattr(socket, "socketpair"),
5140 "need socket.socketpair()")
5141 def test_socketpair(self):
5142 s1, s2 = socket.socketpair()
5143 self.addCleanup(s1.close)
5144 self.addCleanup(s2.close)
5145 self.assertEqual(s1.get_inheritable(), False)
5146 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005147
5148
5149@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5150 "SOCK_NONBLOCK not defined")
5151class NonblockConstantTest(unittest.TestCase):
5152 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5153 if nonblock:
5154 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5155 self.assertEqual(s.gettimeout(), timeout)
5156 else:
5157 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5158 self.assertEqual(s.gettimeout(), None)
5159
Charles-François Natali239bb962011-06-03 12:55:15 +02005160 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005161 def test_SOCK_NONBLOCK(self):
5162 # a lot of it seems silly and redundant, but I wanted to test that
5163 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005164 with socket.socket(socket.AF_INET,
5165 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5166 self.checkNonblock(s)
5167 s.setblocking(1)
5168 self.checkNonblock(s, False)
5169 s.setblocking(0)
5170 self.checkNonblock(s)
5171 s.settimeout(None)
5172 self.checkNonblock(s, False)
5173 s.settimeout(2.0)
5174 self.checkNonblock(s, timeout=2.0)
5175 s.setblocking(1)
5176 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005177 # defaulttimeout
5178 t = socket.getdefaulttimeout()
5179 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005180 with socket.socket() as s:
5181 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005182 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005183 with socket.socket() as s:
5184 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005185 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005186 with socket.socket() as s:
5187 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005188 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005189 with socket.socket() as s:
5190 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005191 socket.setdefaulttimeout(t)
5192
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005193
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005194@unittest.skipUnless(os.name == "nt", "Windows specific")
5195@unittest.skipUnless(multiprocessing, "need multiprocessing")
5196class TestSocketSharing(SocketTCPTest):
5197 # This must be classmethod and not staticmethod or multiprocessing
5198 # won't be able to bootstrap it.
5199 @classmethod
5200 def remoteProcessServer(cls, q):
5201 # Recreate socket from shared data
5202 sdata = q.get()
5203 message = q.get()
5204
5205 s = socket.fromshare(sdata)
5206 s2, c = s.accept()
5207
5208 # Send the message
5209 s2.sendall(message)
5210 s2.close()
5211 s.close()
5212
5213 def testShare(self):
5214 # Transfer the listening server socket to another process
5215 # and service it from there.
5216
5217 # Create process:
5218 q = multiprocessing.Queue()
5219 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5220 p.start()
5221
5222 # Get the shared socket data
5223 data = self.serv.share(p.pid)
5224
5225 # Pass the shared socket to the other process
5226 addr = self.serv.getsockname()
5227 self.serv.close()
5228 q.put(data)
5229
5230 # The data that the server will send us
5231 message = b"slapmahfro"
5232 q.put(message)
5233
5234 # Connect
5235 s = socket.create_connection(addr)
5236 # listen for the data
5237 m = []
5238 while True:
5239 data = s.recv(100)
5240 if not data:
5241 break
5242 m.append(data)
5243 s.close()
5244 received = b"".join(m)
5245 self.assertEqual(received, message)
5246 p.join()
5247
5248 def testShareLength(self):
5249 data = self.serv.share(os.getpid())
5250 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5251 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5252
5253 def compareSockets(self, org, other):
5254 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005255 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005256 self.assertEqual(org.gettimeout(), None)
5257 self.assertEqual(org.gettimeout(), other.gettimeout())
5258
5259 self.assertEqual(org.family, other.family)
5260 self.assertEqual(org.type, other.type)
5261 # If the user specified "0" for proto, then
5262 # internally windows will have picked the correct value.
5263 # Python introspection on the socket however will still return
5264 # 0. For the shared socket, the python value is recreated
5265 # from the actual value, so it may not compare correctly.
5266 if org.proto != 0:
5267 self.assertEqual(org.proto, other.proto)
5268
5269 def testShareLocal(self):
5270 data = self.serv.share(os.getpid())
5271 s = socket.fromshare(data)
5272 try:
5273 self.compareSockets(self.serv, s)
5274 finally:
5275 s.close()
5276
5277 def testTypes(self):
5278 families = [socket.AF_INET, socket.AF_INET6]
5279 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5280 for f in families:
5281 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005282 try:
5283 source = socket.socket(f, t)
5284 except OSError:
5285 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005286 try:
5287 data = source.share(os.getpid())
5288 shared = socket.fromshare(data)
5289 try:
5290 self.compareSockets(source, shared)
5291 finally:
5292 shared.close()
5293 finally:
5294 source.close()
5295
5296
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005297class SendfileUsingSendTest(ThreadedTCPSocketTest):
5298 """
5299 Test the send() implementation of socket.sendfile().
5300 """
5301
5302 FILESIZE = (10 * 1024 * 1024) # 10MB
5303 BUFSIZE = 8192
5304 FILEDATA = b""
5305 TIMEOUT = 2
5306
5307 @classmethod
5308 def setUpClass(cls):
5309 def chunks(total, step):
5310 assert total >= step
5311 while total > step:
5312 yield step
5313 total -= step
5314 if total:
5315 yield total
5316
5317 chunk = b"".join([random.choice(string.ascii_letters).encode()
5318 for i in range(cls.BUFSIZE)])
5319 with open(support.TESTFN, 'wb') as f:
5320 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5321 f.write(chunk)
5322 with open(support.TESTFN, 'rb') as f:
5323 cls.FILEDATA = f.read()
5324 assert len(cls.FILEDATA) == cls.FILESIZE
5325
5326 @classmethod
5327 def tearDownClass(cls):
5328 support.unlink(support.TESTFN)
5329
5330 def accept_conn(self):
5331 self.serv.settimeout(self.TIMEOUT)
5332 conn, addr = self.serv.accept()
5333 conn.settimeout(self.TIMEOUT)
5334 self.addCleanup(conn.close)
5335 return conn
5336
5337 def recv_data(self, conn):
5338 received = []
5339 while True:
5340 chunk = conn.recv(self.BUFSIZE)
5341 if not chunk:
5342 break
5343 received.append(chunk)
5344 return b''.join(received)
5345
5346 def meth_from_sock(self, sock):
5347 # Depending on the mixin class being run return either send()
5348 # or sendfile() method implementation.
5349 return getattr(sock, "_sendfile_use_send")
5350
5351 # regular file
5352
5353 def _testRegularFile(self):
5354 address = self.serv.getsockname()
5355 file = open(support.TESTFN, 'rb')
5356 with socket.create_connection(address) as sock, file as file:
5357 meth = self.meth_from_sock(sock)
5358 sent = meth(file)
5359 self.assertEqual(sent, self.FILESIZE)
5360 self.assertEqual(file.tell(), self.FILESIZE)
5361
5362 def testRegularFile(self):
5363 conn = self.accept_conn()
5364 data = self.recv_data(conn)
5365 self.assertEqual(len(data), self.FILESIZE)
5366 self.assertEqual(data, self.FILEDATA)
5367
5368 # non regular file
5369
5370 def _testNonRegularFile(self):
5371 address = self.serv.getsockname()
5372 file = io.BytesIO(self.FILEDATA)
5373 with socket.create_connection(address) as sock, file as file:
5374 sent = sock.sendfile(file)
5375 self.assertEqual(sent, self.FILESIZE)
5376 self.assertEqual(file.tell(), self.FILESIZE)
5377 self.assertRaises(socket._GiveupOnSendfile,
5378 sock._sendfile_use_sendfile, file)
5379
5380 def testNonRegularFile(self):
5381 conn = self.accept_conn()
5382 data = self.recv_data(conn)
5383 self.assertEqual(len(data), self.FILESIZE)
5384 self.assertEqual(data, self.FILEDATA)
5385
5386 # empty file
5387
5388 def _testEmptyFileSend(self):
5389 address = self.serv.getsockname()
5390 filename = support.TESTFN + "2"
5391 with open(filename, 'wb'):
5392 self.addCleanup(support.unlink, filename)
5393 file = open(filename, 'rb')
5394 with socket.create_connection(address) as sock, file as file:
5395 meth = self.meth_from_sock(sock)
5396 sent = meth(file)
5397 self.assertEqual(sent, 0)
5398 self.assertEqual(file.tell(), 0)
5399
5400 def testEmptyFileSend(self):
5401 conn = self.accept_conn()
5402 data = self.recv_data(conn)
5403 self.assertEqual(data, b"")
5404
5405 # offset
5406
5407 def _testOffset(self):
5408 address = self.serv.getsockname()
5409 file = open(support.TESTFN, 'rb')
5410 with socket.create_connection(address) as sock, file as file:
5411 meth = self.meth_from_sock(sock)
5412 sent = meth(file, offset=5000)
5413 self.assertEqual(sent, self.FILESIZE - 5000)
5414 self.assertEqual(file.tell(), self.FILESIZE)
5415
5416 def testOffset(self):
5417 conn = self.accept_conn()
5418 data = self.recv_data(conn)
5419 self.assertEqual(len(data), self.FILESIZE - 5000)
5420 self.assertEqual(data, self.FILEDATA[5000:])
5421
5422 # count
5423
5424 def _testCount(self):
5425 address = self.serv.getsockname()
5426 file = open(support.TESTFN, 'rb')
5427 with socket.create_connection(address, timeout=2) as sock, file as file:
5428 count = 5000007
5429 meth = self.meth_from_sock(sock)
5430 sent = meth(file, count=count)
5431 self.assertEqual(sent, count)
5432 self.assertEqual(file.tell(), count)
5433
5434 def testCount(self):
5435 count = 5000007
5436 conn = self.accept_conn()
5437 data = self.recv_data(conn)
5438 self.assertEqual(len(data), count)
5439 self.assertEqual(data, self.FILEDATA[:count])
5440
5441 # count small
5442
5443 def _testCountSmall(self):
5444 address = self.serv.getsockname()
5445 file = open(support.TESTFN, 'rb')
5446 with socket.create_connection(address, timeout=2) as sock, file as file:
5447 count = 1
5448 meth = self.meth_from_sock(sock)
5449 sent = meth(file, count=count)
5450 self.assertEqual(sent, count)
5451 self.assertEqual(file.tell(), count)
5452
5453 def testCountSmall(self):
5454 count = 1
5455 conn = self.accept_conn()
5456 data = self.recv_data(conn)
5457 self.assertEqual(len(data), count)
5458 self.assertEqual(data, self.FILEDATA[:count])
5459
5460 # count + offset
5461
5462 def _testCountWithOffset(self):
5463 address = self.serv.getsockname()
5464 file = open(support.TESTFN, 'rb')
5465 with socket.create_connection(address, timeout=2) as sock, file as file:
5466 count = 100007
5467 meth = self.meth_from_sock(sock)
5468 sent = meth(file, offset=2007, count=count)
5469 self.assertEqual(sent, count)
5470 self.assertEqual(file.tell(), count + 2007)
5471
5472 def testCountWithOffset(self):
5473 count = 100007
5474 conn = self.accept_conn()
5475 data = self.recv_data(conn)
5476 self.assertEqual(len(data), count)
5477 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5478
5479 # non blocking sockets are not supposed to work
5480
5481 def _testNonBlocking(self):
5482 address = self.serv.getsockname()
5483 file = open(support.TESTFN, 'rb')
5484 with socket.create_connection(address) as sock, file as file:
5485 sock.setblocking(False)
5486 meth = self.meth_from_sock(sock)
5487 self.assertRaises(ValueError, meth, file)
5488 self.assertRaises(ValueError, sock.sendfile, file)
5489
5490 def testNonBlocking(self):
5491 conn = self.accept_conn()
5492 if conn.recv(8192):
5493 self.fail('was not supposed to receive any data')
5494
5495 # timeout (non-triggered)
5496
5497 def _testWithTimeout(self):
5498 address = self.serv.getsockname()
5499 file = open(support.TESTFN, 'rb')
5500 with socket.create_connection(address, timeout=2) as sock, file as file:
5501 meth = self.meth_from_sock(sock)
5502 sent = meth(file)
5503 self.assertEqual(sent, self.FILESIZE)
5504
5505 def testWithTimeout(self):
5506 conn = self.accept_conn()
5507 data = self.recv_data(conn)
5508 self.assertEqual(len(data), self.FILESIZE)
5509 self.assertEqual(data, self.FILEDATA)
5510
5511 # timeout (triggered)
5512
5513 def _testWithTimeoutTriggeredSend(self):
5514 address = self.serv.getsockname()
5515 file = open(support.TESTFN, 'rb')
5516 with socket.create_connection(address, timeout=0.01) as sock, \
5517 file as file:
5518 meth = self.meth_from_sock(sock)
5519 self.assertRaises(socket.timeout, meth, file)
5520
5521 def testWithTimeoutTriggeredSend(self):
5522 conn = self.accept_conn()
5523 conn.recv(88192)
5524
5525 # errors
5526
5527 def _test_errors(self):
5528 pass
5529
5530 def test_errors(self):
5531 with open(support.TESTFN, 'rb') as file:
5532 with socket.socket(type=socket.SOCK_DGRAM) as s:
5533 meth = self.meth_from_sock(s)
5534 self.assertRaisesRegex(
5535 ValueError, "SOCK_STREAM", meth, file)
5536 with open(support.TESTFN, 'rt') as file:
5537 with socket.socket() as s:
5538 meth = self.meth_from_sock(s)
5539 self.assertRaisesRegex(
5540 ValueError, "binary mode", meth, file)
5541 with open(support.TESTFN, 'rb') as file:
5542 with socket.socket() as s:
5543 meth = self.meth_from_sock(s)
5544 self.assertRaisesRegex(TypeError, "positive integer",
5545 meth, file, count='2')
5546 self.assertRaisesRegex(TypeError, "positive integer",
5547 meth, file, count=0.1)
5548 self.assertRaisesRegex(ValueError, "positive integer",
5549 meth, file, count=0)
5550 self.assertRaisesRegex(ValueError, "positive integer",
5551 meth, file, count=-1)
5552
5553
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005554@unittest.skipUnless(hasattr(os, "sendfile"),
5555 'os.sendfile() required for this test.')
5556class SendfileUsingSendfileTest(SendfileUsingSendTest):
5557 """
5558 Test the sendfile() implementation of socket.sendfile().
5559 """
5560 def meth_from_sock(self, sock):
5561 return getattr(sock, "_sendfile_use_sendfile")
5562
Christian Heimes48371412016-09-06 00:37:46 +02005563
5564@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005565class LinuxKernelCryptoAPI(unittest.TestCase):
5566 # tests for AF_ALG
5567 def create_alg(self, typ, name):
5568 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005569 try:
5570 sock.bind((typ, name))
5571 except FileNotFoundError as e:
5572 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005573 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005574 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005575 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005576 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005577
5578 def test_sha256(self):
5579 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5580 "177a9cb410ff61f20015ad")
5581 with self.create_alg('hash', 'sha256') as algo:
5582 op, _ = algo.accept()
5583 with op:
5584 op.sendall(b"abc")
5585 self.assertEqual(op.recv(512), expected)
5586
5587 op, _ = algo.accept()
5588 with op:
5589 op.send(b'a', socket.MSG_MORE)
5590 op.send(b'b', socket.MSG_MORE)
5591 op.send(b'c', socket.MSG_MORE)
5592 op.send(b'')
5593 self.assertEqual(op.recv(512), expected)
5594
5595 def test_hmac_sha1(self):
5596 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5597 with self.create_alg('hash', 'hmac(sha1)') as algo:
5598 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5599 op, _ = algo.accept()
5600 with op:
5601 op.sendall(b"what do ya want for nothing?")
5602 self.assertEqual(op.recv(512), expected)
5603
Christian Heimese084f842016-09-11 20:11:30 +02005604 # Although it should work with 3.19 and newer the test blocks on
5605 # Ubuntu 15.10 with Kernel 4.2.0-19.
5606 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005607 def test_aes_cbc(self):
5608 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5609 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5610 msg = b"Single block msg"
5611 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5612 msglen = len(msg)
5613 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5614 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5615 op, _ = algo.accept()
5616 with op:
5617 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5618 flags=socket.MSG_MORE)
5619 op.sendall(msg)
5620 self.assertEqual(op.recv(msglen), ciphertext)
5621
5622 op, _ = algo.accept()
5623 with op:
5624 op.sendmsg_afalg([ciphertext],
5625 op=socket.ALG_OP_DECRYPT, iv=iv)
5626 self.assertEqual(op.recv(msglen), msg)
5627
5628 # long message
5629 multiplier = 1024
5630 longmsg = [msg] * multiplier
5631 op, _ = algo.accept()
5632 with op:
5633 op.sendmsg_afalg(longmsg,
5634 op=socket.ALG_OP_ENCRYPT, iv=iv)
5635 enc = op.recv(msglen * multiplier)
5636 self.assertEqual(len(enc), msglen * multiplier)
5637 self.assertTrue(enc[:msglen], ciphertext)
5638
5639 op, _ = algo.accept()
5640 with op:
5641 op.sendmsg_afalg([enc],
5642 op=socket.ALG_OP_DECRYPT, iv=iv)
5643 dec = op.recv(msglen * multiplier)
5644 self.assertEqual(len(dec), msglen * multiplier)
5645 self.assertEqual(dec, msg * multiplier)
5646
matejcik9764c152017-02-16 14:41:31 +01005647 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005648 def test_aead_aes_gcm(self):
5649 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5650 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5651 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5652 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5653 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5654 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5655
5656 taglen = len(expected_tag)
5657 assoclen = len(assoc)
5658
5659 with self.create_alg('aead', 'gcm(aes)') as algo:
5660 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5661 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5662 None, taglen)
5663
5664 # send assoc, plain and tag buffer in separate steps
5665 op, _ = algo.accept()
5666 with op:
5667 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5668 assoclen=assoclen, flags=socket.MSG_MORE)
5669 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005670 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005671 res = op.recv(assoclen + len(plain) + taglen)
5672 self.assertEqual(expected_ct, res[assoclen:-taglen])
5673 self.assertEqual(expected_tag, res[-taglen:])
5674
5675 # now with msg
5676 op, _ = algo.accept()
5677 with op:
matejcik9764c152017-02-16 14:41:31 +01005678 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005679 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5680 assoclen=assoclen)
5681 res = op.recv(assoclen + len(plain) + taglen)
5682 self.assertEqual(expected_ct, res[assoclen:-taglen])
5683 self.assertEqual(expected_tag, res[-taglen:])
5684
5685 # create anc data manually
5686 pack_uint32 = struct.Struct('I').pack
5687 op, _ = algo.accept()
5688 with op:
matejcik9764c152017-02-16 14:41:31 +01005689 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005690 op.sendmsg(
5691 [msg],
5692 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5693 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5694 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5695 )
5696 )
matejcik9764c152017-02-16 14:41:31 +01005697 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005698 self.assertEqual(expected_ct, res[assoclen:-taglen])
5699 self.assertEqual(expected_tag, res[-taglen:])
5700
5701 # decrypt and verify
5702 op, _ = algo.accept()
5703 with op:
5704 msg = assoc + expected_ct + expected_tag
5705 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5706 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005707 res = op.recv(len(msg) - taglen)
5708 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005709
Christian Heimese084f842016-09-11 20:11:30 +02005710 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005711 def test_drbg_pr_sha256(self):
5712 # deterministic random bit generator, prediction resistance, sha256
5713 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5714 extra_seed = os.urandom(32)
5715 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5716 op, _ = algo.accept()
5717 with op:
5718 rn = op.recv(32)
5719 self.assertEqual(len(rn), 32)
5720
5721 def test_sendmsg_afalg_args(self):
5722 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005723 with sock:
5724 with self.assertRaises(TypeError):
5725 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005726
Christian Heimes02b30352016-09-11 19:49:56 +02005727 with self.assertRaises(TypeError):
5728 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005729
Christian Heimes02b30352016-09-11 19:49:56 +02005730 with self.assertRaises(TypeError):
5731 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005732
Christian Heimes02b30352016-09-11 19:49:56 +02005733 with self.assertRaises(TypeError):
5734 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005735
Christian Heimes02b30352016-09-11 19:49:56 +02005736 with self.assertRaises(TypeError):
5737 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5738
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005739
Guido van Rossumb995eb72002-07-31 16:08:40 +00005740def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005741 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005742 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005743
5744 tests.extend([
5745 NonBlockingTCPTests,
5746 FileObjectClassTestCase,
5747 UnbufferedFileObjectClassTestCase,
5748 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005749 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005750 UnicodeReadFileObjectClassTestCase,
5751 UnicodeWriteFileObjectClassTestCase,
5752 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005753 NetworkConnectionNoServer,
5754 NetworkConnectionAttributesTest,
5755 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005756 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005757 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005758 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005759 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005760 tests.append(BasicSocketPairTest)
5761 tests.append(TestUnixDomain)
5762 tests.append(TestLinuxAbstractNamespace)
5763 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005764 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005765 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005766 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005767 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005768 BasicVSOCKTest,
5769 ThreadedVSOCKSocketStreamTest,
5770 ])
5771 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005772 CmsgMacroTests,
5773 SendmsgUDPTest,
5774 RecvmsgUDPTest,
5775 RecvmsgIntoUDPTest,
5776 SendmsgUDP6Test,
5777 RecvmsgUDP6Test,
5778 RecvmsgRFC3542AncillaryUDP6Test,
5779 RecvmsgIntoRFC3542AncillaryUDP6Test,
5780 RecvmsgIntoUDP6Test,
5781 SendmsgTCPTest,
5782 RecvmsgTCPTest,
5783 RecvmsgIntoTCPTest,
5784 SendmsgSCTPStreamTest,
5785 RecvmsgSCTPStreamTest,
5786 RecvmsgIntoSCTPStreamTest,
5787 SendmsgUnixStreamTest,
5788 RecvmsgUnixStreamTest,
5789 RecvmsgIntoUnixStreamTest,
5790 RecvmsgSCMRightsStreamTest,
5791 RecvmsgIntoSCMRightsStreamTest,
5792 # These are slow when setitimer() is not available
5793 InterruptedRecvTimeoutTest,
5794 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005795 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005796 SendfileUsingSendTest,
5797 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005798 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005799
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005800 thread_info = support.threading_setup()
5801 support.run_unittest(*tests)
5802 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005803
5804if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005805 test_main()