blob: 84ec429133562ebf94394b8a5d19934cbfb25deb [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)
4536
4537 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004538
4539 def test_create_connection_timeout(self):
4540 # Issue #9792: create_connection() should not recast timeout errors
4541 # as generic socket errors.
4542 with self.mocked_socket_module():
4543 with self.assertRaises(socket.timeout):
4544 socket.create_connection((HOST, 1234))
4545
Guido van Rossumd8faa362007-04-27 19:54:29 +00004546
4547class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4548
4549 def __init__(self, methodName='runTest'):
4550 SocketTCPTest.__init__(self, methodName=methodName)
4551 ThreadableTest.__init__(self)
4552
4553 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004554 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004555
4556 def clientTearDown(self):
4557 self.cli.close()
4558 self.cli = None
4559 ThreadableTest.clientTearDown(self)
4560
4561 def _justAccept(self):
4562 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004563 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004564
4565 testFamily = _justAccept
4566 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004567 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004568 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004569 self.assertEqual(self.cli.family, 2)
4570
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004571 testSourceAddress = _justAccept
4572 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004573 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4574 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004575 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004576 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004577 # The port number being used is sufficient to show that the bind()
4578 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004579
Guido van Rossumd8faa362007-04-27 19:54:29 +00004580 testTimeoutDefault = _justAccept
4581 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004582 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004583 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004584 socket.setdefaulttimeout(42)
4585 try:
4586 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004587 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004588 finally:
4589 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004590 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004591
4592 testTimeoutNone = _justAccept
4593 def _testTimeoutNone(self):
4594 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004595 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004596 socket.setdefaulttimeout(30)
4597 try:
4598 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004599 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004600 finally:
4601 socket.setdefaulttimeout(None)
4602 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004603
4604 testTimeoutValueNamed = _justAccept
4605 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004606 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004607 self.assertEqual(self.cli.gettimeout(), 30)
4608
4609 testTimeoutValueNonamed = _justAccept
4610 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004611 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004612 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004613 self.assertEqual(self.cli.gettimeout(), 30)
4614
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004615
Guido van Rossumd8faa362007-04-27 19:54:29 +00004616class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4617
4618 def __init__(self, methodName='runTest'):
4619 SocketTCPTest.__init__(self, methodName=methodName)
4620 ThreadableTest.__init__(self)
4621
4622 def clientSetUp(self):
4623 pass
4624
4625 def clientTearDown(self):
4626 self.cli.close()
4627 self.cli = None
4628 ThreadableTest.clientTearDown(self)
4629
4630 def testInsideTimeout(self):
4631 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004632 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004633 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004634 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004635 testOutsideTimeout = testInsideTimeout
4636
4637 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004638 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004639 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004640 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004641
4642 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004643 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004644 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004645
4646
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004647class TCPTimeoutTest(SocketTCPTest):
4648
4649 def testTCPTimeout(self):
4650 def raise_timeout(*args, **kwargs):
4651 self.serv.settimeout(1.0)
4652 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004653 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004654 "Error generating a timeout exception (TCP)")
4655
4656 def testTimeoutZero(self):
4657 ok = False
4658 try:
4659 self.serv.settimeout(0.0)
4660 foo = self.serv.accept()
4661 except socket.timeout:
4662 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004663 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004664 ok = True
4665 except:
4666 self.fail("caught unexpected exception (TCP)")
4667 if not ok:
4668 self.fail("accept() returned success when we did not expect it")
4669
Serhiy Storchaka43767632013-11-03 21:31:38 +02004670 @unittest.skipUnless(hasattr(signal, 'alarm'),
4671 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004672 def testInterruptedTimeout(self):
4673 # XXX I don't know how to do this test on MSWindows or any other
4674 # plaform that doesn't support signal.alarm() or os.kill(), though
4675 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004676 self.serv.settimeout(5.0) # must be longer than alarm
4677 class Alarm(Exception):
4678 pass
4679 def alarm_handler(signal, frame):
4680 raise Alarm
4681 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4682 try:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004683 try:
Victor Stinner9abee722017-09-19 09:36:54 -07004684 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004685 foo = self.serv.accept()
4686 except socket.timeout:
4687 self.fail("caught timeout instead of Alarm")
4688 except Alarm:
4689 pass
4690 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004691 self.fail("caught other exception instead of Alarm:"
4692 " %s(%s):\n%s" %
4693 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004694 else:
4695 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004696 finally:
4697 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004698 except Alarm:
4699 self.fail("got Alarm in wrong place")
4700 finally:
4701 # no alarm can be pending. Safe to restore old handler.
4702 signal.signal(signal.SIGALRM, old_alarm)
4703
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004704class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004705
4706 def testUDPTimeout(self):
4707 def raise_timeout(*args, **kwargs):
4708 self.serv.settimeout(1.0)
4709 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004710 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004711 "Error generating a timeout exception (UDP)")
4712
4713 def testTimeoutZero(self):
4714 ok = False
4715 try:
4716 self.serv.settimeout(0.0)
4717 foo = self.serv.recv(1024)
4718 except socket.timeout:
4719 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004720 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004721 ok = True
4722 except:
4723 self.fail("caught unexpected exception (UDP)")
4724 if not ok:
4725 self.fail("recv() returned success when we did not expect it")
4726
4727class TestExceptions(unittest.TestCase):
4728
4729 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004730 self.assertTrue(issubclass(OSError, Exception))
4731 self.assertTrue(issubclass(socket.herror, OSError))
4732 self.assertTrue(issubclass(socket.gaierror, OSError))
4733 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004734
Yury Selivanovfa22b292016-10-18 16:03:52 -04004735 def test_setblocking_invalidfd(self):
4736 # Regression test for issue #28471
4737
4738 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4739 sock = socket.socket(
4740 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4741 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004742 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004743
4744 with self.assertRaises(OSError):
4745 sock.setblocking(False)
4746
4747
Serhiy Storchaka43767632013-11-03 21:31:38 +02004748@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004749class TestLinuxAbstractNamespace(unittest.TestCase):
4750
4751 UNIX_PATH_MAX = 108
4752
4753 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004754 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004755 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4756 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004757 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004758 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4759 s2.connect(s1.getsockname())
4760 with s1.accept()[0] as s3:
4761 self.assertEqual(s1.getsockname(), address)
4762 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004763
4764 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004765 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004766 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4767 s.bind(address)
4768 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004769
4770 def testNameOverflow(self):
4771 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004772 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004773 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004774
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004775 def testStrName(self):
4776 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004777 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4778 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004779 s.bind("\x00python\x00test\x00")
4780 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004781 finally:
4782 s.close()
4783
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004784 def testBytearrayName(self):
4785 # Check that an abstract name can be passed as a bytearray.
4786 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4787 s.bind(bytearray(b"\x00python\x00test\x00"))
4788 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4789
Serhiy Storchaka43767632013-11-03 21:31:38 +02004790@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004791class TestUnixDomain(unittest.TestCase):
4792
4793 def setUp(self):
4794 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4795
4796 def tearDown(self):
4797 self.sock.close()
4798
4799 def encoded(self, path):
4800 # Return the given path encoded in the file system encoding,
4801 # or skip the test if this is not possible.
4802 try:
4803 return os.fsencode(path)
4804 except UnicodeEncodeError:
4805 self.skipTest(
4806 "Pathname {0!a} cannot be represented in file "
4807 "system encoding {1!r}".format(
4808 path, sys.getfilesystemencoding()))
4809
Antoine Pitrou16374872011-12-16 15:04:12 +01004810 def bind(self, sock, path):
4811 # Bind the socket
4812 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004813 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004814 except OSError as e:
4815 if str(e) == "AF_UNIX path too long":
4816 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004817 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004818 .format(path))
4819 else:
4820 raise
4821
Antoine Pitrou495b5022017-05-02 17:20:00 +02004822 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004823 # Issue #30205 (note getsockname() can return None on OS X)
4824 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004825
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004826 def testStrAddr(self):
4827 # Test binding to and retrieving a normal string pathname.
4828 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004829 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004830 self.addCleanup(support.unlink, path)
4831 self.assertEqual(self.sock.getsockname(), path)
4832
4833 def testBytesAddr(self):
4834 # Test binding to a bytes pathname.
4835 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004836 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004837 self.addCleanup(support.unlink, path)
4838 self.assertEqual(self.sock.getsockname(), path)
4839
4840 def testSurrogateescapeBind(self):
4841 # Test binding to a valid non-ASCII pathname, with the
4842 # non-ASCII bytes supplied using surrogateescape encoding.
4843 path = os.path.abspath(support.TESTFN_UNICODE)
4844 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004845 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004846 self.addCleanup(support.unlink, path)
4847 self.assertEqual(self.sock.getsockname(), path)
4848
4849 def testUnencodableAddr(self):
4850 # Test binding to a pathname that cannot be encoded in the
4851 # file system encoding.
4852 if support.TESTFN_UNENCODABLE is None:
4853 self.skipTest("No unencodable filename available")
4854 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004855 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004856 self.addCleanup(support.unlink, path)
4857 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004858
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004859
Thomas Wouters477c8d52006-05-27 19:21:47 +00004860class BufferIOTest(SocketConnectedTest):
4861 """
4862 Test the buffer versions of socket.recv() and socket.send().
4863 """
4864 def __init__(self, methodName='runTest'):
4865 SocketConnectedTest.__init__(self, methodName=methodName)
4866
Antoine Pitrou25480782010-03-17 22:50:28 +00004867 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004868 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004869 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004870 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004871 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004872 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004873 self.assertEqual(msg, MSG)
4874
Antoine Pitrou25480782010-03-17 22:50:28 +00004875 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004876 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004877 self.serv_conn.send(buf)
4878
Antoine Pitrou25480782010-03-17 22:50:28 +00004879 def testRecvIntoBytearray(self):
4880 buf = bytearray(1024)
4881 nbytes = self.cli_conn.recv_into(buf)
4882 self.assertEqual(nbytes, len(MSG))
4883 msg = buf[:len(MSG)]
4884 self.assertEqual(msg, MSG)
4885
4886 _testRecvIntoBytearray = _testRecvIntoArray
4887
4888 def testRecvIntoMemoryview(self):
4889 buf = bytearray(1024)
4890 nbytes = self.cli_conn.recv_into(memoryview(buf))
4891 self.assertEqual(nbytes, len(MSG))
4892 msg = buf[:len(MSG)]
4893 self.assertEqual(msg, MSG)
4894
4895 _testRecvIntoMemoryview = _testRecvIntoArray
4896
4897 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004898 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004899 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004900 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004901 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004902 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004903 self.assertEqual(msg, MSG)
4904
Antoine Pitrou25480782010-03-17 22:50:28 +00004905 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004906 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004907 self.serv_conn.send(buf)
4908
Antoine Pitrou25480782010-03-17 22:50:28 +00004909 def testRecvFromIntoBytearray(self):
4910 buf = bytearray(1024)
4911 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4912 self.assertEqual(nbytes, len(MSG))
4913 msg = buf[:len(MSG)]
4914 self.assertEqual(msg, MSG)
4915
4916 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4917
4918 def testRecvFromIntoMemoryview(self):
4919 buf = bytearray(1024)
4920 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4921 self.assertEqual(nbytes, len(MSG))
4922 msg = buf[:len(MSG)]
4923 self.assertEqual(msg, MSG)
4924
4925 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4926
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004927 def testRecvFromIntoSmallBuffer(self):
4928 # See issue #20246.
4929 buf = bytearray(8)
4930 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4931
4932 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004933 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004934
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004935 def testRecvFromIntoEmptyBuffer(self):
4936 buf = bytearray()
4937 self.cli_conn.recvfrom_into(buf)
4938 self.cli_conn.recvfrom_into(buf, 0)
4939
4940 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4941
Christian Heimes043d6f62008-01-07 17:19:16 +00004942
4943TIPC_STYPE = 2000
4944TIPC_LOWER = 200
4945TIPC_UPPER = 210
4946
4947def isTipcAvailable():
4948 """Check if the TIPC module is loaded
4949
4950 The TIPC module is not loaded automatically on Ubuntu and probably
4951 other Linux distros.
4952 """
4953 if not hasattr(socket, "AF_TIPC"):
4954 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004955 try:
4956 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004957 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004958 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004959 # have not the permission to read it.
4960 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004961 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004962 for line in f:
4963 if line.startswith("tipc "):
4964 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004965 return False
4966
Serhiy Storchaka43767632013-11-03 21:31:38 +02004967@unittest.skipUnless(isTipcAvailable(),
4968 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004969class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004970 def testRDM(self):
4971 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4972 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004973 self.addCleanup(srv.close)
4974 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004975
4976 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4977 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4978 TIPC_LOWER, TIPC_UPPER)
4979 srv.bind(srvaddr)
4980
4981 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4982 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4983 cli.sendto(MSG, sendaddr)
4984
4985 msg, recvaddr = srv.recvfrom(1024)
4986
4987 self.assertEqual(cli.getsockname(), recvaddr)
4988 self.assertEqual(msg, MSG)
4989
4990
Serhiy Storchaka43767632013-11-03 21:31:38 +02004991@unittest.skipUnless(isTipcAvailable(),
4992 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004993class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004994 def __init__(self, methodName = 'runTest'):
4995 unittest.TestCase.__init__(self, methodName = methodName)
4996 ThreadableTest.__init__(self)
4997
4998 def setUp(self):
4999 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005000 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005001 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5002 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5003 TIPC_LOWER, TIPC_UPPER)
5004 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005005 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005006 self.serverExplicitReady()
5007 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005008 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005009
5010 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005011 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005012 # accept() call; sleep a little while to avoid it, otherwise
5013 # we could get an exception
5014 time.sleep(0.1)
5015 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005016 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005017 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5018 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5019 self.cli.connect(addr)
5020 self.cliaddr = self.cli.getsockname()
5021
5022 def testStream(self):
5023 msg = self.conn.recv(1024)
5024 self.assertEqual(msg, MSG)
5025 self.assertEqual(self.cliaddr, self.connaddr)
5026
5027 def _testStream(self):
5028 self.cli.send(MSG)
5029 self.cli.close()
5030
5031
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005032class ContextManagersTest(ThreadedTCPSocketTest):
5033
5034 def _testSocketClass(self):
5035 # base test
5036 with socket.socket() as sock:
5037 self.assertFalse(sock._closed)
5038 self.assertTrue(sock._closed)
5039 # close inside with block
5040 with socket.socket() as sock:
5041 sock.close()
5042 self.assertTrue(sock._closed)
5043 # exception inside with block
5044 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005045 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005046 self.assertTrue(sock._closed)
5047
5048 def testCreateConnectionBase(self):
5049 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005050 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005051 data = conn.recv(1024)
5052 conn.sendall(data)
5053
5054 def _testCreateConnectionBase(self):
5055 address = self.serv.getsockname()
5056 with socket.create_connection(address) as sock:
5057 self.assertFalse(sock._closed)
5058 sock.sendall(b'foo')
5059 self.assertEqual(sock.recv(1024), b'foo')
5060 self.assertTrue(sock._closed)
5061
5062 def testCreateConnectionClose(self):
5063 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005064 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005065 data = conn.recv(1024)
5066 conn.sendall(data)
5067
5068 def _testCreateConnectionClose(self):
5069 address = self.serv.getsockname()
5070 with socket.create_connection(address) as sock:
5071 sock.close()
5072 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005073 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005074
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005075
Victor Stinnerdaf45552013-08-28 00:53:59 +02005076class InheritanceTest(unittest.TestCase):
5077 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5078 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005079 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005080 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005081 with socket.socket(socket.AF_INET,
5082 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
5083 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005084 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005085
5086 def test_default_inheritable(self):
5087 sock = socket.socket()
5088 with sock:
5089 self.assertEqual(sock.get_inheritable(), False)
5090
5091 def test_dup(self):
5092 sock = socket.socket()
5093 with sock:
5094 newsock = sock.dup()
5095 sock.close()
5096 with newsock:
5097 self.assertEqual(newsock.get_inheritable(), False)
5098
5099 def test_set_inheritable(self):
5100 sock = socket.socket()
5101 with sock:
5102 sock.set_inheritable(True)
5103 self.assertEqual(sock.get_inheritable(), True)
5104
5105 sock.set_inheritable(False)
5106 self.assertEqual(sock.get_inheritable(), False)
5107
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005108 @unittest.skipIf(fcntl is None, "need fcntl")
5109 def test_get_inheritable_cloexec(self):
5110 sock = socket.socket()
5111 with sock:
5112 fd = sock.fileno()
5113 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005114
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005115 # clear FD_CLOEXEC flag
5116 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5117 flags &= ~fcntl.FD_CLOEXEC
5118 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005119
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005120 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005121
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005122 @unittest.skipIf(fcntl is None, "need fcntl")
5123 def test_set_inheritable_cloexec(self):
5124 sock = socket.socket()
5125 with sock:
5126 fd = sock.fileno()
5127 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5128 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005129
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005130 sock.set_inheritable(True)
5131 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5132 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005133
5134
Victor Stinnerdaf45552013-08-28 00:53:59 +02005135 @unittest.skipUnless(hasattr(socket, "socketpair"),
5136 "need socket.socketpair()")
5137 def test_socketpair(self):
5138 s1, s2 = socket.socketpair()
5139 self.addCleanup(s1.close)
5140 self.addCleanup(s2.close)
5141 self.assertEqual(s1.get_inheritable(), False)
5142 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005143
5144
5145@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5146 "SOCK_NONBLOCK not defined")
5147class NonblockConstantTest(unittest.TestCase):
5148 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5149 if nonblock:
5150 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5151 self.assertEqual(s.gettimeout(), timeout)
5152 else:
5153 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5154 self.assertEqual(s.gettimeout(), None)
5155
Charles-François Natali239bb962011-06-03 12:55:15 +02005156 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005157 def test_SOCK_NONBLOCK(self):
5158 # a lot of it seems silly and redundant, but I wanted to test that
5159 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005160 with socket.socket(socket.AF_INET,
5161 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5162 self.checkNonblock(s)
5163 s.setblocking(1)
5164 self.checkNonblock(s, False)
5165 s.setblocking(0)
5166 self.checkNonblock(s)
5167 s.settimeout(None)
5168 self.checkNonblock(s, False)
5169 s.settimeout(2.0)
5170 self.checkNonblock(s, timeout=2.0)
5171 s.setblocking(1)
5172 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005173 # defaulttimeout
5174 t = socket.getdefaulttimeout()
5175 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005176 with socket.socket() as s:
5177 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005178 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005179 with socket.socket() as s:
5180 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005181 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005182 with socket.socket() as s:
5183 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005184 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005185 with socket.socket() as s:
5186 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005187 socket.setdefaulttimeout(t)
5188
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005189
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005190@unittest.skipUnless(os.name == "nt", "Windows specific")
5191@unittest.skipUnless(multiprocessing, "need multiprocessing")
5192class TestSocketSharing(SocketTCPTest):
5193 # This must be classmethod and not staticmethod or multiprocessing
5194 # won't be able to bootstrap it.
5195 @classmethod
5196 def remoteProcessServer(cls, q):
5197 # Recreate socket from shared data
5198 sdata = q.get()
5199 message = q.get()
5200
5201 s = socket.fromshare(sdata)
5202 s2, c = s.accept()
5203
5204 # Send the message
5205 s2.sendall(message)
5206 s2.close()
5207 s.close()
5208
5209 def testShare(self):
5210 # Transfer the listening server socket to another process
5211 # and service it from there.
5212
5213 # Create process:
5214 q = multiprocessing.Queue()
5215 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5216 p.start()
5217
5218 # Get the shared socket data
5219 data = self.serv.share(p.pid)
5220
5221 # Pass the shared socket to the other process
5222 addr = self.serv.getsockname()
5223 self.serv.close()
5224 q.put(data)
5225
5226 # The data that the server will send us
5227 message = b"slapmahfro"
5228 q.put(message)
5229
5230 # Connect
5231 s = socket.create_connection(addr)
5232 # listen for the data
5233 m = []
5234 while True:
5235 data = s.recv(100)
5236 if not data:
5237 break
5238 m.append(data)
5239 s.close()
5240 received = b"".join(m)
5241 self.assertEqual(received, message)
5242 p.join()
5243
5244 def testShareLength(self):
5245 data = self.serv.share(os.getpid())
5246 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5247 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5248
5249 def compareSockets(self, org, other):
5250 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005251 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005252 self.assertEqual(org.gettimeout(), None)
5253 self.assertEqual(org.gettimeout(), other.gettimeout())
5254
5255 self.assertEqual(org.family, other.family)
5256 self.assertEqual(org.type, other.type)
5257 # If the user specified "0" for proto, then
5258 # internally windows will have picked the correct value.
5259 # Python introspection on the socket however will still return
5260 # 0. For the shared socket, the python value is recreated
5261 # from the actual value, so it may not compare correctly.
5262 if org.proto != 0:
5263 self.assertEqual(org.proto, other.proto)
5264
5265 def testShareLocal(self):
5266 data = self.serv.share(os.getpid())
5267 s = socket.fromshare(data)
5268 try:
5269 self.compareSockets(self.serv, s)
5270 finally:
5271 s.close()
5272
5273 def testTypes(self):
5274 families = [socket.AF_INET, socket.AF_INET6]
5275 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5276 for f in families:
5277 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005278 try:
5279 source = socket.socket(f, t)
5280 except OSError:
5281 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005282 try:
5283 data = source.share(os.getpid())
5284 shared = socket.fromshare(data)
5285 try:
5286 self.compareSockets(source, shared)
5287 finally:
5288 shared.close()
5289 finally:
5290 source.close()
5291
5292
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005293class SendfileUsingSendTest(ThreadedTCPSocketTest):
5294 """
5295 Test the send() implementation of socket.sendfile().
5296 """
5297
5298 FILESIZE = (10 * 1024 * 1024) # 10MB
5299 BUFSIZE = 8192
5300 FILEDATA = b""
5301 TIMEOUT = 2
5302
5303 @classmethod
5304 def setUpClass(cls):
5305 def chunks(total, step):
5306 assert total >= step
5307 while total > step:
5308 yield step
5309 total -= step
5310 if total:
5311 yield total
5312
5313 chunk = b"".join([random.choice(string.ascii_letters).encode()
5314 for i in range(cls.BUFSIZE)])
5315 with open(support.TESTFN, 'wb') as f:
5316 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5317 f.write(chunk)
5318 with open(support.TESTFN, 'rb') as f:
5319 cls.FILEDATA = f.read()
5320 assert len(cls.FILEDATA) == cls.FILESIZE
5321
5322 @classmethod
5323 def tearDownClass(cls):
5324 support.unlink(support.TESTFN)
5325
5326 def accept_conn(self):
5327 self.serv.settimeout(self.TIMEOUT)
5328 conn, addr = self.serv.accept()
5329 conn.settimeout(self.TIMEOUT)
5330 self.addCleanup(conn.close)
5331 return conn
5332
5333 def recv_data(self, conn):
5334 received = []
5335 while True:
5336 chunk = conn.recv(self.BUFSIZE)
5337 if not chunk:
5338 break
5339 received.append(chunk)
5340 return b''.join(received)
5341
5342 def meth_from_sock(self, sock):
5343 # Depending on the mixin class being run return either send()
5344 # or sendfile() method implementation.
5345 return getattr(sock, "_sendfile_use_send")
5346
5347 # regular file
5348
5349 def _testRegularFile(self):
5350 address = self.serv.getsockname()
5351 file = open(support.TESTFN, 'rb')
5352 with socket.create_connection(address) as sock, file as file:
5353 meth = self.meth_from_sock(sock)
5354 sent = meth(file)
5355 self.assertEqual(sent, self.FILESIZE)
5356 self.assertEqual(file.tell(), self.FILESIZE)
5357
5358 def testRegularFile(self):
5359 conn = self.accept_conn()
5360 data = self.recv_data(conn)
5361 self.assertEqual(len(data), self.FILESIZE)
5362 self.assertEqual(data, self.FILEDATA)
5363
5364 # non regular file
5365
5366 def _testNonRegularFile(self):
5367 address = self.serv.getsockname()
5368 file = io.BytesIO(self.FILEDATA)
5369 with socket.create_connection(address) as sock, file as file:
5370 sent = sock.sendfile(file)
5371 self.assertEqual(sent, self.FILESIZE)
5372 self.assertEqual(file.tell(), self.FILESIZE)
5373 self.assertRaises(socket._GiveupOnSendfile,
5374 sock._sendfile_use_sendfile, file)
5375
5376 def testNonRegularFile(self):
5377 conn = self.accept_conn()
5378 data = self.recv_data(conn)
5379 self.assertEqual(len(data), self.FILESIZE)
5380 self.assertEqual(data, self.FILEDATA)
5381
5382 # empty file
5383
5384 def _testEmptyFileSend(self):
5385 address = self.serv.getsockname()
5386 filename = support.TESTFN + "2"
5387 with open(filename, 'wb'):
5388 self.addCleanup(support.unlink, filename)
5389 file = open(filename, 'rb')
5390 with socket.create_connection(address) as sock, file as file:
5391 meth = self.meth_from_sock(sock)
5392 sent = meth(file)
5393 self.assertEqual(sent, 0)
5394 self.assertEqual(file.tell(), 0)
5395
5396 def testEmptyFileSend(self):
5397 conn = self.accept_conn()
5398 data = self.recv_data(conn)
5399 self.assertEqual(data, b"")
5400
5401 # offset
5402
5403 def _testOffset(self):
5404 address = self.serv.getsockname()
5405 file = open(support.TESTFN, 'rb')
5406 with socket.create_connection(address) as sock, file as file:
5407 meth = self.meth_from_sock(sock)
5408 sent = meth(file, offset=5000)
5409 self.assertEqual(sent, self.FILESIZE - 5000)
5410 self.assertEqual(file.tell(), self.FILESIZE)
5411
5412 def testOffset(self):
5413 conn = self.accept_conn()
5414 data = self.recv_data(conn)
5415 self.assertEqual(len(data), self.FILESIZE - 5000)
5416 self.assertEqual(data, self.FILEDATA[5000:])
5417
5418 # count
5419
5420 def _testCount(self):
5421 address = self.serv.getsockname()
5422 file = open(support.TESTFN, 'rb')
5423 with socket.create_connection(address, timeout=2) as sock, file as file:
5424 count = 5000007
5425 meth = self.meth_from_sock(sock)
5426 sent = meth(file, count=count)
5427 self.assertEqual(sent, count)
5428 self.assertEqual(file.tell(), count)
5429
5430 def testCount(self):
5431 count = 5000007
5432 conn = self.accept_conn()
5433 data = self.recv_data(conn)
5434 self.assertEqual(len(data), count)
5435 self.assertEqual(data, self.FILEDATA[:count])
5436
5437 # count small
5438
5439 def _testCountSmall(self):
5440 address = self.serv.getsockname()
5441 file = open(support.TESTFN, 'rb')
5442 with socket.create_connection(address, timeout=2) as sock, file as file:
5443 count = 1
5444 meth = self.meth_from_sock(sock)
5445 sent = meth(file, count=count)
5446 self.assertEqual(sent, count)
5447 self.assertEqual(file.tell(), count)
5448
5449 def testCountSmall(self):
5450 count = 1
5451 conn = self.accept_conn()
5452 data = self.recv_data(conn)
5453 self.assertEqual(len(data), count)
5454 self.assertEqual(data, self.FILEDATA[:count])
5455
5456 # count + offset
5457
5458 def _testCountWithOffset(self):
5459 address = self.serv.getsockname()
5460 file = open(support.TESTFN, 'rb')
5461 with socket.create_connection(address, timeout=2) as sock, file as file:
5462 count = 100007
5463 meth = self.meth_from_sock(sock)
5464 sent = meth(file, offset=2007, count=count)
5465 self.assertEqual(sent, count)
5466 self.assertEqual(file.tell(), count + 2007)
5467
5468 def testCountWithOffset(self):
5469 count = 100007
5470 conn = self.accept_conn()
5471 data = self.recv_data(conn)
5472 self.assertEqual(len(data), count)
5473 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5474
5475 # non blocking sockets are not supposed to work
5476
5477 def _testNonBlocking(self):
5478 address = self.serv.getsockname()
5479 file = open(support.TESTFN, 'rb')
5480 with socket.create_connection(address) as sock, file as file:
5481 sock.setblocking(False)
5482 meth = self.meth_from_sock(sock)
5483 self.assertRaises(ValueError, meth, file)
5484 self.assertRaises(ValueError, sock.sendfile, file)
5485
5486 def testNonBlocking(self):
5487 conn = self.accept_conn()
5488 if conn.recv(8192):
5489 self.fail('was not supposed to receive any data')
5490
5491 # timeout (non-triggered)
5492
5493 def _testWithTimeout(self):
5494 address = self.serv.getsockname()
5495 file = open(support.TESTFN, 'rb')
5496 with socket.create_connection(address, timeout=2) as sock, file as file:
5497 meth = self.meth_from_sock(sock)
5498 sent = meth(file)
5499 self.assertEqual(sent, self.FILESIZE)
5500
5501 def testWithTimeout(self):
5502 conn = self.accept_conn()
5503 data = self.recv_data(conn)
5504 self.assertEqual(len(data), self.FILESIZE)
5505 self.assertEqual(data, self.FILEDATA)
5506
5507 # timeout (triggered)
5508
5509 def _testWithTimeoutTriggeredSend(self):
5510 address = self.serv.getsockname()
5511 file = open(support.TESTFN, 'rb')
5512 with socket.create_connection(address, timeout=0.01) as sock, \
5513 file as file:
5514 meth = self.meth_from_sock(sock)
5515 self.assertRaises(socket.timeout, meth, file)
5516
5517 def testWithTimeoutTriggeredSend(self):
5518 conn = self.accept_conn()
5519 conn.recv(88192)
5520
5521 # errors
5522
5523 def _test_errors(self):
5524 pass
5525
5526 def test_errors(self):
5527 with open(support.TESTFN, 'rb') as file:
5528 with socket.socket(type=socket.SOCK_DGRAM) as s:
5529 meth = self.meth_from_sock(s)
5530 self.assertRaisesRegex(
5531 ValueError, "SOCK_STREAM", meth, file)
5532 with open(support.TESTFN, 'rt') as file:
5533 with socket.socket() as s:
5534 meth = self.meth_from_sock(s)
5535 self.assertRaisesRegex(
5536 ValueError, "binary mode", meth, file)
5537 with open(support.TESTFN, 'rb') as file:
5538 with socket.socket() as s:
5539 meth = self.meth_from_sock(s)
5540 self.assertRaisesRegex(TypeError, "positive integer",
5541 meth, file, count='2')
5542 self.assertRaisesRegex(TypeError, "positive integer",
5543 meth, file, count=0.1)
5544 self.assertRaisesRegex(ValueError, "positive integer",
5545 meth, file, count=0)
5546 self.assertRaisesRegex(ValueError, "positive integer",
5547 meth, file, count=-1)
5548
5549
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005550@unittest.skipUnless(hasattr(os, "sendfile"),
5551 'os.sendfile() required for this test.')
5552class SendfileUsingSendfileTest(SendfileUsingSendTest):
5553 """
5554 Test the sendfile() implementation of socket.sendfile().
5555 """
5556 def meth_from_sock(self, sock):
5557 return getattr(sock, "_sendfile_use_sendfile")
5558
Christian Heimes48371412016-09-06 00:37:46 +02005559
5560@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005561class LinuxKernelCryptoAPI(unittest.TestCase):
5562 # tests for AF_ALG
5563 def create_alg(self, typ, name):
5564 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005565 try:
5566 sock.bind((typ, name))
5567 except FileNotFoundError as e:
5568 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005569 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005570 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005571 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005572 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005573
5574 def test_sha256(self):
5575 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5576 "177a9cb410ff61f20015ad")
5577 with self.create_alg('hash', 'sha256') as algo:
5578 op, _ = algo.accept()
5579 with op:
5580 op.sendall(b"abc")
5581 self.assertEqual(op.recv(512), expected)
5582
5583 op, _ = algo.accept()
5584 with op:
5585 op.send(b'a', socket.MSG_MORE)
5586 op.send(b'b', socket.MSG_MORE)
5587 op.send(b'c', socket.MSG_MORE)
5588 op.send(b'')
5589 self.assertEqual(op.recv(512), expected)
5590
5591 def test_hmac_sha1(self):
5592 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5593 with self.create_alg('hash', 'hmac(sha1)') as algo:
5594 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5595 op, _ = algo.accept()
5596 with op:
5597 op.sendall(b"what do ya want for nothing?")
5598 self.assertEqual(op.recv(512), expected)
5599
Christian Heimese084f842016-09-11 20:11:30 +02005600 # Although it should work with 3.19 and newer the test blocks on
5601 # Ubuntu 15.10 with Kernel 4.2.0-19.
5602 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005603 def test_aes_cbc(self):
5604 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5605 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5606 msg = b"Single block msg"
5607 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5608 msglen = len(msg)
5609 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5610 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5611 op, _ = algo.accept()
5612 with op:
5613 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5614 flags=socket.MSG_MORE)
5615 op.sendall(msg)
5616 self.assertEqual(op.recv(msglen), ciphertext)
5617
5618 op, _ = algo.accept()
5619 with op:
5620 op.sendmsg_afalg([ciphertext],
5621 op=socket.ALG_OP_DECRYPT, iv=iv)
5622 self.assertEqual(op.recv(msglen), msg)
5623
5624 # long message
5625 multiplier = 1024
5626 longmsg = [msg] * multiplier
5627 op, _ = algo.accept()
5628 with op:
5629 op.sendmsg_afalg(longmsg,
5630 op=socket.ALG_OP_ENCRYPT, iv=iv)
5631 enc = op.recv(msglen * multiplier)
5632 self.assertEqual(len(enc), msglen * multiplier)
5633 self.assertTrue(enc[:msglen], ciphertext)
5634
5635 op, _ = algo.accept()
5636 with op:
5637 op.sendmsg_afalg([enc],
5638 op=socket.ALG_OP_DECRYPT, iv=iv)
5639 dec = op.recv(msglen * multiplier)
5640 self.assertEqual(len(dec), msglen * multiplier)
5641 self.assertEqual(dec, msg * multiplier)
5642
matejcik9764c152017-02-16 14:41:31 +01005643 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005644 def test_aead_aes_gcm(self):
5645 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5646 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5647 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5648 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5649 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5650 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5651
5652 taglen = len(expected_tag)
5653 assoclen = len(assoc)
5654
5655 with self.create_alg('aead', 'gcm(aes)') as algo:
5656 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5657 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5658 None, taglen)
5659
5660 # send assoc, plain and tag buffer in separate steps
5661 op, _ = algo.accept()
5662 with op:
5663 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5664 assoclen=assoclen, flags=socket.MSG_MORE)
5665 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005666 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005667 res = op.recv(assoclen + len(plain) + taglen)
5668 self.assertEqual(expected_ct, res[assoclen:-taglen])
5669 self.assertEqual(expected_tag, res[-taglen:])
5670
5671 # now with msg
5672 op, _ = algo.accept()
5673 with op:
matejcik9764c152017-02-16 14:41:31 +01005674 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005675 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5676 assoclen=assoclen)
5677 res = op.recv(assoclen + len(plain) + taglen)
5678 self.assertEqual(expected_ct, res[assoclen:-taglen])
5679 self.assertEqual(expected_tag, res[-taglen:])
5680
5681 # create anc data manually
5682 pack_uint32 = struct.Struct('I').pack
5683 op, _ = algo.accept()
5684 with op:
matejcik9764c152017-02-16 14:41:31 +01005685 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005686 op.sendmsg(
5687 [msg],
5688 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5689 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5690 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5691 )
5692 )
matejcik9764c152017-02-16 14:41:31 +01005693 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005694 self.assertEqual(expected_ct, res[assoclen:-taglen])
5695 self.assertEqual(expected_tag, res[-taglen:])
5696
5697 # decrypt and verify
5698 op, _ = algo.accept()
5699 with op:
5700 msg = assoc + expected_ct + expected_tag
5701 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5702 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005703 res = op.recv(len(msg) - taglen)
5704 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005705
Christian Heimese084f842016-09-11 20:11:30 +02005706 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005707 def test_drbg_pr_sha256(self):
5708 # deterministic random bit generator, prediction resistance, sha256
5709 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5710 extra_seed = os.urandom(32)
5711 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5712 op, _ = algo.accept()
5713 with op:
5714 rn = op.recv(32)
5715 self.assertEqual(len(rn), 32)
5716
5717 def test_sendmsg_afalg_args(self):
5718 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005719 with sock:
5720 with self.assertRaises(TypeError):
5721 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005722
Christian Heimes02b30352016-09-11 19:49:56 +02005723 with self.assertRaises(TypeError):
5724 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005725
Christian Heimes02b30352016-09-11 19:49:56 +02005726 with self.assertRaises(TypeError):
5727 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005728
Christian Heimes02b30352016-09-11 19:49:56 +02005729 with self.assertRaises(TypeError):
5730 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005731
Christian Heimes02b30352016-09-11 19:49:56 +02005732 with self.assertRaises(TypeError):
5733 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5734
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005735
Guido van Rossumb995eb72002-07-31 16:08:40 +00005736def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005737 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005738 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005739
5740 tests.extend([
5741 NonBlockingTCPTests,
5742 FileObjectClassTestCase,
5743 UnbufferedFileObjectClassTestCase,
5744 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005745 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005746 UnicodeReadFileObjectClassTestCase,
5747 UnicodeWriteFileObjectClassTestCase,
5748 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005749 NetworkConnectionNoServer,
5750 NetworkConnectionAttributesTest,
5751 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005752 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005753 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005754 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005755 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005756 tests.append(BasicSocketPairTest)
5757 tests.append(TestUnixDomain)
5758 tests.append(TestLinuxAbstractNamespace)
5759 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005760 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005761 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005762 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005763 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005764 BasicVSOCKTest,
5765 ThreadedVSOCKSocketStreamTest,
5766 ])
5767 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005768 CmsgMacroTests,
5769 SendmsgUDPTest,
5770 RecvmsgUDPTest,
5771 RecvmsgIntoUDPTest,
5772 SendmsgUDP6Test,
5773 RecvmsgUDP6Test,
5774 RecvmsgRFC3542AncillaryUDP6Test,
5775 RecvmsgIntoRFC3542AncillaryUDP6Test,
5776 RecvmsgIntoUDP6Test,
5777 SendmsgTCPTest,
5778 RecvmsgTCPTest,
5779 RecvmsgIntoTCPTest,
5780 SendmsgSCTPStreamTest,
5781 RecvmsgSCTPStreamTest,
5782 RecvmsgIntoSCTPStreamTest,
5783 SendmsgUnixStreamTest,
5784 RecvmsgUnixStreamTest,
5785 RecvmsgIntoUnixStreamTest,
5786 RecvmsgSCMRightsStreamTest,
5787 RecvmsgIntoSCMRightsStreamTest,
5788 # These are slow when setitimer() is not available
5789 InterruptedRecvTimeoutTest,
5790 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005791 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005792 SendfileUsingSendTest,
5793 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005794 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005795
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005796 thread_info = support.threading_setup()
5797 support.run_unittest(*tests)
5798 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005799
5800if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005801 test_main()