blob: 05d8761241e8a4733da9ad9441de7efbf6c3bf6e [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):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000274 self.server_ready = threading.Event()
275 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000276 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000277 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200278 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279
280 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000281 methodname = self.id()
282 i = methodname.rfind('.')
283 methodname = methodname[i+1:]
284 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000285 self.client_thread = thread.start_new_thread(
286 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200288 try:
289 self.__setUp()
290 except:
291 self.server_crashed = True
292 raise
293 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000294 self.server_ready.set()
295 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296
297 def _tearDown(self):
298 self.__tearDown()
299 self.done.wait()
300
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000301 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000302 exc = self.queue.get()
303 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000304
305 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000306 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100307 try:
308 self.clientSetUp()
309 except BaseException as e:
310 self.queue.put(e)
311 self.clientTearDown()
312 return
313 finally:
314 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200315 if self.server_crashed:
316 self.clientTearDown()
317 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000318 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000319 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000320 try:
321 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000322 except BaseException as e:
323 self.queue.put(e)
324 finally:
325 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000326
327 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000328 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000329
330 def clientTearDown(self):
331 self.done.set()
332 thread.exit()
333
334class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
335
336 def __init__(self, methodName='runTest'):
337 SocketTCPTest.__init__(self, methodName=methodName)
338 ThreadableTest.__init__(self)
339
340 def clientSetUp(self):
341 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
342
343 def clientTearDown(self):
344 self.cli.close()
345 self.cli = None
346 ThreadableTest.clientTearDown(self)
347
348class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
349
350 def __init__(self, methodName='runTest'):
351 SocketUDPTest.__init__(self, methodName=methodName)
352 ThreadableTest.__init__(self)
353
354 def clientSetUp(self):
355 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
356
Brian Curtin3beb38f2010-11-04 03:41:43 +0000357 def clientTearDown(self):
358 self.cli.close()
359 self.cli = None
360 ThreadableTest.clientTearDown(self)
361
Charles-François Natali47413c12011-10-06 19:47:44 +0200362class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
363
364 def __init__(self, methodName='runTest'):
365 SocketCANTest.__init__(self, methodName=methodName)
366 ThreadableTest.__init__(self)
367
368 def clientSetUp(self):
369 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
370 try:
371 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200372 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200373 # skipTest should not be called here, and will be called in the
374 # server instead
375 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200376
377 def clientTearDown(self):
378 self.cli.close()
379 self.cli = None
380 ThreadableTest.clientTearDown(self)
381
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100382class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
383
384 def __init__(self, methodName='runTest'):
385 SocketRDSTest.__init__(self, methodName=methodName)
386 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100387
388 def clientSetUp(self):
389 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
390 try:
391 # RDS sockets must be bound explicitly to send or receive data
392 self.cli.bind((HOST, 0))
393 self.cli_addr = self.cli.getsockname()
394 except OSError:
395 # skipTest should not be called here, and will be called in the
396 # server instead
397 pass
398
399 def clientTearDown(self):
400 self.cli.close()
401 self.cli = None
402 ThreadableTest.clientTearDown(self)
403
caaveryeffc12f2017-09-06 18:18:10 -0400404@unittest.skipIf(fcntl is None, "need fcntl")
caaveryeffc12f2017-09-06 18:18:10 -0400405@unittest.skipUnless(HAVE_SOCKET_VSOCK,
406 'VSOCK sockets required for this test.')
407@unittest.skipUnless(get_cid() != 2,
408 "This test can only be run on a virtual guest.")
409class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
410
411 def __init__(self, methodName='runTest'):
412 unittest.TestCase.__init__(self, methodName=methodName)
413 ThreadableTest.__init__(self)
414
415 def setUp(self):
416 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
417 self.addCleanup(self.serv.close)
418 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
419 self.serv.listen()
420 self.serverExplicitReady()
421 self.conn, self.connaddr = self.serv.accept()
422 self.addCleanup(self.conn.close)
423
424 def clientSetUp(self):
425 time.sleep(0.1)
426 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
427 self.addCleanup(self.cli.close)
428 cid = get_cid()
429 self.cli.connect((cid, VSOCKPORT))
430
431 def testStream(self):
432 msg = self.conn.recv(1024)
433 self.assertEqual(msg, MSG)
434
435 def _testStream(self):
436 self.cli.send(MSG)
437 self.cli.close()
438
Guido van Rossum24e4af82002-06-12 19:18:08 +0000439class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000440 """Socket tests for client-server connection.
441
442 self.cli_conn is a client socket connected to the server. The
443 setUp() method guarantees that it is connected to the server.
444 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000445
446 def __init__(self, methodName='runTest'):
447 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
448
449 def setUp(self):
450 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000451 # Indicate explicitly we're ready for the client thread to
452 # proceed and then perform the blocking call to accept
453 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000454 conn, addr = self.serv.accept()
455 self.cli_conn = conn
456
457 def tearDown(self):
458 self.cli_conn.close()
459 self.cli_conn = None
460 ThreadedTCPSocketTest.tearDown(self)
461
462 def clientSetUp(self):
463 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000464 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465 self.serv_conn = self.cli
466
467 def clientTearDown(self):
468 self.serv_conn.close()
469 self.serv_conn = None
470 ThreadedTCPSocketTest.clientTearDown(self)
471
Dave Cole331708b2004-08-09 04:51:41 +0000472class SocketPairTest(unittest.TestCase, ThreadableTest):
473
474 def __init__(self, methodName='runTest'):
475 unittest.TestCase.__init__(self, methodName=methodName)
476 ThreadableTest.__init__(self)
477
478 def setUp(self):
479 self.serv, self.cli = socket.socketpair()
480
481 def tearDown(self):
482 self.serv.close()
483 self.serv = None
484
485 def clientSetUp(self):
486 pass
487
488 def clientTearDown(self):
489 self.cli.close()
490 self.cli = None
491 ThreadableTest.clientTearDown(self)
492
Tim Peters494aaee2004-08-09 18:54:11 +0000493
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000494# The following classes are used by the sendmsg()/recvmsg() tests.
495# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
496# gives a drop-in replacement for SocketConnectedTest, but different
497# address families can be used, and the attributes serv_addr and
498# cli_addr will be set to the addresses of the endpoints.
499
500class SocketTestBase(unittest.TestCase):
501 """A base class for socket tests.
502
503 Subclasses must provide methods newSocket() to return a new socket
504 and bindSock(sock) to bind it to an unused address.
505
506 Creates a socket self.serv and sets self.serv_addr to its address.
507 """
508
509 def setUp(self):
510 self.serv = self.newSocket()
511 self.bindServer()
512
513 def bindServer(self):
514 """Bind server socket and set self.serv_addr to its address."""
515 self.bindSock(self.serv)
516 self.serv_addr = self.serv.getsockname()
517
518 def tearDown(self):
519 self.serv.close()
520 self.serv = None
521
522
523class SocketListeningTestMixin(SocketTestBase):
524 """Mixin to listen on the server socket."""
525
526 def setUp(self):
527 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100528 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000529
530
531class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
532 ThreadableTest):
533 """Mixin to add client socket and allow client/server tests.
534
535 Client socket is self.cli and its address is self.cli_addr. See
536 ThreadableTest for usage information.
537 """
538
539 def __init__(self, *args, **kwargs):
540 super().__init__(*args, **kwargs)
541 ThreadableTest.__init__(self)
542
543 def clientSetUp(self):
544 self.cli = self.newClientSocket()
545 self.bindClient()
546
547 def newClientSocket(self):
548 """Return a new socket for use as client."""
549 return self.newSocket()
550
551 def bindClient(self):
552 """Bind client socket and set self.cli_addr to its address."""
553 self.bindSock(self.cli)
554 self.cli_addr = self.cli.getsockname()
555
556 def clientTearDown(self):
557 self.cli.close()
558 self.cli = None
559 ThreadableTest.clientTearDown(self)
560
561
562class ConnectedStreamTestMixin(SocketListeningTestMixin,
563 ThreadedSocketTestMixin):
564 """Mixin to allow client/server stream tests with connected client.
565
566 Server's socket representing connection to client is self.cli_conn
567 and client's connection to server is self.serv_conn. (Based on
568 SocketConnectedTest.)
569 """
570
571 def setUp(self):
572 super().setUp()
573 # Indicate explicitly we're ready for the client thread to
574 # proceed and then perform the blocking call to accept
575 self.serverExplicitReady()
576 conn, addr = self.serv.accept()
577 self.cli_conn = conn
578
579 def tearDown(self):
580 self.cli_conn.close()
581 self.cli_conn = None
582 super().tearDown()
583
584 def clientSetUp(self):
585 super().clientSetUp()
586 self.cli.connect(self.serv_addr)
587 self.serv_conn = self.cli
588
589 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100590 try:
591 self.serv_conn.close()
592 self.serv_conn = None
593 except AttributeError:
594 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000595 super().clientTearDown()
596
597
598class UnixSocketTestBase(SocketTestBase):
599 """Base class for Unix-domain socket tests."""
600
601 # This class is used for file descriptor passing tests, so we
602 # create the sockets in a private directory so that other users
603 # can't send anything that might be problematic for a privileged
604 # user running the tests.
605
606 def setUp(self):
607 self.dir_path = tempfile.mkdtemp()
608 self.addCleanup(os.rmdir, self.dir_path)
609 super().setUp()
610
611 def bindSock(self, sock):
612 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100613 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000614 self.addCleanup(support.unlink, path)
615
616class UnixStreamBase(UnixSocketTestBase):
617 """Base class for Unix-domain SOCK_STREAM tests."""
618
619 def newSocket(self):
620 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
621
622
623class InetTestBase(SocketTestBase):
624 """Base class for IPv4 socket tests."""
625
626 host = HOST
627
628 def setUp(self):
629 super().setUp()
630 self.port = self.serv_addr[1]
631
632 def bindSock(self, sock):
633 support.bind_port(sock, host=self.host)
634
635class TCPTestBase(InetTestBase):
636 """Base class for TCP-over-IPv4 tests."""
637
638 def newSocket(self):
639 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
640
641class UDPTestBase(InetTestBase):
642 """Base class for UDP-over-IPv4 tests."""
643
644 def newSocket(self):
645 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
646
647class SCTPStreamBase(InetTestBase):
648 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
649
650 def newSocket(self):
651 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
652 socket.IPPROTO_SCTP)
653
654
655class Inet6TestBase(InetTestBase):
656 """Base class for IPv6 socket tests."""
657
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200658 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000659
660class UDP6TestBase(Inet6TestBase):
661 """Base class for UDP-over-IPv6 tests."""
662
663 def newSocket(self):
664 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
665
666
667# Test-skipping decorators for use with ThreadableTest.
668
669def skipWithClientIf(condition, reason):
670 """Skip decorated test if condition is true, add client_skip decorator.
671
672 If the decorated object is not a class, sets its attribute
673 "client_skip" to a decorator which will return an empty function
674 if the test is to be skipped, or the original function if it is
675 not. This can be used to avoid running the client part of a
676 skipped test when using ThreadableTest.
677 """
678 def client_pass(*args, **kwargs):
679 pass
680 def skipdec(obj):
681 retval = unittest.skip(reason)(obj)
682 if not isinstance(obj, type):
683 retval.client_skip = lambda f: client_pass
684 return retval
685 def noskipdec(obj):
686 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
687 obj.client_skip = lambda f: f
688 return obj
689 return skipdec if condition else noskipdec
690
691
692def requireAttrs(obj, *attributes):
693 """Skip decorated test if obj is missing any of the given attributes.
694
695 Sets client_skip attribute as skipWithClientIf() does.
696 """
697 missing = [name for name in attributes if not hasattr(obj, name)]
698 return skipWithClientIf(
699 missing, "don't have " + ", ".join(name for name in missing))
700
701
702def requireSocket(*args):
703 """Skip decorated test if a socket cannot be created with given arguments.
704
705 When an argument is given as a string, will use the value of that
706 attribute of the socket module, or skip the test if it doesn't
707 exist. Sets client_skip attribute as skipWithClientIf() does.
708 """
709 err = None
710 missing = [obj for obj in args if
711 isinstance(obj, str) and not hasattr(socket, obj)]
712 if missing:
713 err = "don't have " + ", ".join(name for name in missing)
714 else:
715 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
716 for obj in args]
717 try:
718 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200719 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000720 # XXX: check errno?
721 err = str(e)
722 else:
723 s.close()
724 return skipWithClientIf(
725 err is not None,
726 "can't create socket({0}): {1}".format(
727 ", ".join(str(o) for o in args), err))
728
729
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730#######################################################################
731## Begin Tests
732
733class GeneralModuleTests(unittest.TestCase):
734
Ethan Furman7184bac2014-10-14 18:56:53 -0700735 def test_SocketType_is_socketobject(self):
736 import _socket
737 self.assertTrue(socket.SocketType is _socket.socket)
738 s = socket.socket()
739 self.assertIsInstance(s, socket.SocketType)
740 s.close()
741
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000742 def test_repr(self):
743 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200744 with s:
745 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000746 self.assertIn('family=%s' % socket.AF_INET, repr(s))
747 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200748 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200749 self.assertNotIn('raddr', repr(s))
750 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200751 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200752 self.assertIn(str(s.getsockname()), repr(s))
753 self.assertIn('[closed]', repr(s))
754 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000755
Victor Stinnere254e532014-07-26 14:36:55 +0200756 @unittest.skipUnless(_socket is not None, 'need _socket module')
757 def test_csocket_repr(self):
758 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
759 try:
760 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
761 % (s.fileno(), s.family, s.type, s.proto))
762 self.assertEqual(repr(s), expected)
763 finally:
764 s.close()
765 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
766 % (s.family, s.type, s.proto))
767 self.assertEqual(repr(s), expected)
768
Raymond Hettinger027bb632004-05-31 03:09:25 +0000769 def test_weakref(self):
770 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
771 p = proxy(s)
772 self.assertEqual(p.fileno(), s.fileno())
773 s.close()
774 s = None
775 try:
776 p.fileno()
777 except ReferenceError:
778 pass
779 else:
780 self.fail('Socket proxy still exists')
781
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000783 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300784 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200785 with self.assertRaises(OSError, msg=msg % 'OSError'):
786 raise OSError
787 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200789 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000791
Ezio Melotti63e42302011-05-07 19:47:48 +0300792 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000793 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300794 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
795 self.addCleanup(s.close)
796 s.bind(('', 0))
797 sockname = s.getsockname()
798 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300799 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300800 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300801 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400802 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300803 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300804 s.sendto(5j, 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 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300807 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300808 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300809 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300810 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300811 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300812 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300813 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400814 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300815 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300816 s.sendto(5j, 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 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300819 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300820 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300821 self.assertIn('not NoneType', str(cm.exception))
822 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300823 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300824 self.assertIn('an integer is required', str(cm.exception))
825 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300826 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300827 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300828 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300829 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300830 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300831 self.assertIn('(1 given)', str(cm.exception))
832 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300833 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300834 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300835
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000837 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 socket.AF_INET
839 socket.SOCK_STREAM
840 socket.SOCK_DGRAM
841 socket.SOCK_RAW
842 socket.SOCK_RDM
843 socket.SOCK_SEQPACKET
844 socket.SOL_SOCKET
845 socket.SO_REUSEADDR
846
Guido van Rossum654c11e2002-06-13 20:24:17 +0000847 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000849 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000850 try:
851 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200852 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000853 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600854 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000855 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000856 try:
857 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200858 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000859 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600860 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000861 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000862 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000863 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000864 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000865
Charles-François Natali0cc86852013-09-13 19:53:08 +0200866 def test_host_resolution(self):
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700867 for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200868 self.assertEqual(socket.gethostbyname(addr), addr)
869
870 # we don't test support.HOSTv6 because there's a chance it doesn't have
871 # a matching name entry (e.g. 'ip6-localhost')
Gregory P. Smithefb1d0a2017-09-09 00:30:15 -0700872 for host in [support.HOSTv4]:
Charles-François Natali0cc86852013-09-13 19:53:08 +0200873 self.assertIn(host, socket.gethostbyaddr(host)[2])
874
Xiang Zhangd36a7162017-03-07 11:06:09 +0800875 def test_host_resolution_bad_address(self):
876 # These are all malformed IP addresses and expected not to resolve to
877 # any result. But some ISPs, e.g. AWS, may successfully resolve these
878 # IPs.
879 explanation = (
880 "resolving an invalid IP address did not raise OSError; "
881 "can be caused by a broken DNS server"
882 )
883 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
884 '1:1:1:1:1:1:1:1:1']:
885 with self.assertRaises(OSError):
886 socket.gethostbyname(addr)
887 with self.assertRaises(OSError, msg=explanation):
888 socket.gethostbyaddr(addr)
889
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000890 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
891 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
892 def test_sethostname(self):
893 oldhn = socket.gethostname()
894 try:
895 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200896 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000897 if e.errno == errno.EPERM:
898 self.skipTest("test should be run as root")
899 else:
900 raise
901 try:
902 # running test as root!
903 self.assertEqual(socket.gethostname(), 'new')
904 # Should work with bytes objects too
905 socket.sethostname(b'bar')
906 self.assertEqual(socket.gethostname(), 'bar')
907 finally:
908 socket.sethostname(oldhn)
909
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700910 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
911 'socket.if_nameindex() not available.')
912 def testInterfaceNameIndex(self):
913 interfaces = socket.if_nameindex()
914 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200915 self.assertIsInstance(index, int)
916 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700917 # interface indices are non-zero integers
918 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200919 _index = socket.if_nametoindex(name)
920 self.assertIsInstance(_index, int)
921 self.assertEqual(index, _index)
922 _name = socket.if_indextoname(index)
923 self.assertIsInstance(_name, str)
924 self.assertEqual(name, _name)
925
926 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
927 'socket.if_nameindex() not available.')
928 def testInvalidInterfaceNameIndex(self):
929 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200930 self.assertRaises(OSError, socket.if_indextoname, 0)
931 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200932 # test with invalid values
933 self.assertRaises(TypeError, socket.if_nametoindex, 0)
934 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700935
Serhiy Storchaka43767632013-11-03 21:31:38 +0200936 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
937 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000938 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000939 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200940 try:
941 # On some versions, this loses a reference
942 orig = sys.getrefcount(__name__)
943 socket.getnameinfo(__name__,0)
944 except TypeError:
945 if sys.getrefcount(__name__) != orig:
946 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000947
Guido van Rossum24e4af82002-06-12 19:18:08 +0000948 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000949 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000950 try:
951 # On some versions, this crashes the interpreter.
952 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200953 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000954 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000955
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000956 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000957 # This just checks that htons etc. are their own inverse,
958 # when looking at the lower 16 or 32 bits.
959 sizes = {socket.htonl: 32, socket.ntohl: 32,
960 socket.htons: 16, socket.ntohs: 16}
961 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000962 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000963 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
964 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000965
Guido van Rossuma2627af2002-09-14 00:58:46 +0000966 swapped = func(mask)
967 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000968 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000969
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200970 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000971 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300972 import _testcapi
973 s_good_values = [0, 1, 2, 0xffff]
974 l_good_values = s_good_values + [0xffffffff]
975 l_bad_values = [-1, -2, 1<<32, 1<<1000]
976 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
977 _testcapi.INT_MAX + 1]
978 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
979 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000980 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000981 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300982 for k in l_good_values:
983 socket.ntohl(k)
984 socket.htonl(k)
985 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000986 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000987 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300988 for k in l_bad_values:
989 self.assertRaises(OverflowError, socket.ntohl, k)
990 self.assertRaises(OverflowError, socket.htonl, k)
991 for k in s_deprecated_values:
992 self.assertWarns(DeprecationWarning, socket.ntohs, k)
993 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000994
Barry Warsaw11b91a02004-06-28 00:50:43 +0000995 def testGetServBy(self):
996 eq = self.assertEqual
997 # Find one service that exists, then check all the related interfaces.
998 # I've ordered this by protocols that have both a tcp and udp
999 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001000 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001001 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001002 # avoid the 'echo' service on this platform, as there is an
1003 # assumption breaking non-standard port/protocol entry
1004 services = ('daytime', 'qotd', 'domain')
1005 else:
1006 services = ('echo', 'daytime', 'domain')
1007 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001008 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001009 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001010 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001011 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001012 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001013 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001014 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001015 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001016 # Issue #26936: Android getservbyname() was broken before API 23.
1017 if (not hasattr(sys, 'getandroidapilevel') or
1018 sys.getandroidapilevel() >= 23):
1019 port2 = socket.getservbyname(service)
1020 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001021 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001022 try:
1023 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001024 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001025 udpport = None
1026 else:
1027 eq(udpport, port)
1028 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001029 # Issue #26936: Android getservbyport() is broken.
1030 if not support.is_android:
1031 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001032 eq(socket.getservbyport(port, 'tcp'), service)
1033 if udpport is not None:
1034 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001035 # Make sure getservbyport does not accept out of range ports.
1036 self.assertRaises(OverflowError, socket.getservbyport, -1)
1037 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001039 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001040 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001041 # The default timeout should initially be None
1042 self.assertEqual(socket.getdefaulttimeout(), None)
1043 s = socket.socket()
1044 self.assertEqual(s.gettimeout(), None)
1045 s.close()
1046
1047 # Set the default timeout to 10, and see if it propagates
1048 socket.setdefaulttimeout(10)
1049 self.assertEqual(socket.getdefaulttimeout(), 10)
1050 s = socket.socket()
1051 self.assertEqual(s.gettimeout(), 10)
1052 s.close()
1053
1054 # Reset the default timeout to None, and see if it propagates
1055 socket.setdefaulttimeout(None)
1056 self.assertEqual(socket.getdefaulttimeout(), None)
1057 s = socket.socket()
1058 self.assertEqual(s.gettimeout(), None)
1059 s.close()
1060
1061 # Check that setting it to an invalid value raises ValueError
1062 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1063
1064 # Check that setting it to an invalid type raises TypeError
1065 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1066
Serhiy Storchaka43767632013-11-03 21:31:38 +02001067 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1068 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001069 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001070 # Test that issue1008086 and issue767150 are fixed.
1071 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001072 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1073 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001074
Serhiy Storchaka43767632013-11-03 21:31:38 +02001075 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1076 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001077 def testIPv4toString(self):
1078 from socket import inet_aton as f, inet_pton, AF_INET
1079 g = lambda a: inet_pton(AF_INET, a)
1080
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001081 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001082 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001083 )
1084
Ezio Melottib3aedd42010-11-20 19:04:17 +00001085 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1086 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1087 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1088 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1089 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001090 # bpo-29972: inet_pton() doesn't fail on AIX
1091 if not sys.platform.startswith('aix'):
1092 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001093 assertInvalid(f, '300.0.0.0')
1094 assertInvalid(f, 'a.0.0.0')
1095 assertInvalid(f, '1.2.3.4.5')
1096 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001097
Ezio Melottib3aedd42010-11-20 19:04:17 +00001098 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1099 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1100 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1101 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001102 assertInvalid(g, '0.0.0.')
1103 assertInvalid(g, '300.0.0.0')
1104 assertInvalid(g, 'a.0.0.0')
1105 assertInvalid(g, '1.2.3.4.5')
1106 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001107
Serhiy Storchaka43767632013-11-03 21:31:38 +02001108 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1109 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001110 def testIPv6toString(self):
1111 try:
1112 from socket import inet_pton, AF_INET6, has_ipv6
1113 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001114 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001115 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001116 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001117
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001118 if sys.platform == "win32":
1119 try:
1120 inet_pton(AF_INET6, '::')
1121 except OSError as e:
1122 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001123 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001124
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001125 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001126 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001127 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001128 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001129
Ezio Melottib3aedd42010-11-20 19:04:17 +00001130 self.assertEqual(b'\x00' * 16, f('::'))
1131 self.assertEqual(b'\x00' * 16, f('0::0'))
1132 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1133 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001134 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 +00001135 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1136 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001137 self.assertEqual(
1138 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1139 f('ad42:abc::127:0:254:2')
1140 )
1141 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1142 assertInvalid('0x20::')
1143 assertInvalid(':::')
1144 assertInvalid('::0::')
1145 assertInvalid('1::abc::')
1146 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001147 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001148 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001149 # bpo-29972: inet_pton() doesn't fail on AIX
1150 if not sys.platform.startswith('aix'):
1151 assertInvalid('1:2:3:4:5:6:')
1152 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001153
1154 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1155 f('::254.42.23.64')
1156 )
1157 self.assertEqual(
1158 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1159 f('42::a29b:254.42.23.64')
1160 )
1161 self.assertEqual(
1162 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1163 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1164 )
1165 assertInvalid('255.254.253.252')
1166 assertInvalid('1::260.2.3.0')
1167 assertInvalid('1::0.be.e.0')
1168 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1169 assertInvalid('::1.2.3.4:0')
1170 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001171
Serhiy Storchaka43767632013-11-03 21:31:38 +02001172 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1173 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001174 def testStringToIPv4(self):
1175 from socket import inet_ntoa as f, inet_ntop, AF_INET
1176 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001177 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001178 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001179 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001180
Ezio Melottib3aedd42010-11-20 19:04:17 +00001181 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1182 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1183 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1184 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001185 assertInvalid(f, b'\x00' * 3)
1186 assertInvalid(f, b'\x00' * 5)
1187 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001188 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001189
Ezio Melottib3aedd42010-11-20 19:04:17 +00001190 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1191 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1192 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001193 assertInvalid(g, b'\x00' * 3)
1194 assertInvalid(g, b'\x00' * 5)
1195 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001196 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001197
Serhiy Storchaka43767632013-11-03 21:31:38 +02001198 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1199 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001200 def testStringToIPv6(self):
1201 try:
1202 from socket import inet_ntop, AF_INET6, has_ipv6
1203 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001204 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001205 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001206 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001207
1208 if sys.platform == "win32":
1209 try:
1210 inet_ntop(AF_INET6, b'\x00' * 16)
1211 except OSError as e:
1212 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001213 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001214
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001215 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001216 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001217 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001218 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001219
Ezio Melottib3aedd42010-11-20 19:04:17 +00001220 self.assertEqual('::', f(b'\x00' * 16))
1221 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1222 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001223 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001224 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 +00001225 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001226 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001227
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001228 assertInvalid(b'\x12' * 15)
1229 assertInvalid(b'\x12' * 17)
1230 assertInvalid(b'\x12' * 4)
1231
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001232 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001233
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001234 def testSockName(self):
1235 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001236 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001237 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001238 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001239 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001240 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001241 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1242 # it reasonable to get the host's addr in addition to 0.0.0.0.
1243 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001244 try:
1245 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001246 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001247 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001248 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001249 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001250 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001251
1252 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001253 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001254 # We know a socket should start without reuse==0
1255 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001256 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001257 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001258 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001259
1260 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001261 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001262 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001263 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001264 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1265 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001266 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001267
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001268 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001269 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001270 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1271 sock.settimeout(1)
1272 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001273 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001274
Martin Panter50ab1a32016-04-11 00:38:12 +00001275 def testCloseException(self):
1276 sock = socket.socket()
1277 socket.socket(fileno=sock.fileno()).close()
1278 try:
1279 sock.close()
1280 except OSError as err:
1281 # Winsock apparently raises ENOTSOCK
1282 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1283 else:
1284 self.fail("close() should raise EBADF/ENOTSOCK")
1285
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001286 def testNewAttributes(self):
1287 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001288
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001289 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1290 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001291 if hasattr(socket, 'SOCK_CLOEXEC'):
1292 self.assertIn(sock.type,
1293 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1294 socket.SOCK_STREAM))
1295 else:
1296 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001297 self.assertEqual(sock.proto, 0)
1298 sock.close()
1299
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001300 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001301 sock = socket.socket()
1302 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001303 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001304 big_port = port + 65536
1305 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001306 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1307 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1308 # Since find_unused_port() is inherently subject to race conditions, we
1309 # call it a couple times if necessary.
1310 for i in itertools.count():
1311 port = support.find_unused_port()
1312 try:
1313 sock.bind((HOST, port))
1314 except OSError as e:
1315 if e.errno != errno.EADDRINUSE or i == 5:
1316 raise
1317 else:
1318 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001319
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001320 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001321 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001322 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1323 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1324 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1325 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001326 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1327 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001328 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001329 self.assertRaises(ValueError, s.ioctl, -1, None)
1330 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001331
Steve Dowerea93ac02016-06-17 12:52:18 -07001332 @unittest.skipUnless(os.name == "nt", "Windows specific")
1333 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1334 'Loopback fast path support required for this test')
1335 def test_sio_loopback_fast_path(self):
1336 s = socket.socket()
1337 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001338 try:
1339 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1340 except OSError as exc:
1341 WSAEOPNOTSUPP = 10045
1342 if exc.winerror == WSAEOPNOTSUPP:
1343 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1344 "doesn't implemented in this Windows version")
1345 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001346 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1347
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001348 def testGetaddrinfo(self):
1349 try:
1350 socket.getaddrinfo('localhost', 80)
1351 except socket.gaierror as err:
1352 if err.errno == socket.EAI_SERVICE:
1353 # see http://bugs.python.org/issue1282647
1354 self.skipTest("buggy libc version")
1355 raise
1356 # len of every sequence is supposed to be == 5
1357 for info in socket.getaddrinfo(HOST, None):
1358 self.assertEqual(len(info), 5)
1359 # host can be a domain name, a string representation of an
1360 # IPv4/v6 address or None
1361 socket.getaddrinfo('localhost', 80)
1362 socket.getaddrinfo('127.0.0.1', 80)
1363 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001364 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001365 socket.getaddrinfo('::1', 80)
1366 # port can be a string service name such as "http", a numeric
1367 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001368 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1369 if (not hasattr(sys, 'getandroidapilevel') or
1370 sys.getandroidapilevel() >= 23):
1371 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001372 socket.getaddrinfo(HOST, 80)
1373 socket.getaddrinfo(HOST, None)
1374 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001375 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1376 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001377 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001378 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1379 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001380 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001381 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1382 for _, socktype, _, _, _ in infos:
1383 self.assertEqual(socktype, socket.SOCK_STREAM)
1384 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001385 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001386 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1387 # a server willing to support both IPv4 and IPv6 will
1388 # usually do this
1389 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1390 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001391 # test keyword arguments
1392 a = socket.getaddrinfo(HOST, None)
1393 b = socket.getaddrinfo(host=HOST, port=None)
1394 self.assertEqual(a, b)
1395 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1396 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1397 self.assertEqual(a, b)
1398 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1399 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1400 self.assertEqual(a, b)
1401 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1402 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1403 self.assertEqual(a, b)
1404 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1405 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1406 self.assertEqual(a, b)
1407 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1408 socket.AI_PASSIVE)
1409 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1410 type=socket.SOCK_STREAM, proto=0,
1411 flags=socket.AI_PASSIVE)
1412 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001413 # Issue #6697.
1414 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001415
Ned Deilyb24f4812014-02-13 22:50:42 -08001416 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001417 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001418 try:
1419 # The arguments here are undefined and the call may succeed
1420 # or fail. All we care here is that it doesn't segfault.
1421 socket.getaddrinfo("localhost", None, 0, 0, 0,
1422 socket.AI_NUMERICSERV)
1423 except socket.gaierror:
1424 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001425
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001426 def test_getnameinfo(self):
1427 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001428 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001429
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001430 @unittest.skipUnless(support.is_resource_enabled('network'),
1431 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001432 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001433 # Check for internet access before running test
1434 # (issue #12804, issue #25138).
1435 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001436 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001437
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001438 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001439 domain = 'испытание.pythontest.net'
1440 socket.gethostbyname(domain)
1441 socket.gethostbyname_ex(domain)
1442 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001443 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1444 # have a reverse entry yet
1445 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001446
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001447 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001448 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001449 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1450 self.skipTest("signal.alarm and socket.socketpair required for this test")
1451 # Our signal handlers clobber the C errno by calling a math function
1452 # with an invalid domain value.
1453 def ok_handler(*args):
1454 self.assertRaises(ValueError, math.acosh, 0)
1455 def raising_handler(*args):
1456 self.assertRaises(ValueError, math.acosh, 0)
1457 1 // 0
1458 c, s = socket.socketpair()
1459 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1460 try:
1461 if with_timeout:
1462 # Just above the one second minimum for signal.alarm
1463 c.settimeout(1.5)
1464 with self.assertRaises(ZeroDivisionError):
1465 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001466 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001467 if with_timeout:
1468 signal.signal(signal.SIGALRM, ok_handler)
1469 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001470 self.assertRaises(socket.timeout, c.sendall,
1471 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001472 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001473 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001474 signal.signal(signal.SIGALRM, old_alarm)
1475 c.close()
1476 s.close()
1477
1478 def test_sendall_interrupted(self):
1479 self.check_sendall_interrupted(False)
1480
1481 def test_sendall_interrupted_with_timeout(self):
1482 self.check_sendall_interrupted(True)
1483
Antoine Pitroue033e062010-10-29 10:38:18 +00001484 def test_dealloc_warn(self):
1485 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1486 r = repr(sock)
1487 with self.assertWarns(ResourceWarning) as cm:
1488 sock = None
1489 support.gc_collect()
1490 self.assertIn(r, str(cm.warning.args[0]))
1491 # An open socket file object gets dereferenced after the socket
1492 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1493 f = sock.makefile('rb')
1494 r = repr(sock)
1495 sock = None
1496 support.gc_collect()
1497 with self.assertWarns(ResourceWarning):
1498 f = None
1499 support.gc_collect()
1500
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001501 def test_name_closed_socketio(self):
1502 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1503 fp = sock.makefile("rb")
1504 fp.close()
1505 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1506
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001507 def test_unusable_closed_socketio(self):
1508 with socket.socket() as sock:
1509 fp = sock.makefile("rb", buffering=0)
1510 self.assertTrue(fp.readable())
1511 self.assertFalse(fp.writable())
1512 self.assertFalse(fp.seekable())
1513 fp.close()
1514 self.assertRaises(ValueError, fp.readable)
1515 self.assertRaises(ValueError, fp.writable)
1516 self.assertRaises(ValueError, fp.seekable)
1517
Berker Peksag3fe64d02016-02-18 17:34:00 +02001518 def test_makefile_mode(self):
1519 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1520 with self.subTest(mode=mode):
1521 with socket.socket() as sock:
1522 with sock.makefile(mode) as fp:
1523 self.assertEqual(fp.mode, mode)
1524
1525 def test_makefile_invalid_mode(self):
1526 for mode in 'rt', 'x', '+', 'a':
1527 with self.subTest(mode=mode):
1528 with socket.socket() as sock:
1529 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1530 sock.makefile(mode)
1531
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001532 def test_pickle(self):
1533 sock = socket.socket()
1534 with sock:
1535 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1536 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001537 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1538 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1539 self.assertEqual(family, socket.AF_INET)
1540 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1541 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001542
Serhiy Storchaka78980432013-01-15 01:12:17 +02001543 def test_listen_backlog(self):
1544 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001545 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1546 srv.bind((HOST, 0))
1547 srv.listen(backlog)
1548
1549 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001550 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001551 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001552
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001553 @support.cpython_only
1554 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001555 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001556 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001557 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1558 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001559 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001560 srv.close()
1561
Charles-François Natali42663332012-01-02 15:57:30 +01001562 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001563 def test_flowinfo(self):
1564 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001565 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001566 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001567 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001568
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001569 def test_str_for_enums(self):
1570 # Make sure that the AF_* and SOCK_* constants have enum-like string
1571 # reprs.
1572 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1573 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001574 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001575
1576 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1577 def test_uknown_socket_family_repr(self):
1578 # Test that when created with a family that's not one of the known
1579 # AF_*/SOCK_* constants, socket.family just returns the number.
1580 #
1581 # To do this we fool socket.socket into believing it already has an
1582 # open fd because on this path it doesn't actually verify the family and
1583 # type and populates the socket object.
1584 #
1585 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001586 fd, path = tempfile.mkstemp()
1587 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001588 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1589 self.assertEqual(s.family, 42424)
1590 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001591
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001592 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1593 def test__sendfile_use_sendfile(self):
1594 class File:
1595 def __init__(self, fd):
1596 self.fd = fd
1597
1598 def fileno(self):
1599 return self.fd
1600 with socket.socket() as sock:
1601 fd = os.open(os.curdir, os.O_RDONLY)
1602 os.close(fd)
1603 with self.assertRaises(socket._GiveupOnSendfile):
1604 sock._sendfile_use_sendfile(File(fd))
1605 with self.assertRaises(OverflowError):
1606 sock._sendfile_use_sendfile(File(2**1000))
1607 with self.assertRaises(TypeError):
1608 sock._sendfile_use_sendfile(File(None))
1609
1610
Charles-François Natali47413c12011-10-06 19:47:44 +02001611@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1612class BasicCANTest(unittest.TestCase):
1613
1614 def testCrucialConstants(self):
1615 socket.AF_CAN
1616 socket.PF_CAN
1617 socket.CAN_RAW
1618
Charles-François Natali773e42d2013-02-05 19:42:01 +01001619 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1620 'socket.CAN_BCM required for this test.')
1621 def testBCMConstants(self):
1622 socket.CAN_BCM
1623
1624 # opcodes
1625 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1626 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1627 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1628 socket.CAN_BCM_TX_SEND # send one CAN frame
1629 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1630 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1631 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1632 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1633 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1634 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1635 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1636 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1637
Charles-François Natali47413c12011-10-06 19:47:44 +02001638 def testCreateSocket(self):
1639 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1640 pass
1641
Charles-François Natali773e42d2013-02-05 19:42:01 +01001642 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1643 'socket.CAN_BCM required for this test.')
1644 def testCreateBCMSocket(self):
1645 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1646 pass
1647
Charles-François Natali47413c12011-10-06 19:47:44 +02001648 def testBindAny(self):
1649 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1650 s.bind(('', ))
1651
1652 def testTooLongInterfaceName(self):
1653 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1654 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001655 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001656 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001657
1658 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1659 'socket.CAN_RAW_LOOPBACK required for this test.')
1660 def testLoopback(self):
1661 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1662 for loopback in (0, 1):
1663 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1664 loopback)
1665 self.assertEqual(loopback,
1666 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1667
1668 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1669 'socket.CAN_RAW_FILTER required for this test.')
1670 def testFilter(self):
1671 can_id, can_mask = 0x200, 0x700
1672 can_filter = struct.pack("=II", can_id, can_mask)
1673 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1674 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1675 self.assertEqual(can_filter,
1676 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001677 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001678
1679
1680@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001681class CANTest(ThreadedCANSocketTest):
1682
Charles-François Natali47413c12011-10-06 19:47:44 +02001683 def __init__(self, methodName='runTest'):
1684 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1685
1686 @classmethod
1687 def build_can_frame(cls, can_id, data):
1688 """Build a CAN frame."""
1689 can_dlc = len(data)
1690 data = data.ljust(8, b'\x00')
1691 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1692
1693 @classmethod
1694 def dissect_can_frame(cls, frame):
1695 """Dissect a CAN frame."""
1696 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1697 return (can_id, can_dlc, data[:can_dlc])
1698
1699 def testSendFrame(self):
1700 cf, addr = self.s.recvfrom(self.bufsize)
1701 self.assertEqual(self.cf, cf)
1702 self.assertEqual(addr[0], self.interface)
1703 self.assertEqual(addr[1], socket.AF_CAN)
1704
1705 def _testSendFrame(self):
1706 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1707 self.cli.send(self.cf)
1708
1709 def testSendMaxFrame(self):
1710 cf, addr = self.s.recvfrom(self.bufsize)
1711 self.assertEqual(self.cf, cf)
1712
1713 def _testSendMaxFrame(self):
1714 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1715 self.cli.send(self.cf)
1716
1717 def testSendMultiFrames(self):
1718 cf, addr = self.s.recvfrom(self.bufsize)
1719 self.assertEqual(self.cf1, cf)
1720
1721 cf, addr = self.s.recvfrom(self.bufsize)
1722 self.assertEqual(self.cf2, cf)
1723
1724 def _testSendMultiFrames(self):
1725 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1726 self.cli.send(self.cf1)
1727
1728 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1729 self.cli.send(self.cf2)
1730
Charles-François Natali773e42d2013-02-05 19:42:01 +01001731 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1732 'socket.CAN_BCM required for this test.')
1733 def _testBCM(self):
1734 cf, addr = self.cli.recvfrom(self.bufsize)
1735 self.assertEqual(self.cf, cf)
1736 can_id, can_dlc, data = self.dissect_can_frame(cf)
1737 self.assertEqual(self.can_id, can_id)
1738 self.assertEqual(self.data, data)
1739
1740 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1741 'socket.CAN_BCM required for this test.')
1742 def testBCM(self):
1743 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1744 self.addCleanup(bcm.close)
1745 bcm.connect((self.interface,))
1746 self.can_id = 0x123
1747 self.data = bytes([0xc0, 0xff, 0xee])
1748 self.cf = self.build_can_frame(self.can_id, self.data)
1749 opcode = socket.CAN_BCM_TX_SEND
1750 flags = 0
1751 count = 0
1752 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1753 bcm_can_id = 0x0222
1754 nframes = 1
1755 assert len(self.cf) == 16
1756 header = struct.pack(self.bcm_cmd_msg_fmt,
1757 opcode,
1758 flags,
1759 count,
1760 ival1_seconds,
1761 ival1_usec,
1762 ival2_seconds,
1763 ival2_usec,
1764 bcm_can_id,
1765 nframes,
1766 )
1767 header_plus_frame = header + self.cf
1768 bytes_sent = bcm.send(header_plus_frame)
1769 self.assertEqual(bytes_sent, len(header_plus_frame))
1770
Charles-François Natali47413c12011-10-06 19:47:44 +02001771
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001772@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1773class ISOTPTest(unittest.TestCase):
1774
1775 def __init__(self, *args, **kwargs):
1776 super().__init__(*args, **kwargs)
1777 self.interface = "vcan0"
1778
1779 def testCrucialConstants(self):
1780 socket.AF_CAN
1781 socket.PF_CAN
1782 socket.CAN_ISOTP
1783 socket.SOCK_DGRAM
1784
1785 def testCreateSocket(self):
1786 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1787 pass
1788
1789 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1790 'socket.CAN_ISOTP required for this test.')
1791 def testCreateISOTPSocket(self):
1792 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1793 pass
1794
1795 def testTooLongInterfaceName(self):
1796 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1797 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1798 with self.assertRaisesRegex(OSError, 'interface name too long'):
1799 s.bind(('x' * 1024, 1, 2))
1800
1801 def testBind(self):
1802 try:
1803 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1804 addr = self.interface, 0x123, 0x456
1805 s.bind(addr)
1806 self.assertEqual(s.getsockname(), addr)
1807 except OSError as e:
1808 if e.errno == errno.ENODEV:
1809 self.skipTest('network interface `%s` does not exist' %
1810 self.interface)
1811 else:
1812 raise
1813
1814
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001815@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1816class BasicRDSTest(unittest.TestCase):
1817
1818 def testCrucialConstants(self):
1819 socket.AF_RDS
1820 socket.PF_RDS
1821
1822 def testCreateSocket(self):
1823 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1824 pass
1825
1826 def testSocketBufferSize(self):
1827 bufsize = 16384
1828 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1829 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1830 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1831
1832
1833@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001834class RDSTest(ThreadedRDSSocketTest):
1835
1836 def __init__(self, methodName='runTest'):
1837 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1838
Charles-François Natali240c55f2011-11-10 20:33:36 +01001839 def setUp(self):
1840 super().setUp()
1841 self.evt = threading.Event()
1842
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001843 def testSendAndRecv(self):
1844 data, addr = self.serv.recvfrom(self.bufsize)
1845 self.assertEqual(self.data, data)
1846 self.assertEqual(self.cli_addr, addr)
1847
1848 def _testSendAndRecv(self):
1849 self.data = b'spam'
1850 self.cli.sendto(self.data, 0, (HOST, self.port))
1851
1852 def testPeek(self):
1853 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1854 self.assertEqual(self.data, data)
1855 data, addr = self.serv.recvfrom(self.bufsize)
1856 self.assertEqual(self.data, data)
1857
1858 def _testPeek(self):
1859 self.data = b'spam'
1860 self.cli.sendto(self.data, 0, (HOST, self.port))
1861
1862 @requireAttrs(socket.socket, 'recvmsg')
1863 def testSendAndRecvMsg(self):
1864 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1865 self.assertEqual(self.data, data)
1866
1867 @requireAttrs(socket.socket, 'sendmsg')
1868 def _testSendAndRecvMsg(self):
1869 self.data = b'hello ' * 10
1870 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1871
1872 def testSendAndRecvMulti(self):
1873 data, addr = self.serv.recvfrom(self.bufsize)
1874 self.assertEqual(self.data1, data)
1875
1876 data, addr = self.serv.recvfrom(self.bufsize)
1877 self.assertEqual(self.data2, data)
1878
1879 def _testSendAndRecvMulti(self):
1880 self.data1 = b'bacon'
1881 self.cli.sendto(self.data1, 0, (HOST, self.port))
1882
1883 self.data2 = b'egg'
1884 self.cli.sendto(self.data2, 0, (HOST, self.port))
1885
1886 def testSelect(self):
1887 r, w, x = select.select([self.serv], [], [], 3.0)
1888 self.assertIn(self.serv, r)
1889 data, addr = self.serv.recvfrom(self.bufsize)
1890 self.assertEqual(self.data, data)
1891
1892 def _testSelect(self):
1893 self.data = b'select'
1894 self.cli.sendto(self.data, 0, (HOST, self.port))
1895
1896 def testCongestion(self):
1897 # wait until the sender is done
1898 self.evt.wait()
1899
1900 def _testCongestion(self):
1901 # test the behavior in case of congestion
1902 self.data = b'fill'
1903 self.cli.setblocking(False)
1904 try:
1905 # try to lower the receiver's socket buffer size
1906 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1907 except OSError:
1908 pass
1909 with self.assertRaises(OSError) as cm:
1910 try:
1911 # fill the receiver's socket buffer
1912 while True:
1913 self.cli.sendto(self.data, 0, (HOST, self.port))
1914 finally:
1915 # signal the receiver we're done
1916 self.evt.set()
1917 # sendto() should have failed with ENOBUFS
1918 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1919 # and we should have received a congestion notification through poll
1920 r, w, x = select.select([self.serv], [], [], 3.0)
1921 self.assertIn(self.serv, r)
1922
1923
caaveryeffc12f2017-09-06 18:18:10 -04001924@unittest.skipIf(fcntl is None, "need fcntl")
1925@unittest.skipUnless(HAVE_SOCKET_VSOCK,
1926 'VSOCK sockets required for this test.')
1927class BasicVSOCKTest(unittest.TestCase):
1928
1929 def testCrucialConstants(self):
1930 socket.AF_VSOCK
1931
1932 def testVSOCKConstants(self):
1933 socket.SO_VM_SOCKETS_BUFFER_SIZE
1934 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
1935 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
1936 socket.VMADDR_CID_ANY
1937 socket.VMADDR_PORT_ANY
1938 socket.VMADDR_CID_HOST
1939 socket.VM_SOCKETS_INVALID_VERSION
1940 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
1941
1942 def testCreateSocket(self):
1943 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1944 pass
1945
1946 def testSocketBufferSize(self):
1947 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1948 orig_max = s.getsockopt(socket.AF_VSOCK,
1949 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
1950 orig = s.getsockopt(socket.AF_VSOCK,
1951 socket.SO_VM_SOCKETS_BUFFER_SIZE)
1952 orig_min = s.getsockopt(socket.AF_VSOCK,
1953 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
1954
1955 s.setsockopt(socket.AF_VSOCK,
1956 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
1957 s.setsockopt(socket.AF_VSOCK,
1958 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
1959 s.setsockopt(socket.AF_VSOCK,
1960 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
1961
1962 self.assertEqual(orig_max * 2,
1963 s.getsockopt(socket.AF_VSOCK,
1964 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
1965 self.assertEqual(orig * 2,
1966 s.getsockopt(socket.AF_VSOCK,
1967 socket.SO_VM_SOCKETS_BUFFER_SIZE))
1968 self.assertEqual(orig_min * 2,
1969 s.getsockopt(socket.AF_VSOCK,
1970 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
1971
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001972
Guido van Rossum24e4af82002-06-12 19:18:08 +00001973class BasicTCPTest(SocketConnectedTest):
1974
1975 def __init__(self, methodName='runTest'):
1976 SocketConnectedTest.__init__(self, methodName=methodName)
1977
1978 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001979 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001980 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001981 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001982
1983 def _testRecv(self):
1984 self.serv_conn.send(MSG)
1985
1986 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001987 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001988 seg1 = self.cli_conn.recv(len(MSG) - 3)
1989 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001990 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001991 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001992
1993 def _testOverFlowRecv(self):
1994 self.serv_conn.send(MSG)
1995
1996 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001997 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001998 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001999 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002000
2001 def _testRecvFrom(self):
2002 self.serv_conn.send(MSG)
2003
2004 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002005 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002006 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2007 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002008 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002009 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002010
2011 def _testOverFlowRecvFrom(self):
2012 self.serv_conn.send(MSG)
2013
2014 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002015 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002016 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002017 while 1:
2018 read = self.cli_conn.recv(1024)
2019 if not read:
2020 break
Guido van Rossume531e292002-08-08 20:28:34 +00002021 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002022 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002023
2024 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002025 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002026 self.serv_conn.sendall(big_chunk)
2027
2028 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002029 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002030 fd = self.cli_conn.fileno()
2031 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002032 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002033 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002034 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002035 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002036
2037 def _testFromFd(self):
2038 self.serv_conn.send(MSG)
2039
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002040 def testDup(self):
2041 # Testing dup()
2042 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002043 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002044 msg = sock.recv(1024)
2045 self.assertEqual(msg, MSG)
2046
2047 def _testDup(self):
2048 self.serv_conn.send(MSG)
2049
Guido van Rossum24e4af82002-06-12 19:18:08 +00002050 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002051 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002052 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002053 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002054 # wait for _testShutdown to finish: on OS X, when the server
2055 # closes the connection the client also becomes disconnected,
2056 # and the client's shutdown call will fail. (Issue #4397.)
2057 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002058
2059 def _testShutdown(self):
2060 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002061 self.serv_conn.shutdown(2)
2062
2063 testShutdown_overflow = support.cpython_only(testShutdown)
2064
2065 @support.cpython_only
2066 def _testShutdown_overflow(self):
2067 import _testcapi
2068 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002069 # Issue 15989
2070 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2071 _testcapi.INT_MAX + 1)
2072 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2073 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002074 self.serv_conn.shutdown(2)
2075
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002076 def testDetach(self):
2077 # Testing detach()
2078 fileno = self.cli_conn.fileno()
2079 f = self.cli_conn.detach()
2080 self.assertEqual(f, fileno)
2081 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002082 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002083 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002084 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002085 # ...but we can create another socket using the (still open)
2086 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002087 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002088 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002089 msg = sock.recv(1024)
2090 self.assertEqual(msg, MSG)
2091
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002092 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002093 self.serv_conn.send(MSG)
2094
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02002095
Guido van Rossum24e4af82002-06-12 19:18:08 +00002096class BasicUDPTest(ThreadedUDPSocketTest):
2097
2098 def __init__(self, methodName='runTest'):
2099 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2100
2101 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002102 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002103 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002104 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002105
2106 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002107 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002108
Guido van Rossum1c938012002-06-12 21:17:20 +00002109 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002110 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002111 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002112 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002113
Guido van Rossum1c938012002-06-12 21:17:20 +00002114 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002115 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002116
Guido van Rossumd8faa362007-04-27 19:54:29 +00002117 def testRecvFromNegative(self):
2118 # Negative lengths passed to recvfrom should give ValueError.
2119 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2120
2121 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002122 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002123
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002124# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2125# same test code is used with different families and types of socket
2126# (e.g. stream, datagram), and tests using recvmsg() are repeated
2127# using recvmsg_into().
2128#
2129# The generic test classes such as SendmsgTests and
2130# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2131# supplied with sockets cli_sock and serv_sock representing the
2132# client's and the server's end of the connection respectively, and
2133# attributes cli_addr and serv_addr holding their (numeric where
2134# appropriate) addresses.
2135#
2136# The final concrete test classes combine these with subclasses of
2137# SocketTestBase which set up client and server sockets of a specific
2138# type, and with subclasses of SendrecvmsgBase such as
2139# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2140# sockets to cli_sock and serv_sock and override the methods and
2141# attributes of SendrecvmsgBase to fill in destination addresses if
2142# needed when sending, check for specific flags in msg_flags, etc.
2143#
2144# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2145# recvmsg_into().
2146
2147# XXX: like the other datagram (UDP) tests in this module, the code
2148# here assumes that datagram delivery on the local machine will be
2149# reliable.
2150
2151class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2152 # Base class for sendmsg()/recvmsg() tests.
2153
2154 # Time in seconds to wait before considering a test failed, or
2155 # None for no timeout. Not all tests actually set a timeout.
2156 fail_timeout = 3.0
2157
2158 def setUp(self):
2159 self.misc_event = threading.Event()
2160 super().setUp()
2161
2162 def sendToServer(self, msg):
2163 # Send msg to the server.
2164 return self.cli_sock.send(msg)
2165
2166 # Tuple of alternative default arguments for sendmsg() when called
2167 # via sendmsgToServer() (e.g. to include a destination address).
2168 sendmsg_to_server_defaults = ()
2169
2170 def sendmsgToServer(self, *args):
2171 # Call sendmsg() on self.cli_sock with the given arguments,
2172 # filling in any arguments which are not supplied with the
2173 # corresponding items of self.sendmsg_to_server_defaults, if
2174 # any.
2175 return self.cli_sock.sendmsg(
2176 *(args + self.sendmsg_to_server_defaults[len(args):]))
2177
2178 def doRecvmsg(self, sock, bufsize, *args):
2179 # Call recvmsg() on sock with given arguments and return its
2180 # result. Should be used for tests which can use either
2181 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2182 # this method with one which emulates it using recvmsg_into(),
2183 # thus allowing the same test to be used for both methods.
2184 result = sock.recvmsg(bufsize, *args)
2185 self.registerRecvmsgResult(result)
2186 return result
2187
2188 def registerRecvmsgResult(self, result):
2189 # Called by doRecvmsg() with the return value of recvmsg() or
2190 # recvmsg_into(). Can be overridden to arrange cleanup based
2191 # on the returned ancillary data, for instance.
2192 pass
2193
2194 def checkRecvmsgAddress(self, addr1, addr2):
2195 # Called to compare the received address with the address of
2196 # the peer.
2197 self.assertEqual(addr1, addr2)
2198
2199 # Flags that are normally unset in msg_flags
2200 msg_flags_common_unset = 0
2201 for name in ("MSG_CTRUNC", "MSG_OOB"):
2202 msg_flags_common_unset |= getattr(socket, name, 0)
2203
2204 # Flags that are normally set
2205 msg_flags_common_set = 0
2206
2207 # Flags set when a complete record has been received (e.g. MSG_EOR
2208 # for SCTP)
2209 msg_flags_eor_indicator = 0
2210
2211 # Flags set when a complete record has not been received
2212 # (e.g. MSG_TRUNC for datagram sockets)
2213 msg_flags_non_eor_indicator = 0
2214
2215 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2216 # Method to check the value of msg_flags returned by recvmsg[_into]().
2217 #
2218 # Checks that all bits in msg_flags_common_set attribute are
2219 # set in "flags" and all bits in msg_flags_common_unset are
2220 # unset.
2221 #
2222 # The "eor" argument specifies whether the flags should
2223 # indicate that a full record (or datagram) has been received.
2224 # If "eor" is None, no checks are done; otherwise, checks
2225 # that:
2226 #
2227 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2228 # set and all bits in msg_flags_non_eor_indicator are unset
2229 #
2230 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2231 # are set and all bits in msg_flags_eor_indicator are unset
2232 #
2233 # If "checkset" and/or "checkunset" are supplied, they require
2234 # the given bits to be set or unset respectively, overriding
2235 # what the attributes require for those bits.
2236 #
2237 # If any bits are set in "ignore", they will not be checked,
2238 # regardless of the other inputs.
2239 #
2240 # Will raise Exception if the inputs require a bit to be both
2241 # set and unset, and it is not ignored.
2242
2243 defaultset = self.msg_flags_common_set
2244 defaultunset = self.msg_flags_common_unset
2245
2246 if eor:
2247 defaultset |= self.msg_flags_eor_indicator
2248 defaultunset |= self.msg_flags_non_eor_indicator
2249 elif eor is not None:
2250 defaultset |= self.msg_flags_non_eor_indicator
2251 defaultunset |= self.msg_flags_eor_indicator
2252
2253 # Function arguments override defaults
2254 defaultset &= ~checkunset
2255 defaultunset &= ~checkset
2256
2257 # Merge arguments with remaining defaults, and check for conflicts
2258 checkset |= defaultset
2259 checkunset |= defaultunset
2260 inboth = checkset & checkunset & ~ignore
2261 if inboth:
2262 raise Exception("contradictory set, unset requirements for flags "
2263 "{0:#x}".format(inboth))
2264
2265 # Compare with given msg_flags value
2266 mask = (checkset | checkunset) & ~ignore
2267 self.assertEqual(flags & mask, checkset & mask)
2268
2269
2270class RecvmsgIntoMixin(SendrecvmsgBase):
2271 # Mixin to implement doRecvmsg() using recvmsg_into().
2272
2273 def doRecvmsg(self, sock, bufsize, *args):
2274 buf = bytearray(bufsize)
2275 result = sock.recvmsg_into([buf], *args)
2276 self.registerRecvmsgResult(result)
2277 self.assertGreaterEqual(result[0], 0)
2278 self.assertLessEqual(result[0], bufsize)
2279 return (bytes(buf[:result[0]]),) + result[1:]
2280
2281
2282class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2283 # Defines flags to be checked in msg_flags for datagram sockets.
2284
2285 @property
2286 def msg_flags_non_eor_indicator(self):
2287 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2288
2289
2290class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2291 # Defines flags to be checked in msg_flags for SCTP sockets.
2292
2293 @property
2294 def msg_flags_eor_indicator(self):
2295 return super().msg_flags_eor_indicator | socket.MSG_EOR
2296
2297
2298class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2299 # Base class for tests on connectionless-mode sockets. Users must
2300 # supply sockets on attributes cli and serv to be mapped to
2301 # cli_sock and serv_sock respectively.
2302
2303 @property
2304 def serv_sock(self):
2305 return self.serv
2306
2307 @property
2308 def cli_sock(self):
2309 return self.cli
2310
2311 @property
2312 def sendmsg_to_server_defaults(self):
2313 return ([], [], 0, self.serv_addr)
2314
2315 def sendToServer(self, msg):
2316 return self.cli_sock.sendto(msg, self.serv_addr)
2317
2318
2319class SendrecvmsgConnectedBase(SendrecvmsgBase):
2320 # Base class for tests on connected sockets. Users must supply
2321 # sockets on attributes serv_conn and cli_conn (representing the
2322 # connections *to* the server and the client), to be mapped to
2323 # cli_sock and serv_sock respectively.
2324
2325 @property
2326 def serv_sock(self):
2327 return self.cli_conn
2328
2329 @property
2330 def cli_sock(self):
2331 return self.serv_conn
2332
2333 def checkRecvmsgAddress(self, addr1, addr2):
2334 # Address is currently "unspecified" for a connected socket,
2335 # so we don't examine it
2336 pass
2337
2338
2339class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2340 # Base class to set a timeout on server's socket.
2341
2342 def setUp(self):
2343 super().setUp()
2344 self.serv_sock.settimeout(self.fail_timeout)
2345
2346
2347class SendmsgTests(SendrecvmsgServerTimeoutBase):
2348 # Tests for sendmsg() which can use any socket type and do not
2349 # involve recvmsg() or recvmsg_into().
2350
2351 def testSendmsg(self):
2352 # Send a simple message with sendmsg().
2353 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2354
2355 def _testSendmsg(self):
2356 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2357
2358 def testSendmsgDataGenerator(self):
2359 # Send from buffer obtained from a generator (not a sequence).
2360 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2361
2362 def _testSendmsgDataGenerator(self):
2363 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2364 len(MSG))
2365
2366 def testSendmsgAncillaryGenerator(self):
2367 # Gather (empty) ancillary data from a generator.
2368 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2369
2370 def _testSendmsgAncillaryGenerator(self):
2371 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2372 len(MSG))
2373
2374 def testSendmsgArray(self):
2375 # Send data from an array instead of the usual bytes object.
2376 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2377
2378 def _testSendmsgArray(self):
2379 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2380 len(MSG))
2381
2382 def testSendmsgGather(self):
2383 # Send message data from more than one buffer (gather write).
2384 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2385
2386 def _testSendmsgGather(self):
2387 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2388
2389 def testSendmsgBadArgs(self):
2390 # Check that sendmsg() rejects invalid arguments.
2391 self.assertEqual(self.serv_sock.recv(1000), b"done")
2392
2393 def _testSendmsgBadArgs(self):
2394 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2395 self.assertRaises(TypeError, self.sendmsgToServer,
2396 b"not in an iterable")
2397 self.assertRaises(TypeError, self.sendmsgToServer,
2398 object())
2399 self.assertRaises(TypeError, self.sendmsgToServer,
2400 [object()])
2401 self.assertRaises(TypeError, self.sendmsgToServer,
2402 [MSG, object()])
2403 self.assertRaises(TypeError, self.sendmsgToServer,
2404 [MSG], object())
2405 self.assertRaises(TypeError, self.sendmsgToServer,
2406 [MSG], [], object())
2407 self.assertRaises(TypeError, self.sendmsgToServer,
2408 [MSG], [], 0, object())
2409 self.sendToServer(b"done")
2410
2411 def testSendmsgBadCmsg(self):
2412 # Check that invalid ancillary data items are rejected.
2413 self.assertEqual(self.serv_sock.recv(1000), b"done")
2414
2415 def _testSendmsgBadCmsg(self):
2416 self.assertRaises(TypeError, self.sendmsgToServer,
2417 [MSG], [object()])
2418 self.assertRaises(TypeError, self.sendmsgToServer,
2419 [MSG], [(object(), 0, b"data")])
2420 self.assertRaises(TypeError, self.sendmsgToServer,
2421 [MSG], [(0, object(), b"data")])
2422 self.assertRaises(TypeError, self.sendmsgToServer,
2423 [MSG], [(0, 0, object())])
2424 self.assertRaises(TypeError, self.sendmsgToServer,
2425 [MSG], [(0, 0)])
2426 self.assertRaises(TypeError, self.sendmsgToServer,
2427 [MSG], [(0, 0, b"data", 42)])
2428 self.sendToServer(b"done")
2429
2430 @requireAttrs(socket, "CMSG_SPACE")
2431 def testSendmsgBadMultiCmsg(self):
2432 # Check that invalid ancillary data items are rejected when
2433 # more than one item is present.
2434 self.assertEqual(self.serv_sock.recv(1000), b"done")
2435
2436 @testSendmsgBadMultiCmsg.client_skip
2437 def _testSendmsgBadMultiCmsg(self):
2438 self.assertRaises(TypeError, self.sendmsgToServer,
2439 [MSG], [0, 0, b""])
2440 self.assertRaises(TypeError, self.sendmsgToServer,
2441 [MSG], [(0, 0, b""), object()])
2442 self.sendToServer(b"done")
2443
2444 def testSendmsgExcessCmsgReject(self):
2445 # Check that sendmsg() rejects excess ancillary data items
2446 # when the number that can be sent is limited.
2447 self.assertEqual(self.serv_sock.recv(1000), b"done")
2448
2449 def _testSendmsgExcessCmsgReject(self):
2450 if not hasattr(socket, "CMSG_SPACE"):
2451 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002452 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002453 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2454 self.assertIsNone(cm.exception.errno)
2455 self.sendToServer(b"done")
2456
2457 def testSendmsgAfterClose(self):
2458 # Check that sendmsg() fails on a closed socket.
2459 pass
2460
2461 def _testSendmsgAfterClose(self):
2462 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002463 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002464
2465
2466class SendmsgStreamTests(SendmsgTests):
2467 # Tests for sendmsg() which require a stream socket and do not
2468 # involve recvmsg() or recvmsg_into().
2469
2470 def testSendmsgExplicitNoneAddr(self):
2471 # Check that peer address can be specified as None.
2472 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2473
2474 def _testSendmsgExplicitNoneAddr(self):
2475 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2476
2477 def testSendmsgTimeout(self):
2478 # Check that timeout works with sendmsg().
2479 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2480 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2481
2482 def _testSendmsgTimeout(self):
2483 try:
2484 self.cli_sock.settimeout(0.03)
2485 with self.assertRaises(socket.timeout):
2486 while True:
2487 self.sendmsgToServer([b"a"*512])
2488 finally:
2489 self.misc_event.set()
2490
2491 # XXX: would be nice to have more tests for sendmsg flags argument.
2492
2493 # Linux supports MSG_DONTWAIT when sending, but in general, it
2494 # only works when receiving. Could add other platforms if they
2495 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002496 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002497 "MSG_DONTWAIT not known to work on this platform when "
2498 "sending")
2499 def testSendmsgDontWait(self):
2500 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2501 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2502 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2503
2504 @testSendmsgDontWait.client_skip
2505 def _testSendmsgDontWait(self):
2506 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002507 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002508 while True:
2509 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2510 self.assertIn(cm.exception.errno,
2511 (errno.EAGAIN, errno.EWOULDBLOCK))
2512 finally:
2513 self.misc_event.set()
2514
2515
2516class SendmsgConnectionlessTests(SendmsgTests):
2517 # Tests for sendmsg() which require a connectionless-mode
2518 # (e.g. datagram) socket, and do not involve recvmsg() or
2519 # recvmsg_into().
2520
2521 def testSendmsgNoDestAddr(self):
2522 # Check that sendmsg() fails when no destination address is
2523 # given for unconnected socket.
2524 pass
2525
2526 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002527 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002528 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002529 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002530 [MSG], [], 0, None)
2531
2532
2533class RecvmsgGenericTests(SendrecvmsgBase):
2534 # Tests for recvmsg() which can also be emulated using
2535 # recvmsg_into(), and can use any socket type.
2536
2537 def testRecvmsg(self):
2538 # Receive a simple message with recvmsg[_into]().
2539 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2540 self.assertEqual(msg, MSG)
2541 self.checkRecvmsgAddress(addr, self.cli_addr)
2542 self.assertEqual(ancdata, [])
2543 self.checkFlags(flags, eor=True)
2544
2545 def _testRecvmsg(self):
2546 self.sendToServer(MSG)
2547
2548 def testRecvmsgExplicitDefaults(self):
2549 # Test recvmsg[_into]() with default arguments provided explicitly.
2550 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2551 len(MSG), 0, 0)
2552 self.assertEqual(msg, MSG)
2553 self.checkRecvmsgAddress(addr, self.cli_addr)
2554 self.assertEqual(ancdata, [])
2555 self.checkFlags(flags, eor=True)
2556
2557 def _testRecvmsgExplicitDefaults(self):
2558 self.sendToServer(MSG)
2559
2560 def testRecvmsgShorter(self):
2561 # Receive a message smaller than buffer.
2562 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2563 len(MSG) + 42)
2564 self.assertEqual(msg, MSG)
2565 self.checkRecvmsgAddress(addr, self.cli_addr)
2566 self.assertEqual(ancdata, [])
2567 self.checkFlags(flags, eor=True)
2568
2569 def _testRecvmsgShorter(self):
2570 self.sendToServer(MSG)
2571
Charles-François Natali8619cd72011-10-03 19:43:15 +02002572 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2573 # datagram is received (issue #13001).
2574 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002575 def testRecvmsgTrunc(self):
2576 # Receive part of message, check for truncation indicators.
2577 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2578 len(MSG) - 3)
2579 self.assertEqual(msg, MSG[:-3])
2580 self.checkRecvmsgAddress(addr, self.cli_addr)
2581 self.assertEqual(ancdata, [])
2582 self.checkFlags(flags, eor=False)
2583
Charles-François Natali8619cd72011-10-03 19:43:15 +02002584 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002585 def _testRecvmsgTrunc(self):
2586 self.sendToServer(MSG)
2587
2588 def testRecvmsgShortAncillaryBuf(self):
2589 # Test ancillary data buffer too small to hold any ancillary data.
2590 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2591 len(MSG), 1)
2592 self.assertEqual(msg, MSG)
2593 self.checkRecvmsgAddress(addr, self.cli_addr)
2594 self.assertEqual(ancdata, [])
2595 self.checkFlags(flags, eor=True)
2596
2597 def _testRecvmsgShortAncillaryBuf(self):
2598 self.sendToServer(MSG)
2599
2600 def testRecvmsgLongAncillaryBuf(self):
2601 # Test large ancillary data buffer.
2602 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2603 len(MSG), 10240)
2604 self.assertEqual(msg, MSG)
2605 self.checkRecvmsgAddress(addr, self.cli_addr)
2606 self.assertEqual(ancdata, [])
2607 self.checkFlags(flags, eor=True)
2608
2609 def _testRecvmsgLongAncillaryBuf(self):
2610 self.sendToServer(MSG)
2611
2612 def testRecvmsgAfterClose(self):
2613 # Check that recvmsg[_into]() fails on a closed socket.
2614 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002615 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002616
2617 def _testRecvmsgAfterClose(self):
2618 pass
2619
2620 def testRecvmsgTimeout(self):
2621 # Check that timeout works.
2622 try:
2623 self.serv_sock.settimeout(0.03)
2624 self.assertRaises(socket.timeout,
2625 self.doRecvmsg, self.serv_sock, len(MSG))
2626 finally:
2627 self.misc_event.set()
2628
2629 def _testRecvmsgTimeout(self):
2630 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2631
2632 @requireAttrs(socket, "MSG_PEEK")
2633 def testRecvmsgPeek(self):
2634 # Check that MSG_PEEK in flags enables examination of pending
2635 # data without consuming it.
2636
2637 # Receive part of data with MSG_PEEK.
2638 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2639 len(MSG) - 3, 0,
2640 socket.MSG_PEEK)
2641 self.assertEqual(msg, MSG[:-3])
2642 self.checkRecvmsgAddress(addr, self.cli_addr)
2643 self.assertEqual(ancdata, [])
2644 # Ignoring MSG_TRUNC here (so this test is the same for stream
2645 # and datagram sockets). Some wording in POSIX seems to
2646 # suggest that it needn't be set when peeking, but that may
2647 # just be a slip.
2648 self.checkFlags(flags, eor=False,
2649 ignore=getattr(socket, "MSG_TRUNC", 0))
2650
2651 # Receive all data with MSG_PEEK.
2652 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2653 len(MSG), 0,
2654 socket.MSG_PEEK)
2655 self.assertEqual(msg, MSG)
2656 self.checkRecvmsgAddress(addr, self.cli_addr)
2657 self.assertEqual(ancdata, [])
2658 self.checkFlags(flags, eor=True)
2659
2660 # Check that the same data can still be received normally.
2661 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2662 self.assertEqual(msg, MSG)
2663 self.checkRecvmsgAddress(addr, self.cli_addr)
2664 self.assertEqual(ancdata, [])
2665 self.checkFlags(flags, eor=True)
2666
2667 @testRecvmsgPeek.client_skip
2668 def _testRecvmsgPeek(self):
2669 self.sendToServer(MSG)
2670
2671 @requireAttrs(socket.socket, "sendmsg")
2672 def testRecvmsgFromSendmsg(self):
2673 # Test receiving with recvmsg[_into]() when message is sent
2674 # using sendmsg().
2675 self.serv_sock.settimeout(self.fail_timeout)
2676 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2677 self.assertEqual(msg, MSG)
2678 self.checkRecvmsgAddress(addr, self.cli_addr)
2679 self.assertEqual(ancdata, [])
2680 self.checkFlags(flags, eor=True)
2681
2682 @testRecvmsgFromSendmsg.client_skip
2683 def _testRecvmsgFromSendmsg(self):
2684 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2685
2686
2687class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2688 # Tests which require a stream socket and can use either recvmsg()
2689 # or recvmsg_into().
2690
2691 def testRecvmsgEOF(self):
2692 # Receive end-of-stream indicator (b"", peer socket closed).
2693 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2694 self.assertEqual(msg, b"")
2695 self.checkRecvmsgAddress(addr, self.cli_addr)
2696 self.assertEqual(ancdata, [])
2697 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2698
2699 def _testRecvmsgEOF(self):
2700 self.cli_sock.close()
2701
2702 def testRecvmsgOverflow(self):
2703 # Receive a message in more than one chunk.
2704 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2705 len(MSG) - 3)
2706 self.checkRecvmsgAddress(addr, self.cli_addr)
2707 self.assertEqual(ancdata, [])
2708 self.checkFlags(flags, eor=False)
2709
2710 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2711 self.checkRecvmsgAddress(addr, self.cli_addr)
2712 self.assertEqual(ancdata, [])
2713 self.checkFlags(flags, eor=True)
2714
2715 msg = seg1 + seg2
2716 self.assertEqual(msg, MSG)
2717
2718 def _testRecvmsgOverflow(self):
2719 self.sendToServer(MSG)
2720
2721
2722class RecvmsgTests(RecvmsgGenericTests):
2723 # Tests for recvmsg() which can use any socket type.
2724
2725 def testRecvmsgBadArgs(self):
2726 # Check that recvmsg() rejects invalid arguments.
2727 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2728 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2729 -1, 0, 0)
2730 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2731 len(MSG), -1, 0)
2732 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2733 [bytearray(10)], 0, 0)
2734 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2735 object(), 0, 0)
2736 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2737 len(MSG), object(), 0)
2738 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2739 len(MSG), 0, object())
2740
2741 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2742 self.assertEqual(msg, MSG)
2743 self.checkRecvmsgAddress(addr, self.cli_addr)
2744 self.assertEqual(ancdata, [])
2745 self.checkFlags(flags, eor=True)
2746
2747 def _testRecvmsgBadArgs(self):
2748 self.sendToServer(MSG)
2749
2750
2751class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2752 # Tests for recvmsg_into() which can use any socket type.
2753
2754 def testRecvmsgIntoBadArgs(self):
2755 # Check that recvmsg_into() rejects invalid arguments.
2756 buf = bytearray(len(MSG))
2757 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2758 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2759 len(MSG), 0, 0)
2760 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2761 buf, 0, 0)
2762 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2763 [object()], 0, 0)
2764 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2765 [b"I'm not writable"], 0, 0)
2766 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2767 [buf, object()], 0, 0)
2768 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2769 [buf], -1, 0)
2770 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2771 [buf], object(), 0)
2772 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2773 [buf], 0, object())
2774
2775 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2776 self.assertEqual(nbytes, len(MSG))
2777 self.assertEqual(buf, bytearray(MSG))
2778 self.checkRecvmsgAddress(addr, self.cli_addr)
2779 self.assertEqual(ancdata, [])
2780 self.checkFlags(flags, eor=True)
2781
2782 def _testRecvmsgIntoBadArgs(self):
2783 self.sendToServer(MSG)
2784
2785 def testRecvmsgIntoGenerator(self):
2786 # Receive into buffer obtained from a generator (not a sequence).
2787 buf = bytearray(len(MSG))
2788 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2789 (o for o in [buf]))
2790 self.assertEqual(nbytes, len(MSG))
2791 self.assertEqual(buf, bytearray(MSG))
2792 self.checkRecvmsgAddress(addr, self.cli_addr)
2793 self.assertEqual(ancdata, [])
2794 self.checkFlags(flags, eor=True)
2795
2796 def _testRecvmsgIntoGenerator(self):
2797 self.sendToServer(MSG)
2798
2799 def testRecvmsgIntoArray(self):
2800 # Receive into an array rather than the usual bytearray.
2801 buf = array.array("B", [0] * len(MSG))
2802 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2803 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002804 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002805 self.checkRecvmsgAddress(addr, self.cli_addr)
2806 self.assertEqual(ancdata, [])
2807 self.checkFlags(flags, eor=True)
2808
2809 def _testRecvmsgIntoArray(self):
2810 self.sendToServer(MSG)
2811
2812 def testRecvmsgIntoScatter(self):
2813 # Receive into multiple buffers (scatter write).
2814 b1 = bytearray(b"----")
2815 b2 = bytearray(b"0123456789")
2816 b3 = bytearray(b"--------------")
2817 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2818 [b1, memoryview(b2)[2:9], b3])
2819 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2820 self.assertEqual(b1, bytearray(b"Mary"))
2821 self.assertEqual(b2, bytearray(b"01 had a 9"))
2822 self.assertEqual(b3, bytearray(b"little lamb---"))
2823 self.checkRecvmsgAddress(addr, self.cli_addr)
2824 self.assertEqual(ancdata, [])
2825 self.checkFlags(flags, eor=True)
2826
2827 def _testRecvmsgIntoScatter(self):
2828 self.sendToServer(b"Mary had a little lamb")
2829
2830
2831class CmsgMacroTests(unittest.TestCase):
2832 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2833 # assumptions used by sendmsg() and recvmsg[_into](), which share
2834 # code with these functions.
2835
2836 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002837 try:
2838 import _testcapi
2839 except ImportError:
2840 socklen_t_limit = 0x7fffffff
2841 else:
2842 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002843
2844 @requireAttrs(socket, "CMSG_LEN")
2845 def testCMSG_LEN(self):
2846 # Test CMSG_LEN() with various valid and invalid values,
2847 # checking the assumptions used by recvmsg() and sendmsg().
2848 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2849 values = list(range(257)) + list(range(toobig - 257, toobig))
2850
2851 # struct cmsghdr has at least three members, two of which are ints
2852 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2853 for n in values:
2854 ret = socket.CMSG_LEN(n)
2855 # This is how recvmsg() calculates the data size
2856 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2857 self.assertLessEqual(ret, self.socklen_t_limit)
2858
2859 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2860 # sendmsg() shares code with these functions, and requires
2861 # that it reject values over the limit.
2862 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2863 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2864
2865 @requireAttrs(socket, "CMSG_SPACE")
2866 def testCMSG_SPACE(self):
2867 # Test CMSG_SPACE() with various valid and invalid values,
2868 # checking the assumptions used by sendmsg().
2869 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2870 values = list(range(257)) + list(range(toobig - 257, toobig))
2871
2872 last = socket.CMSG_SPACE(0)
2873 # struct cmsghdr has at least three members, two of which are ints
2874 self.assertGreater(last, array.array("i").itemsize * 2)
2875 for n in values:
2876 ret = socket.CMSG_SPACE(n)
2877 self.assertGreaterEqual(ret, last)
2878 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2879 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2880 self.assertLessEqual(ret, self.socklen_t_limit)
2881 last = ret
2882
2883 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2884 # sendmsg() shares code with these functions, and requires
2885 # that it reject values over the limit.
2886 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2887 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2888
2889
2890class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2891 # Tests for file descriptor passing on Unix-domain sockets.
2892
2893 # Invalid file descriptor value that's unlikely to evaluate to a
2894 # real FD even if one of its bytes is replaced with a different
2895 # value (which shouldn't actually happen).
2896 badfd = -0x5555
2897
2898 def newFDs(self, n):
2899 # Return a list of n file descriptors for newly-created files
2900 # containing their list indices as ASCII numbers.
2901 fds = []
2902 for i in range(n):
2903 fd, path = tempfile.mkstemp()
2904 self.addCleanup(os.unlink, path)
2905 self.addCleanup(os.close, fd)
2906 os.write(fd, str(i).encode())
2907 fds.append(fd)
2908 return fds
2909
2910 def checkFDs(self, fds):
2911 # Check that the file descriptors in the given list contain
2912 # their correct list indices as ASCII numbers.
2913 for n, fd in enumerate(fds):
2914 os.lseek(fd, 0, os.SEEK_SET)
2915 self.assertEqual(os.read(fd, 1024), str(n).encode())
2916
2917 def registerRecvmsgResult(self, result):
2918 self.addCleanup(self.closeRecvmsgFDs, result)
2919
2920 def closeRecvmsgFDs(self, recvmsg_result):
2921 # Close all file descriptors specified in the ancillary data
2922 # of the given return value from recvmsg() or recvmsg_into().
2923 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2924 if (cmsg_level == socket.SOL_SOCKET and
2925 cmsg_type == socket.SCM_RIGHTS):
2926 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002927 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002928 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2929 for fd in fds:
2930 os.close(fd)
2931
2932 def createAndSendFDs(self, n):
2933 # Send n new file descriptors created by newFDs() to the
2934 # server, with the constant MSG as the non-ancillary data.
2935 self.assertEqual(
2936 self.sendmsgToServer([MSG],
2937 [(socket.SOL_SOCKET,
2938 socket.SCM_RIGHTS,
2939 array.array("i", self.newFDs(n)))]),
2940 len(MSG))
2941
2942 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2943 # Check that constant MSG was received with numfds file
2944 # descriptors in a maximum of maxcmsgs control messages (which
2945 # must contain only complete integers). By default, check
2946 # that MSG_CTRUNC is unset, but ignore any flags in
2947 # ignoreflags.
2948 msg, ancdata, flags, addr = result
2949 self.assertEqual(msg, MSG)
2950 self.checkRecvmsgAddress(addr, self.cli_addr)
2951 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2952 ignore=ignoreflags)
2953
2954 self.assertIsInstance(ancdata, list)
2955 self.assertLessEqual(len(ancdata), maxcmsgs)
2956 fds = array.array("i")
2957 for item in ancdata:
2958 self.assertIsInstance(item, tuple)
2959 cmsg_level, cmsg_type, cmsg_data = item
2960 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2961 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2962 self.assertIsInstance(cmsg_data, bytes)
2963 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002964 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002965
2966 self.assertEqual(len(fds), numfds)
2967 self.checkFDs(fds)
2968
2969 def testFDPassSimple(self):
2970 # Pass a single FD (array read from bytes object).
2971 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2972 len(MSG), 10240))
2973
2974 def _testFDPassSimple(self):
2975 self.assertEqual(
2976 self.sendmsgToServer(
2977 [MSG],
2978 [(socket.SOL_SOCKET,
2979 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002980 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002981 len(MSG))
2982
2983 def testMultipleFDPass(self):
2984 # Pass multiple FDs in a single array.
2985 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2986 len(MSG), 10240))
2987
2988 def _testMultipleFDPass(self):
2989 self.createAndSendFDs(4)
2990
2991 @requireAttrs(socket, "CMSG_SPACE")
2992 def testFDPassCMSG_SPACE(self):
2993 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2994 self.checkRecvmsgFDs(
2995 4, self.doRecvmsg(self.serv_sock, len(MSG),
2996 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2997
2998 @testFDPassCMSG_SPACE.client_skip
2999 def _testFDPassCMSG_SPACE(self):
3000 self.createAndSendFDs(4)
3001
3002 def testFDPassCMSG_LEN(self):
3003 # Test using CMSG_LEN() to calculate ancillary buffer size.
3004 self.checkRecvmsgFDs(1,
3005 self.doRecvmsg(self.serv_sock, len(MSG),
3006 socket.CMSG_LEN(4 * SIZEOF_INT)),
3007 # RFC 3542 says implementations may set
3008 # MSG_CTRUNC if there isn't enough space
3009 # for trailing padding.
3010 ignoreflags=socket.MSG_CTRUNC)
3011
3012 def _testFDPassCMSG_LEN(self):
3013 self.createAndSendFDs(1)
3014
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003015 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003016 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003017 @requireAttrs(socket, "CMSG_SPACE")
3018 def testFDPassSeparate(self):
3019 # Pass two FDs in two separate arrays. Arrays may be combined
3020 # into a single control message by the OS.
3021 self.checkRecvmsgFDs(2,
3022 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3023 maxcmsgs=2)
3024
3025 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003026 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003027 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003028 def _testFDPassSeparate(self):
3029 fd0, fd1 = self.newFDs(2)
3030 self.assertEqual(
3031 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3032 socket.SCM_RIGHTS,
3033 array.array("i", [fd0])),
3034 (socket.SOL_SOCKET,
3035 socket.SCM_RIGHTS,
3036 array.array("i", [fd1]))]),
3037 len(MSG))
3038
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003039 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003040 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003041 @requireAttrs(socket, "CMSG_SPACE")
3042 def testFDPassSeparateMinSpace(self):
3043 # Pass two FDs in two separate arrays, receiving them into the
3044 # minimum space for two arrays.
3045 self.checkRecvmsgFDs(2,
3046 self.doRecvmsg(self.serv_sock, len(MSG),
3047 socket.CMSG_SPACE(SIZEOF_INT) +
3048 socket.CMSG_LEN(SIZEOF_INT)),
3049 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3050
3051 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003052 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003053 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003054 def _testFDPassSeparateMinSpace(self):
3055 fd0, fd1 = self.newFDs(2)
3056 self.assertEqual(
3057 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3058 socket.SCM_RIGHTS,
3059 array.array("i", [fd0])),
3060 (socket.SOL_SOCKET,
3061 socket.SCM_RIGHTS,
3062 array.array("i", [fd1]))]),
3063 len(MSG))
3064
3065 def sendAncillaryIfPossible(self, msg, ancdata):
3066 # Try to send msg and ancdata to server, but if the system
3067 # call fails, just send msg with no ancillary data.
3068 try:
3069 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003070 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003071 # Check that it was the system call that failed
3072 self.assertIsInstance(e.errno, int)
3073 nbytes = self.sendmsgToServer([msg])
3074 self.assertEqual(nbytes, len(msg))
3075
Brett Cannon3bbad122015-12-28 17:21:44 -08003076 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003077 def testFDPassEmpty(self):
3078 # Try to pass an empty FD array. Can receive either no array
3079 # or an empty array.
3080 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3081 len(MSG), 10240),
3082 ignoreflags=socket.MSG_CTRUNC)
3083
3084 def _testFDPassEmpty(self):
3085 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3086 socket.SCM_RIGHTS,
3087 b"")])
3088
3089 def testFDPassPartialInt(self):
3090 # Try to pass a truncated FD array.
3091 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3092 len(MSG), 10240)
3093 self.assertEqual(msg, MSG)
3094 self.checkRecvmsgAddress(addr, self.cli_addr)
3095 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3096 self.assertLessEqual(len(ancdata), 1)
3097 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3098 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3099 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3100 self.assertLess(len(cmsg_data), SIZEOF_INT)
3101
3102 def _testFDPassPartialInt(self):
3103 self.sendAncillaryIfPossible(
3104 MSG,
3105 [(socket.SOL_SOCKET,
3106 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003107 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003108
3109 @requireAttrs(socket, "CMSG_SPACE")
3110 def testFDPassPartialIntInMiddle(self):
3111 # Try to pass two FD arrays, the first of which is truncated.
3112 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3113 len(MSG), 10240)
3114 self.assertEqual(msg, MSG)
3115 self.checkRecvmsgAddress(addr, self.cli_addr)
3116 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3117 self.assertLessEqual(len(ancdata), 2)
3118 fds = array.array("i")
3119 # Arrays may have been combined in a single control message
3120 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3121 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3122 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003123 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003124 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3125 self.assertLessEqual(len(fds), 2)
3126 self.checkFDs(fds)
3127
3128 @testFDPassPartialIntInMiddle.client_skip
3129 def _testFDPassPartialIntInMiddle(self):
3130 fd0, fd1 = self.newFDs(2)
3131 self.sendAncillaryIfPossible(
3132 MSG,
3133 [(socket.SOL_SOCKET,
3134 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003135 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003136 (socket.SOL_SOCKET,
3137 socket.SCM_RIGHTS,
3138 array.array("i", [fd1]))])
3139
3140 def checkTruncatedHeader(self, result, ignoreflags=0):
3141 # Check that no ancillary data items are returned when data is
3142 # truncated inside the cmsghdr structure.
3143 msg, ancdata, flags, addr = result
3144 self.assertEqual(msg, MSG)
3145 self.checkRecvmsgAddress(addr, self.cli_addr)
3146 self.assertEqual(ancdata, [])
3147 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3148 ignore=ignoreflags)
3149
3150 def testCmsgTruncNoBufSize(self):
3151 # Check that no ancillary data is received when no buffer size
3152 # is specified.
3153 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3154 # BSD seems to set MSG_CTRUNC only
3155 # if an item has been partially
3156 # received.
3157 ignoreflags=socket.MSG_CTRUNC)
3158
3159 def _testCmsgTruncNoBufSize(self):
3160 self.createAndSendFDs(1)
3161
3162 def testCmsgTrunc0(self):
3163 # Check that no ancillary data is received when buffer size is 0.
3164 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3165 ignoreflags=socket.MSG_CTRUNC)
3166
3167 def _testCmsgTrunc0(self):
3168 self.createAndSendFDs(1)
3169
3170 # Check that no ancillary data is returned for various non-zero
3171 # (but still too small) buffer sizes.
3172
3173 def testCmsgTrunc1(self):
3174 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3175
3176 def _testCmsgTrunc1(self):
3177 self.createAndSendFDs(1)
3178
3179 def testCmsgTrunc2Int(self):
3180 # The cmsghdr structure has at least three members, two of
3181 # which are ints, so we still shouldn't see any ancillary
3182 # data.
3183 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3184 SIZEOF_INT * 2))
3185
3186 def _testCmsgTrunc2Int(self):
3187 self.createAndSendFDs(1)
3188
3189 def testCmsgTruncLen0Minus1(self):
3190 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3191 socket.CMSG_LEN(0) - 1))
3192
3193 def _testCmsgTruncLen0Minus1(self):
3194 self.createAndSendFDs(1)
3195
3196 # The following tests try to truncate the control message in the
3197 # middle of the FD array.
3198
3199 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3200 # Check that file descriptor data is truncated to between
3201 # mindata and maxdata bytes when received with buffer size
3202 # ancbuf, and that any complete file descriptor numbers are
3203 # valid.
3204 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3205 len(MSG), ancbuf)
3206 self.assertEqual(msg, MSG)
3207 self.checkRecvmsgAddress(addr, self.cli_addr)
3208 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3209
3210 if mindata == 0 and ancdata == []:
3211 return
3212 self.assertEqual(len(ancdata), 1)
3213 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3214 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3215 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3216 self.assertGreaterEqual(len(cmsg_data), mindata)
3217 self.assertLessEqual(len(cmsg_data), maxdata)
3218 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003219 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003220 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3221 self.checkFDs(fds)
3222
3223 def testCmsgTruncLen0(self):
3224 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3225
3226 def _testCmsgTruncLen0(self):
3227 self.createAndSendFDs(1)
3228
3229 def testCmsgTruncLen0Plus1(self):
3230 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3231
3232 def _testCmsgTruncLen0Plus1(self):
3233 self.createAndSendFDs(2)
3234
3235 def testCmsgTruncLen1(self):
3236 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3237 maxdata=SIZEOF_INT)
3238
3239 def _testCmsgTruncLen1(self):
3240 self.createAndSendFDs(2)
3241
3242 def testCmsgTruncLen2Minus1(self):
3243 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3244 maxdata=(2 * SIZEOF_INT) - 1)
3245
3246 def _testCmsgTruncLen2Minus1(self):
3247 self.createAndSendFDs(2)
3248
3249
3250class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3251 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3252 # features of the RFC 3542 Advanced Sockets API for IPv6.
3253 # Currently we can only handle certain data items (e.g. traffic
3254 # class, hop limit, MTU discovery and fragmentation settings)
3255 # without resorting to unportable means such as the struct module,
3256 # but the tests here are aimed at testing the ancillary data
3257 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3258 # itself.
3259
3260 # Test value to use when setting hop limit of packet
3261 hop_limit = 2
3262
3263 # Test value to use when setting traffic class of packet.
3264 # -1 means "use kernel default".
3265 traffic_class = -1
3266
3267 def ancillaryMapping(self, ancdata):
3268 # Given ancillary data list ancdata, return a mapping from
3269 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3270 # Check that no (level, type) pair appears more than once.
3271 d = {}
3272 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3273 self.assertNotIn((cmsg_level, cmsg_type), d)
3274 d[(cmsg_level, cmsg_type)] = cmsg_data
3275 return d
3276
3277 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3278 # Receive hop limit into ancbufsize bytes of ancillary data
3279 # space. Check that data is MSG, ancillary data is not
3280 # truncated (but ignore any flags in ignoreflags), and hop
3281 # limit is between 0 and maxhop inclusive.
3282 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3283 socket.IPV6_RECVHOPLIMIT, 1)
3284 self.misc_event.set()
3285 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3286 len(MSG), ancbufsize)
3287
3288 self.assertEqual(msg, MSG)
3289 self.checkRecvmsgAddress(addr, self.cli_addr)
3290 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3291 ignore=ignoreflags)
3292
3293 self.assertEqual(len(ancdata), 1)
3294 self.assertIsInstance(ancdata[0], tuple)
3295 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3296 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3297 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3298 self.assertIsInstance(cmsg_data, bytes)
3299 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3300 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003301 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003302 self.assertGreaterEqual(a[0], 0)
3303 self.assertLessEqual(a[0], maxhop)
3304
3305 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3306 def testRecvHopLimit(self):
3307 # Test receiving the packet hop limit as ancillary data.
3308 self.checkHopLimit(ancbufsize=10240)
3309
3310 @testRecvHopLimit.client_skip
3311 def _testRecvHopLimit(self):
3312 # Need to wait until server has asked to receive ancillary
3313 # data, as implementations are not required to buffer it
3314 # otherwise.
3315 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3316 self.sendToServer(MSG)
3317
3318 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3319 def testRecvHopLimitCMSG_SPACE(self):
3320 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3321 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3322
3323 @testRecvHopLimitCMSG_SPACE.client_skip
3324 def _testRecvHopLimitCMSG_SPACE(self):
3325 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3326 self.sendToServer(MSG)
3327
3328 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3329 # 3542 says portable applications must provide space for trailing
3330 # padding. Implementations may set MSG_CTRUNC if there isn't
3331 # enough space for the padding.
3332
3333 @requireAttrs(socket.socket, "sendmsg")
3334 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3335 def testSetHopLimit(self):
3336 # Test setting hop limit on outgoing packet and receiving it
3337 # at the other end.
3338 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3339
3340 @testSetHopLimit.client_skip
3341 def _testSetHopLimit(self):
3342 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3343 self.assertEqual(
3344 self.sendmsgToServer([MSG],
3345 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3346 array.array("i", [self.hop_limit]))]),
3347 len(MSG))
3348
3349 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3350 ignoreflags=0):
3351 # Receive traffic class and hop limit into ancbufsize bytes of
3352 # ancillary data space. Check that data is MSG, ancillary
3353 # data is not truncated (but ignore any flags in ignoreflags),
3354 # and traffic class and hop limit are in range (hop limit no
3355 # more than maxhop).
3356 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3357 socket.IPV6_RECVHOPLIMIT, 1)
3358 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3359 socket.IPV6_RECVTCLASS, 1)
3360 self.misc_event.set()
3361 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3362 len(MSG), ancbufsize)
3363
3364 self.assertEqual(msg, MSG)
3365 self.checkRecvmsgAddress(addr, self.cli_addr)
3366 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3367 ignore=ignoreflags)
3368 self.assertEqual(len(ancdata), 2)
3369 ancmap = self.ancillaryMapping(ancdata)
3370
3371 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3372 self.assertEqual(len(tcdata), SIZEOF_INT)
3373 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003374 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003375 self.assertGreaterEqual(a[0], 0)
3376 self.assertLessEqual(a[0], 255)
3377
3378 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3379 self.assertEqual(len(hldata), SIZEOF_INT)
3380 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003381 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003382 self.assertGreaterEqual(a[0], 0)
3383 self.assertLessEqual(a[0], maxhop)
3384
3385 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3386 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3387 def testRecvTrafficClassAndHopLimit(self):
3388 # Test receiving traffic class and hop limit as ancillary data.
3389 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3390
3391 @testRecvTrafficClassAndHopLimit.client_skip
3392 def _testRecvTrafficClassAndHopLimit(self):
3393 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3394 self.sendToServer(MSG)
3395
3396 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3397 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3398 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3399 # Test receiving traffic class and hop limit, using
3400 # CMSG_SPACE() to calculate buffer size.
3401 self.checkTrafficClassAndHopLimit(
3402 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3403
3404 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3405 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3406 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3407 self.sendToServer(MSG)
3408
3409 @requireAttrs(socket.socket, "sendmsg")
3410 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3411 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3412 def testSetTrafficClassAndHopLimit(self):
3413 # Test setting traffic class and hop limit on outgoing packet,
3414 # and receiving them at the other end.
3415 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3416 maxhop=self.hop_limit)
3417
3418 @testSetTrafficClassAndHopLimit.client_skip
3419 def _testSetTrafficClassAndHopLimit(self):
3420 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3421 self.assertEqual(
3422 self.sendmsgToServer([MSG],
3423 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3424 array.array("i", [self.traffic_class])),
3425 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3426 array.array("i", [self.hop_limit]))]),
3427 len(MSG))
3428
3429 @requireAttrs(socket.socket, "sendmsg")
3430 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3431 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3432 def testOddCmsgSize(self):
3433 # Try to send ancillary data with first item one byte too
3434 # long. Fall back to sending with correct size if this fails,
3435 # and check that second item was handled correctly.
3436 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3437 maxhop=self.hop_limit)
3438
3439 @testOddCmsgSize.client_skip
3440 def _testOddCmsgSize(self):
3441 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3442 try:
3443 nbytes = self.sendmsgToServer(
3444 [MSG],
3445 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003446 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003447 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3448 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003449 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450 self.assertIsInstance(e.errno, int)
3451 nbytes = self.sendmsgToServer(
3452 [MSG],
3453 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3454 array.array("i", [self.traffic_class])),
3455 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3456 array.array("i", [self.hop_limit]))])
3457 self.assertEqual(nbytes, len(MSG))
3458
3459 # Tests for proper handling of truncated ancillary data
3460
3461 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3462 # Receive hop limit into ancbufsize bytes of ancillary data
3463 # space, which should be too small to contain the ancillary
3464 # data header (if ancbufsize is None, pass no second argument
3465 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3466 # (unless included in ignoreflags), and no ancillary data is
3467 # returned.
3468 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3469 socket.IPV6_RECVHOPLIMIT, 1)
3470 self.misc_event.set()
3471 args = () if ancbufsize is None else (ancbufsize,)
3472 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3473 len(MSG), *args)
3474
3475 self.assertEqual(msg, MSG)
3476 self.checkRecvmsgAddress(addr, self.cli_addr)
3477 self.assertEqual(ancdata, [])
3478 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3479 ignore=ignoreflags)
3480
3481 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3482 def testCmsgTruncNoBufSize(self):
3483 # Check that no ancillary data is received when no ancillary
3484 # buffer size is provided.
3485 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3486 # BSD seems to set
3487 # MSG_CTRUNC only if an item
3488 # has been partially
3489 # received.
3490 ignoreflags=socket.MSG_CTRUNC)
3491
3492 @testCmsgTruncNoBufSize.client_skip
3493 def _testCmsgTruncNoBufSize(self):
3494 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3495 self.sendToServer(MSG)
3496
3497 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3498 def testSingleCmsgTrunc0(self):
3499 # Check that no ancillary data is received when ancillary
3500 # buffer size is zero.
3501 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3502 ignoreflags=socket.MSG_CTRUNC)
3503
3504 @testSingleCmsgTrunc0.client_skip
3505 def _testSingleCmsgTrunc0(self):
3506 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3507 self.sendToServer(MSG)
3508
3509 # Check that no ancillary data is returned for various non-zero
3510 # (but still too small) buffer sizes.
3511
3512 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3513 def testSingleCmsgTrunc1(self):
3514 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3515
3516 @testSingleCmsgTrunc1.client_skip
3517 def _testSingleCmsgTrunc1(self):
3518 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3519 self.sendToServer(MSG)
3520
3521 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3522 def testSingleCmsgTrunc2Int(self):
3523 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3524
3525 @testSingleCmsgTrunc2Int.client_skip
3526 def _testSingleCmsgTrunc2Int(self):
3527 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3528 self.sendToServer(MSG)
3529
3530 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3531 def testSingleCmsgTruncLen0Minus1(self):
3532 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3533
3534 @testSingleCmsgTruncLen0Minus1.client_skip
3535 def _testSingleCmsgTruncLen0Minus1(self):
3536 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3537 self.sendToServer(MSG)
3538
3539 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3540 def testSingleCmsgTruncInData(self):
3541 # Test truncation of a control message inside its associated
3542 # data. The message may be returned with its data truncated,
3543 # or not returned at all.
3544 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3545 socket.IPV6_RECVHOPLIMIT, 1)
3546 self.misc_event.set()
3547 msg, ancdata, flags, addr = self.doRecvmsg(
3548 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3549
3550 self.assertEqual(msg, MSG)
3551 self.checkRecvmsgAddress(addr, self.cli_addr)
3552 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3553
3554 self.assertLessEqual(len(ancdata), 1)
3555 if ancdata:
3556 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3557 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3558 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3559 self.assertLess(len(cmsg_data), SIZEOF_INT)
3560
3561 @testSingleCmsgTruncInData.client_skip
3562 def _testSingleCmsgTruncInData(self):
3563 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3564 self.sendToServer(MSG)
3565
3566 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3567 # Receive traffic class and hop limit into ancbufsize bytes of
3568 # ancillary data space, which should be large enough to
3569 # contain the first item, but too small to contain the header
3570 # of the second. Check that data is MSG, MSG_CTRUNC is set
3571 # (unless included in ignoreflags), and only one ancillary
3572 # data item is returned.
3573 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3574 socket.IPV6_RECVHOPLIMIT, 1)
3575 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3576 socket.IPV6_RECVTCLASS, 1)
3577 self.misc_event.set()
3578 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3579 len(MSG), ancbufsize)
3580
3581 self.assertEqual(msg, MSG)
3582 self.checkRecvmsgAddress(addr, self.cli_addr)
3583 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3584 ignore=ignoreflags)
3585
3586 self.assertEqual(len(ancdata), 1)
3587 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3588 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3589 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3590 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3591 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003592 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003593 self.assertGreaterEqual(a[0], 0)
3594 self.assertLessEqual(a[0], 255)
3595
3596 # Try the above test with various buffer sizes.
3597
3598 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3599 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3600 def testSecondCmsgTrunc0(self):
3601 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3602 ignoreflags=socket.MSG_CTRUNC)
3603
3604 @testSecondCmsgTrunc0.client_skip
3605 def _testSecondCmsgTrunc0(self):
3606 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3607 self.sendToServer(MSG)
3608
3609 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3610 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3611 def testSecondCmsgTrunc1(self):
3612 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3613
3614 @testSecondCmsgTrunc1.client_skip
3615 def _testSecondCmsgTrunc1(self):
3616 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3617 self.sendToServer(MSG)
3618
3619 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3620 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3621 def testSecondCmsgTrunc2Int(self):
3622 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3623 2 * SIZEOF_INT)
3624
3625 @testSecondCmsgTrunc2Int.client_skip
3626 def _testSecondCmsgTrunc2Int(self):
3627 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3628 self.sendToServer(MSG)
3629
3630 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3631 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3632 def testSecondCmsgTruncLen0Minus1(self):
3633 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3634 socket.CMSG_LEN(0) - 1)
3635
3636 @testSecondCmsgTruncLen0Minus1.client_skip
3637 def _testSecondCmsgTruncLen0Minus1(self):
3638 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3639 self.sendToServer(MSG)
3640
3641 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3642 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3643 def testSecomdCmsgTruncInData(self):
3644 # Test truncation of the second of two control messages inside
3645 # its associated data.
3646 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3647 socket.IPV6_RECVHOPLIMIT, 1)
3648 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3649 socket.IPV6_RECVTCLASS, 1)
3650 self.misc_event.set()
3651 msg, ancdata, flags, addr = self.doRecvmsg(
3652 self.serv_sock, len(MSG),
3653 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3654
3655 self.assertEqual(msg, MSG)
3656 self.checkRecvmsgAddress(addr, self.cli_addr)
3657 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3658
3659 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3660
3661 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3662 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3663 cmsg_types.remove(cmsg_type)
3664 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3665 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003666 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003667 self.assertGreaterEqual(a[0], 0)
3668 self.assertLessEqual(a[0], 255)
3669
3670 if ancdata:
3671 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3672 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3673 cmsg_types.remove(cmsg_type)
3674 self.assertLess(len(cmsg_data), SIZEOF_INT)
3675
3676 self.assertEqual(ancdata, [])
3677
3678 @testSecomdCmsgTruncInData.client_skip
3679 def _testSecomdCmsgTruncInData(self):
3680 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3681 self.sendToServer(MSG)
3682
3683
3684# Derive concrete test classes for different socket types.
3685
3686class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3687 SendrecvmsgConnectionlessBase,
3688 ThreadedSocketTestMixin, UDPTestBase):
3689 pass
3690
3691@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003692class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3693 pass
3694
3695@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003696class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3697 pass
3698
3699@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003700class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3701 pass
3702
3703
3704class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3705 SendrecvmsgConnectionlessBase,
3706 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003707
3708 def checkRecvmsgAddress(self, addr1, addr2):
3709 # Called to compare the received address with the address of
3710 # the peer, ignoring scope ID
3711 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003712
3713@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003714@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003715@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003716class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3717 pass
3718
3719@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003720@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003721@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003722class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3723 pass
3724
3725@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003726@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003727@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003728class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3729 pass
3730
3731@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003732@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003733@requireAttrs(socket, "IPPROTO_IPV6")
3734@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003735class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3736 SendrecvmsgUDP6TestBase):
3737 pass
3738
3739@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003740@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003741@requireAttrs(socket, "IPPROTO_IPV6")
3742@requireSocket("AF_INET6", "SOCK_DGRAM")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003743class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3744 RFC3542AncillaryTest,
3745 SendrecvmsgUDP6TestBase):
3746 pass
3747
3748
3749class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3750 ConnectedStreamTestMixin, TCPTestBase):
3751 pass
3752
3753@requireAttrs(socket.socket, "sendmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003754class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3755 pass
3756
3757@requireAttrs(socket.socket, "recvmsg")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003758class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3759 SendrecvmsgTCPTestBase):
3760 pass
3761
3762@requireAttrs(socket.socket, "recvmsg_into")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003763class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3764 SendrecvmsgTCPTestBase):
3765 pass
3766
3767
3768class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3769 SendrecvmsgConnectedBase,
3770 ConnectedStreamTestMixin, SCTPStreamBase):
3771 pass
3772
3773@requireAttrs(socket.socket, "sendmsg")
3774@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003775class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3776 pass
3777
3778@requireAttrs(socket.socket, "recvmsg")
3779@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003780class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3781 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003782
3783 def testRecvmsgEOF(self):
3784 try:
3785 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3786 except OSError as e:
3787 if e.errno != errno.ENOTCONN:
3788 raise
3789 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003790
3791@requireAttrs(socket.socket, "recvmsg_into")
3792@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003793class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3794 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003795
3796 def testRecvmsgEOF(self):
3797 try:
3798 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3799 except OSError as e:
3800 if e.errno != errno.ENOTCONN:
3801 raise
3802 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803
3804
3805class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3806 ConnectedStreamTestMixin, UnixStreamBase):
3807 pass
3808
3809@requireAttrs(socket.socket, "sendmsg")
3810@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003811class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3812 pass
3813
3814@requireAttrs(socket.socket, "recvmsg")
3815@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003816class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3817 SendrecvmsgUnixStreamTestBase):
3818 pass
3819
3820@requireAttrs(socket.socket, "recvmsg_into")
3821@requireAttrs(socket, "AF_UNIX")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003822class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3823 SendrecvmsgUnixStreamTestBase):
3824 pass
3825
3826@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3827@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003828class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3829 pass
3830
3831@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3832@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3834 SendrecvmsgUnixStreamTestBase):
3835 pass
3836
3837
3838# Test interrupting the interruptible send/receive methods with a
3839# signal when a timeout is set. These tests avoid having multiple
3840# threads alive during the test so that the OS cannot deliver the
3841# signal to the wrong one.
3842
3843class InterruptedTimeoutBase(unittest.TestCase):
3844 # Base class for interrupted send/receive tests. Installs an
3845 # empty handler for SIGALRM and removes it on teardown, along with
3846 # any scheduled alarms.
3847
3848 def setUp(self):
3849 super().setUp()
3850 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003851 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003852 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3853 self.addCleanup(self.setAlarm, 0)
3854
3855 # Timeout for socket operations
3856 timeout = 4.0
3857
3858 # Provide setAlarm() method to schedule delivery of SIGALRM after
3859 # given number of seconds, or cancel it if zero, and an
3860 # appropriate time value to use. Use setitimer() if available.
3861 if hasattr(signal, "setitimer"):
3862 alarm_time = 0.05
3863
3864 def setAlarm(self, seconds):
3865 signal.setitimer(signal.ITIMER_REAL, seconds)
3866 else:
3867 # Old systems may deliver the alarm up to one second early
3868 alarm_time = 2
3869
3870 def setAlarm(self, seconds):
3871 signal.alarm(seconds)
3872
3873
3874# Require siginterrupt() in order to ensure that system calls are
3875# interrupted by default.
3876@requireAttrs(signal, "siginterrupt")
3877@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3878 "Don't have signal.alarm or signal.setitimer")
3879class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3880 # Test interrupting the recv*() methods with signals when a
3881 # timeout is set.
3882
3883 def setUp(self):
3884 super().setUp()
3885 self.serv.settimeout(self.timeout)
3886
3887 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003888 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003889 # errno of EINTR when interrupted by a signal.
3890 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003891 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003892 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003893
3894 def testInterruptedRecvTimeout(self):
3895 self.checkInterruptedRecv(self.serv.recv, 1024)
3896
3897 def testInterruptedRecvIntoTimeout(self):
3898 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3899
3900 def testInterruptedRecvfromTimeout(self):
3901 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3902
3903 def testInterruptedRecvfromIntoTimeout(self):
3904 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3905
3906 @requireAttrs(socket.socket, "recvmsg")
3907 def testInterruptedRecvmsgTimeout(self):
3908 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3909
3910 @requireAttrs(socket.socket, "recvmsg_into")
3911 def testInterruptedRecvmsgIntoTimeout(self):
3912 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3913
3914
3915# Require siginterrupt() in order to ensure that system calls are
3916# interrupted by default.
3917@requireAttrs(signal, "siginterrupt")
3918@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3919 "Don't have signal.alarm or signal.setitimer")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003920class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3921 ThreadSafeCleanupTestCase,
3922 SocketListeningTestMixin, TCPTestBase):
3923 # Test interrupting the interruptible send*() methods with signals
3924 # when a timeout is set.
3925
3926 def setUp(self):
3927 super().setUp()
3928 self.serv_conn = self.newSocket()
3929 self.addCleanup(self.serv_conn.close)
3930 # Use a thread to complete the connection, but wait for it to
3931 # terminate before running the test, so that there is only one
3932 # thread to accept the signal.
3933 cli_thread = threading.Thread(target=self.doConnect)
3934 cli_thread.start()
3935 self.cli_conn, addr = self.serv.accept()
3936 self.addCleanup(self.cli_conn.close)
3937 cli_thread.join()
3938 self.serv_conn.settimeout(self.timeout)
3939
3940 def doConnect(self):
3941 self.serv_conn.connect(self.serv_addr)
3942
3943 def checkInterruptedSend(self, func, *args, **kwargs):
3944 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003945 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003946 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003947 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003948 while True:
3949 self.setAlarm(self.alarm_time)
3950 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003951
Ned Deilyc5640382014-02-03 13:58:31 -08003952 # Issue #12958: The following tests have problems on OS X prior to 10.7
3953 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003954 def testInterruptedSendTimeout(self):
3955 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3956
Ned Deilyc5640382014-02-03 13:58:31 -08003957 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003958 def testInterruptedSendtoTimeout(self):
3959 # Passing an actual address here as Python's wrapper for
3960 # sendto() doesn't allow passing a zero-length one; POSIX
3961 # requires that the address is ignored since the socket is
3962 # connection-mode, however.
3963 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3964 self.serv_addr)
3965
Ned Deilyc5640382014-02-03 13:58:31 -08003966 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003967 @requireAttrs(socket.socket, "sendmsg")
3968 def testInterruptedSendmsgTimeout(self):
3969 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3970
3971
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003972class TCPCloserTest(ThreadedTCPSocketTest):
3973
3974 def testClose(self):
3975 conn, addr = self.serv.accept()
3976 conn.close()
3977
3978 sd = self.cli
3979 read, write, err = select.select([sd], [], [], 1.0)
3980 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003981 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003982
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003983 # Calling close() many times should be safe.
3984 conn.close()
3985 conn.close()
3986
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003987 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003988 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003989 time.sleep(1.0)
3990
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02003991
Dave Cole331708b2004-08-09 04:51:41 +00003992class BasicSocketPairTest(SocketPairTest):
3993
3994 def __init__(self, methodName='runTest'):
3995 SocketPairTest.__init__(self, methodName=methodName)
3996
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003997 def _check_defaults(self, sock):
3998 self.assertIsInstance(sock, socket.socket)
3999 if hasattr(socket, 'AF_UNIX'):
4000 self.assertEqual(sock.family, socket.AF_UNIX)
4001 else:
4002 self.assertEqual(sock.family, socket.AF_INET)
4003 self.assertEqual(sock.type, socket.SOCK_STREAM)
4004 self.assertEqual(sock.proto, 0)
4005
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004006 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004007 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004008
4009 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004010 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004011
Dave Cole331708b2004-08-09 04:51:41 +00004012 def testRecv(self):
4013 msg = self.serv.recv(1024)
4014 self.assertEqual(msg, MSG)
4015
4016 def _testRecv(self):
4017 self.cli.send(MSG)
4018
4019 def testSend(self):
4020 self.serv.send(MSG)
4021
4022 def _testSend(self):
4023 msg = self.cli.recv(1024)
4024 self.assertEqual(msg, MSG)
4025
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004026
Guido van Rossum24e4af82002-06-12 19:18:08 +00004027class NonBlockingTCPTests(ThreadedTCPSocketTest):
4028
4029 def __init__(self, methodName='runTest'):
4030 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4031
4032 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004033 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004034 self.serv.setblocking(True)
4035 self.assertIsNone(self.serv.gettimeout())
4036 self.serv.setblocking(False)
4037 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004038 start = time.time()
4039 try:
4040 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004041 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004042 pass
4043 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004044 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004045
4046 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004047 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004048
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004049 @support.cpython_only
4050 def testSetBlocking_overflow(self):
4051 # Issue 15989
4052 import _testcapi
4053 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4054 self.skipTest('needs UINT_MAX < ULONG_MAX')
4055 self.serv.setblocking(False)
4056 self.assertEqual(self.serv.gettimeout(), 0.0)
4057 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4058 self.assertIsNone(self.serv.gettimeout())
4059
4060 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4061
Serhiy Storchaka43767632013-11-03 21:31:38 +02004062 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4063 'test needs socket.SOCK_NONBLOCK')
4064 @support.requires_linux_version(2, 6, 28)
4065 def testInitNonBlocking(self):
4066 # reinit server socket
4067 self.serv.close()
4068 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4069 socket.SOCK_NONBLOCK)
4070 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004071 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004072 # actual testing
4073 start = time.time()
4074 try:
4075 self.serv.accept()
4076 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004077 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004078 end = time.time()
4079 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4080
4081 def _testInitNonBlocking(self):
4082 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004083
Antoine Pitrou600232b2011-01-05 21:03:42 +00004084 def testInheritFlags(self):
4085 # Issue #7995: when calling accept() on a listening socket with a
4086 # timeout, the resulting socket should not be non-blocking.
4087 self.serv.settimeout(10)
4088 try:
4089 conn, addr = self.serv.accept()
4090 message = conn.recv(len(MSG))
4091 finally:
4092 conn.close()
4093 self.serv.settimeout(None)
4094
4095 def _testInheritFlags(self):
4096 time.sleep(0.1)
4097 self.cli.connect((HOST, self.port))
4098 time.sleep(0.5)
4099 self.cli.send(MSG)
4100
Guido van Rossum24e4af82002-06-12 19:18:08 +00004101 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004102 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004103 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004104 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004105 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004106 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004107 pass
4108 else:
4109 self.fail("Error trying to do non-blocking accept.")
4110 read, write, err = select.select([self.serv], [], [])
4111 if self.serv in read:
4112 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004113 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004114 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004115 else:
4116 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004117
Guido van Rossum24e4af82002-06-12 19:18:08 +00004118 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004119 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004120 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004121
4122 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004123 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004124 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004125 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004126
4127 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004128 self.cli.settimeout(10)
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 testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004132 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004133 conn, addr = self.serv.accept()
4134 conn.setblocking(0)
4135 try:
4136 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004137 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004138 pass
4139 else:
4140 self.fail("Error trying to do non-blocking recv.")
4141 read, write, err = select.select([conn], [], [])
4142 if conn in read:
4143 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004144 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004145 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004146 else:
4147 self.fail("Error during select call to non-blocking socket.")
4148
4149 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004150 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004151 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004152 self.cli.send(MSG)
4153
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004154
Guido van Rossum24e4af82002-06-12 19:18:08 +00004155class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004156 """Unit tests for the object returned by socket.makefile()
4157
Antoine Pitrou834bd812010-10-13 16:17:14 +00004158 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004159 the client connection. You can read from this file to
4160 get output from the server.
4161
Antoine Pitrou834bd812010-10-13 16:17:14 +00004162 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004163 server connection. You can write to this file to send output
4164 to the client.
4165 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004166
Guido van Rossume9f66142002-08-07 15:46:19 +00004167 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004168 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004169 errors = 'strict'
4170 newline = None
4171
4172 read_mode = 'rb'
4173 read_msg = MSG
4174 write_mode = 'wb'
4175 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004176
Guido van Rossum24e4af82002-06-12 19:18:08 +00004177 def __init__(self, methodName='runTest'):
4178 SocketConnectedTest.__init__(self, methodName=methodName)
4179
4180 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004181 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4182 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004183 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004184 self.read_file = self.cli_conn.makefile(
4185 self.read_mode, self.bufsize,
4186 encoding = self.encoding,
4187 errors = self.errors,
4188 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004189
4190 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004191 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004192 self.read_file.close()
4193 self.assertTrue(self.read_file.closed)
4194 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004195 SocketConnectedTest.tearDown(self)
4196
4197 def clientSetUp(self):
4198 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004199 self.write_file = self.serv_conn.makefile(
4200 self.write_mode, self.bufsize,
4201 encoding = self.encoding,
4202 errors = self.errors,
4203 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004204
4205 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004206 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004207 self.write_file.close()
4208 self.assertTrue(self.write_file.closed)
4209 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004210 SocketConnectedTest.clientTearDown(self)
4211
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004212 def testReadAfterTimeout(self):
4213 # Issue #7322: A file object must disallow further reads
4214 # after a timeout has occurred.
4215 self.cli_conn.settimeout(1)
4216 self.read_file.read(3)
4217 # First read raises a timeout
4218 self.assertRaises(socket.timeout, self.read_file.read, 1)
4219 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004220 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004221 self.read_file.read(1)
4222 self.assertIn("cannot read from timed out object", str(ctx.exception))
4223
4224 def _testReadAfterTimeout(self):
4225 self.write_file.write(self.write_msg[0:3])
4226 self.write_file.flush()
4227 self.serv_finished.wait()
4228
Guido van Rossum24e4af82002-06-12 19:18:08 +00004229 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004230 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004231 first_seg = self.read_file.read(len(self.read_msg)-3)
4232 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004233 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004234 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004235
4236 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004237 self.write_file.write(self.write_msg)
4238 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004239
Guido van Rossum8c943832002-08-08 01:00:28 +00004240 def testFullRead(self):
4241 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004242 msg = self.read_file.read()
4243 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004244
4245 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004246 self.write_file.write(self.write_msg)
4247 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004248
Guido van Rossum24e4af82002-06-12 19:18:08 +00004249 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004250 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004251 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004252 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004253 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004254 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004255 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004256 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004257 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004258
4259 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004260 self.write_file.write(self.write_msg)
4261 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004262
4263 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004264 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004265 line = self.read_file.readline()
4266 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004267
4268 def _testReadline(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
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004272 def testCloseAfterMakefile(self):
4273 # The file returned by makefile should keep the socket open.
4274 self.cli_conn.close()
4275 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004276 msg = self.read_file.read()
4277 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004278
4279 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004280 self.write_file.write(self.write_msg)
4281 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004282
4283 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004284 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004285 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004286 if isinstance(self.read_msg, str):
4287 msg = msg.decode()
4288 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004289
4290 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004291 self.write_file.write(self.write_msg)
4292 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004293
Tim Peters116d83c2004-03-28 02:20:45 +00004294 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004295 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004296
4297 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004298 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004299
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004300 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004301 self.assertEqual(self.read_file.mode, self.read_mode)
4302 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004303
4304 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004305 self.assertEqual(self.write_file.mode, self.write_mode)
4306 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004307
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004308 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004309 self.read_file.close()
4310 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004311 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004312 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004313
4314 def _testRealClose(self):
4315 pass
4316
4317
Guido van Rossume9f66142002-08-07 15:46:19 +00004318class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4319
4320 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004321
Guido van Rossume9f66142002-08-07 15:46:19 +00004322 In this case (and in this case only), it should be possible to
4323 create a file object, read a line from it, create another file
4324 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004325 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004326 when reading multiple requests from the same socket."""
4327
4328 bufsize = 0 # Use unbuffered mode
4329
4330 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004331 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004332 line = self.read_file.readline() # first line
4333 self.assertEqual(line, b"A. " + self.write_msg) # first line
4334 self.read_file = self.cli_conn.makefile('rb', 0)
4335 line = self.read_file.readline() # second line
4336 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004337
4338 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004339 self.write_file.write(b"A. " + self.write_msg)
4340 self.write_file.write(b"B. " + self.write_msg)
4341 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004342
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004343 def testMakefileClose(self):
4344 # The file returned by makefile should keep the socket open...
4345 self.cli_conn.close()
4346 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004347 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004348 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004349 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004350 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004351
4352 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004353 self.write_file.write(self.write_msg)
4354 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004355
4356 def testMakefileCloseSocketDestroy(self):
4357 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004358 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004359 refcount_after = sys.getrefcount(self.cli_conn)
4360 self.assertEqual(refcount_before - 1, refcount_after)
4361
4362 def _testMakefileCloseSocketDestroy(self):
4363 pass
4364
Antoine Pitrou98b46702010-09-18 22:59:00 +00004365 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004366 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004367 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4368
4369 def testSmallReadNonBlocking(self):
4370 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004371 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4372 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004373 self.evt1.set()
4374 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004375 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004376 if first_seg is None:
4377 # Data not arrived (can happen under Windows), wait a bit
4378 time.sleep(0.5)
4379 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004380 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004381 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004382 self.assertEqual(n, 3)
4383 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004384 self.assertEqual(msg, self.read_msg)
4385 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4386 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004387
4388 def _testSmallReadNonBlocking(self):
4389 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004390 self.write_file.write(self.write_msg)
4391 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004392 self.evt2.set()
4393 # Avoid cloding the socket before the server test has finished,
4394 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4395 self.serv_finished.wait(5.0)
4396
4397 def testWriteNonBlocking(self):
4398 self.cli_finished.wait(5.0)
4399 # The client thread can't skip directly - the SkipTest exception
4400 # would appear as a failure.
4401 if self.serv_skipped:
4402 self.skipTest(self.serv_skipped)
4403
4404 def _testWriteNonBlocking(self):
4405 self.serv_skipped = None
4406 self.serv_conn.setblocking(False)
4407 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004408 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004409 LIMIT = 10
4410 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004411 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004412 self.assertGreater(n, 0)
4413 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004414 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004415 if n is None:
4416 # Succeeded
4417 break
4418 self.assertGreater(n, 0)
4419 else:
4420 # Let us know that this test didn't manage to establish
4421 # the expected conditions. This is not a failure in itself but,
4422 # if it happens repeatedly, the test should be fixed.
4423 self.serv_skipped = "failed to saturate the socket buffer"
4424
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004425
Guido van Rossum8c943832002-08-08 01:00:28 +00004426class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4427
4428 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4429
4430
4431class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4432
4433 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004434
Thomas Woutersb2137042007-02-01 18:02:27 +00004435
Antoine Pitrou834bd812010-10-13 16:17:14 +00004436class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4437 """Tests for socket.makefile() in text mode (rather than binary)"""
4438
4439 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004440 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004441 write_mode = 'wb'
4442 write_msg = MSG
4443 newline = ''
4444
4445
4446class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4447 """Tests for socket.makefile() in text mode (rather than binary)"""
4448
4449 read_mode = 'rb'
4450 read_msg = MSG
4451 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004452 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004453 newline = ''
4454
4455
4456class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4457 """Tests for socket.makefile() in text mode (rather than binary)"""
4458
4459 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004460 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004461 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004462 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004463 newline = ''
4464
4465
Guido van Rossumd8faa362007-04-27 19:54:29 +00004466class NetworkConnectionTest(object):
4467 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004468
Guido van Rossumd8faa362007-04-27 19:54:29 +00004469 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004470 # We're inherited below by BasicTCPTest2, which also inherits
4471 # BasicTCPTest, which defines self.port referenced below.
4472 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004473 self.serv_conn = self.cli
4474
4475class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4476 """Tests that NetworkConnection does not break existing TCP functionality.
4477 """
4478
4479class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004480
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004481 class MockSocket(socket.socket):
4482 def connect(self, *args):
4483 raise socket.timeout('timed out')
4484
4485 @contextlib.contextmanager
4486 def mocked_socket_module(self):
4487 """Return a socket which times out on connect"""
4488 old_socket = socket.socket
4489 socket.socket = self.MockSocket
4490 try:
4491 yield
4492 finally:
4493 socket.socket = old_socket
4494
4495 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004496 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004497 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004498 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004499 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004500 cli.connect((HOST, port))
4501 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4502
4503 def test_create_connection(self):
4504 # Issue #9792: errors raised by create_connection() should have
4505 # a proper errno attribute.
4506 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004507 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004508 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004509
4510 # Issue #16257: create_connection() calls getaddrinfo() against
4511 # 'localhost'. This may result in an IPV6 addr being returned
4512 # as well as an IPV4 one:
4513 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4514 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4515 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4516 #
4517 # create_connection() enumerates through all the addresses returned
4518 # and if it doesn't successfully bind to any of them, it propagates
4519 # the last exception it encountered.
4520 #
4521 # On Solaris, ENETUNREACH is returned in this circumstance instead
4522 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4523 # expected errnos.
4524 expected_errnos = [ errno.ECONNREFUSED, ]
4525 if hasattr(errno, 'ENETUNREACH'):
4526 expected_errnos.append(errno.ENETUNREACH)
4527
4528 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004529
4530 def test_create_connection_timeout(self):
4531 # Issue #9792: create_connection() should not recast timeout errors
4532 # as generic socket errors.
4533 with self.mocked_socket_module():
4534 with self.assertRaises(socket.timeout):
4535 socket.create_connection((HOST, 1234))
4536
Guido van Rossumd8faa362007-04-27 19:54:29 +00004537
4538class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4539
4540 def __init__(self, methodName='runTest'):
4541 SocketTCPTest.__init__(self, methodName=methodName)
4542 ThreadableTest.__init__(self)
4543
4544 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004545 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004546
4547 def clientTearDown(self):
4548 self.cli.close()
4549 self.cli = None
4550 ThreadableTest.clientTearDown(self)
4551
4552 def _justAccept(self):
4553 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004554 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004555
4556 testFamily = _justAccept
4557 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004558 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004559 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004560 self.assertEqual(self.cli.family, 2)
4561
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004562 testSourceAddress = _justAccept
4563 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004564 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4565 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004566 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004567 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004568 # The port number being used is sufficient to show that the bind()
4569 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004570
Guido van Rossumd8faa362007-04-27 19:54:29 +00004571 testTimeoutDefault = _justAccept
4572 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004573 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004574 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004575 socket.setdefaulttimeout(42)
4576 try:
4577 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004578 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004579 finally:
4580 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004581 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004582
4583 testTimeoutNone = _justAccept
4584 def _testTimeoutNone(self):
4585 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004586 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004587 socket.setdefaulttimeout(30)
4588 try:
4589 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004590 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004591 finally:
4592 socket.setdefaulttimeout(None)
4593 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004594
4595 testTimeoutValueNamed = _justAccept
4596 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004597 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004598 self.assertEqual(self.cli.gettimeout(), 30)
4599
4600 testTimeoutValueNonamed = _justAccept
4601 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004602 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004603 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004604 self.assertEqual(self.cli.gettimeout(), 30)
4605
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004606
Guido van Rossumd8faa362007-04-27 19:54:29 +00004607class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4608
4609 def __init__(self, methodName='runTest'):
4610 SocketTCPTest.__init__(self, methodName=methodName)
4611 ThreadableTest.__init__(self)
4612
4613 def clientSetUp(self):
4614 pass
4615
4616 def clientTearDown(self):
4617 self.cli.close()
4618 self.cli = None
4619 ThreadableTest.clientTearDown(self)
4620
4621 def testInsideTimeout(self):
4622 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004623 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004624 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004625 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004626 testOutsideTimeout = testInsideTimeout
4627
4628 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004629 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004630 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004631 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004632
4633 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004634 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004635 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004636
4637
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004638class TCPTimeoutTest(SocketTCPTest):
4639
4640 def testTCPTimeout(self):
4641 def raise_timeout(*args, **kwargs):
4642 self.serv.settimeout(1.0)
4643 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004644 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004645 "Error generating a timeout exception (TCP)")
4646
4647 def testTimeoutZero(self):
4648 ok = False
4649 try:
4650 self.serv.settimeout(0.0)
4651 foo = self.serv.accept()
4652 except socket.timeout:
4653 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004654 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004655 ok = True
4656 except:
4657 self.fail("caught unexpected exception (TCP)")
4658 if not ok:
4659 self.fail("accept() returned success when we did not expect it")
4660
Serhiy Storchaka43767632013-11-03 21:31:38 +02004661 @unittest.skipUnless(hasattr(signal, 'alarm'),
4662 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004663 def testInterruptedTimeout(self):
4664 # XXX I don't know how to do this test on MSWindows or any other
4665 # plaform that doesn't support signal.alarm() or os.kill(), though
4666 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004667 self.serv.settimeout(5.0) # must be longer than alarm
4668 class Alarm(Exception):
4669 pass
4670 def alarm_handler(signal, frame):
4671 raise Alarm
4672 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4673 try:
4674 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4675 try:
4676 foo = self.serv.accept()
4677 except socket.timeout:
4678 self.fail("caught timeout instead of Alarm")
4679 except Alarm:
4680 pass
4681 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004682 self.fail("caught other exception instead of Alarm:"
4683 " %s(%s):\n%s" %
4684 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004685 else:
4686 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004687 finally:
4688 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004689 except Alarm:
4690 self.fail("got Alarm in wrong place")
4691 finally:
4692 # no alarm can be pending. Safe to restore old handler.
4693 signal.signal(signal.SIGALRM, old_alarm)
4694
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004695class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004696
4697 def testUDPTimeout(self):
4698 def raise_timeout(*args, **kwargs):
4699 self.serv.settimeout(1.0)
4700 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004701 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004702 "Error generating a timeout exception (UDP)")
4703
4704 def testTimeoutZero(self):
4705 ok = False
4706 try:
4707 self.serv.settimeout(0.0)
4708 foo = self.serv.recv(1024)
4709 except socket.timeout:
4710 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004711 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004712 ok = True
4713 except:
4714 self.fail("caught unexpected exception (UDP)")
4715 if not ok:
4716 self.fail("recv() returned success when we did not expect it")
4717
4718class TestExceptions(unittest.TestCase):
4719
4720 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004721 self.assertTrue(issubclass(OSError, Exception))
4722 self.assertTrue(issubclass(socket.herror, OSError))
4723 self.assertTrue(issubclass(socket.gaierror, OSError))
4724 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004725
Yury Selivanovfa22b292016-10-18 16:03:52 -04004726 def test_setblocking_invalidfd(self):
4727 # Regression test for issue #28471
4728
4729 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4730 sock = socket.socket(
4731 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4732 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004733 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004734
4735 with self.assertRaises(OSError):
4736 sock.setblocking(False)
4737
4738
Serhiy Storchaka43767632013-11-03 21:31:38 +02004739@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004740class TestLinuxAbstractNamespace(unittest.TestCase):
4741
4742 UNIX_PATH_MAX = 108
4743
4744 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004745 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004746 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4747 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004748 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004749 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4750 s2.connect(s1.getsockname())
4751 with s1.accept()[0] as s3:
4752 self.assertEqual(s1.getsockname(), address)
4753 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004754
4755 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004756 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004757 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4758 s.bind(address)
4759 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004760
4761 def testNameOverflow(self):
4762 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004763 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004764 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004765
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004766 def testStrName(self):
4767 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004768 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4769 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004770 s.bind("\x00python\x00test\x00")
4771 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004772 finally:
4773 s.close()
4774
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004775 def testBytearrayName(self):
4776 # Check that an abstract name can be passed as a bytearray.
4777 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4778 s.bind(bytearray(b"\x00python\x00test\x00"))
4779 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4780
Serhiy Storchaka43767632013-11-03 21:31:38 +02004781@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004782class TestUnixDomain(unittest.TestCase):
4783
4784 def setUp(self):
4785 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4786
4787 def tearDown(self):
4788 self.sock.close()
4789
4790 def encoded(self, path):
4791 # Return the given path encoded in the file system encoding,
4792 # or skip the test if this is not possible.
4793 try:
4794 return os.fsencode(path)
4795 except UnicodeEncodeError:
4796 self.skipTest(
4797 "Pathname {0!a} cannot be represented in file "
4798 "system encoding {1!r}".format(
4799 path, sys.getfilesystemencoding()))
4800
Antoine Pitrou16374872011-12-16 15:04:12 +01004801 def bind(self, sock, path):
4802 # Bind the socket
4803 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004804 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004805 except OSError as e:
4806 if str(e) == "AF_UNIX path too long":
4807 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004808 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004809 .format(path))
4810 else:
4811 raise
4812
Antoine Pitrou495b5022017-05-02 17:20:00 +02004813 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004814 # Issue #30205 (note getsockname() can return None on OS X)
4815 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004816
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004817 def testStrAddr(self):
4818 # Test binding to and retrieving a normal string pathname.
4819 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004820 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004821 self.addCleanup(support.unlink, path)
4822 self.assertEqual(self.sock.getsockname(), path)
4823
4824 def testBytesAddr(self):
4825 # Test binding to a bytes pathname.
4826 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004827 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004828 self.addCleanup(support.unlink, path)
4829 self.assertEqual(self.sock.getsockname(), path)
4830
4831 def testSurrogateescapeBind(self):
4832 # Test binding to a valid non-ASCII pathname, with the
4833 # non-ASCII bytes supplied using surrogateescape encoding.
4834 path = os.path.abspath(support.TESTFN_UNICODE)
4835 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004836 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004837 self.addCleanup(support.unlink, path)
4838 self.assertEqual(self.sock.getsockname(), path)
4839
4840 def testUnencodableAddr(self):
4841 # Test binding to a pathname that cannot be encoded in the
4842 # file system encoding.
4843 if support.TESTFN_UNENCODABLE is None:
4844 self.skipTest("No unencodable filename available")
4845 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004846 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004847 self.addCleanup(support.unlink, path)
4848 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004849
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02004850
Thomas Wouters477c8d52006-05-27 19:21:47 +00004851class BufferIOTest(SocketConnectedTest):
4852 """
4853 Test the buffer versions of socket.recv() and socket.send().
4854 """
4855 def __init__(self, methodName='runTest'):
4856 SocketConnectedTest.__init__(self, methodName=methodName)
4857
Antoine Pitrou25480782010-03-17 22:50:28 +00004858 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004859 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004860 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004861 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004862 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004863 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004864 self.assertEqual(msg, MSG)
4865
Antoine Pitrou25480782010-03-17 22:50:28 +00004866 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004867 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004868 self.serv_conn.send(buf)
4869
Antoine Pitrou25480782010-03-17 22:50:28 +00004870 def testRecvIntoBytearray(self):
4871 buf = bytearray(1024)
4872 nbytes = self.cli_conn.recv_into(buf)
4873 self.assertEqual(nbytes, len(MSG))
4874 msg = buf[:len(MSG)]
4875 self.assertEqual(msg, MSG)
4876
4877 _testRecvIntoBytearray = _testRecvIntoArray
4878
4879 def testRecvIntoMemoryview(self):
4880 buf = bytearray(1024)
4881 nbytes = self.cli_conn.recv_into(memoryview(buf))
4882 self.assertEqual(nbytes, len(MSG))
4883 msg = buf[:len(MSG)]
4884 self.assertEqual(msg, MSG)
4885
4886 _testRecvIntoMemoryview = _testRecvIntoArray
4887
4888 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004889 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004890 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004891 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004892 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004893 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004894 self.assertEqual(msg, MSG)
4895
Antoine Pitrou25480782010-03-17 22:50:28 +00004896 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004897 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004898 self.serv_conn.send(buf)
4899
Antoine Pitrou25480782010-03-17 22:50:28 +00004900 def testRecvFromIntoBytearray(self):
4901 buf = bytearray(1024)
4902 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4903 self.assertEqual(nbytes, len(MSG))
4904 msg = buf[:len(MSG)]
4905 self.assertEqual(msg, MSG)
4906
4907 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4908
4909 def testRecvFromIntoMemoryview(self):
4910 buf = bytearray(1024)
4911 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4912 self.assertEqual(nbytes, len(MSG))
4913 msg = buf[:len(MSG)]
4914 self.assertEqual(msg, MSG)
4915
4916 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4917
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004918 def testRecvFromIntoSmallBuffer(self):
4919 # See issue #20246.
4920 buf = bytearray(8)
4921 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4922
4923 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004924 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004925
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004926 def testRecvFromIntoEmptyBuffer(self):
4927 buf = bytearray()
4928 self.cli_conn.recvfrom_into(buf)
4929 self.cli_conn.recvfrom_into(buf, 0)
4930
4931 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4932
Christian Heimes043d6f62008-01-07 17:19:16 +00004933
4934TIPC_STYPE = 2000
4935TIPC_LOWER = 200
4936TIPC_UPPER = 210
4937
4938def isTipcAvailable():
4939 """Check if the TIPC module is loaded
4940
4941 The TIPC module is not loaded automatically on Ubuntu and probably
4942 other Linux distros.
4943 """
4944 if not hasattr(socket, "AF_TIPC"):
4945 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004946 try:
4947 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004948 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004949 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004950 # have not the permission to read it.
4951 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004952 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004953 for line in f:
4954 if line.startswith("tipc "):
4955 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004956 return False
4957
Serhiy Storchaka43767632013-11-03 21:31:38 +02004958@unittest.skipUnless(isTipcAvailable(),
4959 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004960class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004961 def testRDM(self):
4962 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4963 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004964 self.addCleanup(srv.close)
4965 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004966
4967 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4968 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4969 TIPC_LOWER, TIPC_UPPER)
4970 srv.bind(srvaddr)
4971
4972 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4973 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4974 cli.sendto(MSG, sendaddr)
4975
4976 msg, recvaddr = srv.recvfrom(1024)
4977
4978 self.assertEqual(cli.getsockname(), recvaddr)
4979 self.assertEqual(msg, MSG)
4980
4981
Serhiy Storchaka43767632013-11-03 21:31:38 +02004982@unittest.skipUnless(isTipcAvailable(),
4983 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004984class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004985 def __init__(self, methodName = 'runTest'):
4986 unittest.TestCase.__init__(self, methodName = methodName)
4987 ThreadableTest.__init__(self)
4988
4989 def setUp(self):
4990 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004991 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004992 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4993 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4994 TIPC_LOWER, TIPC_UPPER)
4995 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004996 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004997 self.serverExplicitReady()
4998 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004999 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005000
5001 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005002 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005003 # accept() call; sleep a little while to avoid it, otherwise
5004 # we could get an exception
5005 time.sleep(0.1)
5006 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005007 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005008 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5009 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5010 self.cli.connect(addr)
5011 self.cliaddr = self.cli.getsockname()
5012
5013 def testStream(self):
5014 msg = self.conn.recv(1024)
5015 self.assertEqual(msg, MSG)
5016 self.assertEqual(self.cliaddr, self.connaddr)
5017
5018 def _testStream(self):
5019 self.cli.send(MSG)
5020 self.cli.close()
5021
5022
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005023class ContextManagersTest(ThreadedTCPSocketTest):
5024
5025 def _testSocketClass(self):
5026 # base test
5027 with socket.socket() as sock:
5028 self.assertFalse(sock._closed)
5029 self.assertTrue(sock._closed)
5030 # close inside with block
5031 with socket.socket() as sock:
5032 sock.close()
5033 self.assertTrue(sock._closed)
5034 # exception inside with block
5035 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005036 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005037 self.assertTrue(sock._closed)
5038
5039 def testCreateConnectionBase(self):
5040 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005041 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005042 data = conn.recv(1024)
5043 conn.sendall(data)
5044
5045 def _testCreateConnectionBase(self):
5046 address = self.serv.getsockname()
5047 with socket.create_connection(address) as sock:
5048 self.assertFalse(sock._closed)
5049 sock.sendall(b'foo')
5050 self.assertEqual(sock.recv(1024), b'foo')
5051 self.assertTrue(sock._closed)
5052
5053 def testCreateConnectionClose(self):
5054 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005055 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005056 data = conn.recv(1024)
5057 conn.sendall(data)
5058
5059 def _testCreateConnectionClose(self):
5060 address = self.serv.getsockname()
5061 with socket.create_connection(address) as sock:
5062 sock.close()
5063 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005064 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005065
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005066
Victor Stinnerdaf45552013-08-28 00:53:59 +02005067class InheritanceTest(unittest.TestCase):
5068 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5069 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005070 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005071 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005072 with socket.socket(socket.AF_INET,
5073 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
5074 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005075 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005076
5077 def test_default_inheritable(self):
5078 sock = socket.socket()
5079 with sock:
5080 self.assertEqual(sock.get_inheritable(), False)
5081
5082 def test_dup(self):
5083 sock = socket.socket()
5084 with sock:
5085 newsock = sock.dup()
5086 sock.close()
5087 with newsock:
5088 self.assertEqual(newsock.get_inheritable(), False)
5089
5090 def test_set_inheritable(self):
5091 sock = socket.socket()
5092 with sock:
5093 sock.set_inheritable(True)
5094 self.assertEqual(sock.get_inheritable(), True)
5095
5096 sock.set_inheritable(False)
5097 self.assertEqual(sock.get_inheritable(), False)
5098
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005099 @unittest.skipIf(fcntl is None, "need fcntl")
5100 def test_get_inheritable_cloexec(self):
5101 sock = socket.socket()
5102 with sock:
5103 fd = sock.fileno()
5104 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005105
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005106 # clear FD_CLOEXEC flag
5107 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5108 flags &= ~fcntl.FD_CLOEXEC
5109 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005110
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005111 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005112
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005113 @unittest.skipIf(fcntl is None, "need fcntl")
5114 def test_set_inheritable_cloexec(self):
5115 sock = socket.socket()
5116 with sock:
5117 fd = sock.fileno()
5118 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5119 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005120
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005121 sock.set_inheritable(True)
5122 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5123 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005124
5125
Victor Stinnerdaf45552013-08-28 00:53:59 +02005126 @unittest.skipUnless(hasattr(socket, "socketpair"),
5127 "need socket.socketpair()")
5128 def test_socketpair(self):
5129 s1, s2 = socket.socketpair()
5130 self.addCleanup(s1.close)
5131 self.addCleanup(s2.close)
5132 self.assertEqual(s1.get_inheritable(), False)
5133 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005134
5135
5136@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5137 "SOCK_NONBLOCK not defined")
5138class NonblockConstantTest(unittest.TestCase):
5139 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5140 if nonblock:
5141 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5142 self.assertEqual(s.gettimeout(), timeout)
5143 else:
5144 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5145 self.assertEqual(s.gettimeout(), None)
5146
Charles-François Natali239bb962011-06-03 12:55:15 +02005147 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005148 def test_SOCK_NONBLOCK(self):
5149 # a lot of it seems silly and redundant, but I wanted to test that
5150 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005151 with socket.socket(socket.AF_INET,
5152 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5153 self.checkNonblock(s)
5154 s.setblocking(1)
5155 self.checkNonblock(s, False)
5156 s.setblocking(0)
5157 self.checkNonblock(s)
5158 s.settimeout(None)
5159 self.checkNonblock(s, False)
5160 s.settimeout(2.0)
5161 self.checkNonblock(s, timeout=2.0)
5162 s.setblocking(1)
5163 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005164 # defaulttimeout
5165 t = socket.getdefaulttimeout()
5166 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005167 with socket.socket() as s:
5168 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005169 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005170 with socket.socket() as s:
5171 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005172 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005173 with socket.socket() as s:
5174 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005175 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005176 with socket.socket() as s:
5177 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005178 socket.setdefaulttimeout(t)
5179
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005180
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005181@unittest.skipUnless(os.name == "nt", "Windows specific")
5182@unittest.skipUnless(multiprocessing, "need multiprocessing")
5183class TestSocketSharing(SocketTCPTest):
5184 # This must be classmethod and not staticmethod or multiprocessing
5185 # won't be able to bootstrap it.
5186 @classmethod
5187 def remoteProcessServer(cls, q):
5188 # Recreate socket from shared data
5189 sdata = q.get()
5190 message = q.get()
5191
5192 s = socket.fromshare(sdata)
5193 s2, c = s.accept()
5194
5195 # Send the message
5196 s2.sendall(message)
5197 s2.close()
5198 s.close()
5199
5200 def testShare(self):
5201 # Transfer the listening server socket to another process
5202 # and service it from there.
5203
5204 # Create process:
5205 q = multiprocessing.Queue()
5206 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5207 p.start()
5208
5209 # Get the shared socket data
5210 data = self.serv.share(p.pid)
5211
5212 # Pass the shared socket to the other process
5213 addr = self.serv.getsockname()
5214 self.serv.close()
5215 q.put(data)
5216
5217 # The data that the server will send us
5218 message = b"slapmahfro"
5219 q.put(message)
5220
5221 # Connect
5222 s = socket.create_connection(addr)
5223 # listen for the data
5224 m = []
5225 while True:
5226 data = s.recv(100)
5227 if not data:
5228 break
5229 m.append(data)
5230 s.close()
5231 received = b"".join(m)
5232 self.assertEqual(received, message)
5233 p.join()
5234
5235 def testShareLength(self):
5236 data = self.serv.share(os.getpid())
5237 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5238 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5239
5240 def compareSockets(self, org, other):
5241 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005242 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005243 self.assertEqual(org.gettimeout(), None)
5244 self.assertEqual(org.gettimeout(), other.gettimeout())
5245
5246 self.assertEqual(org.family, other.family)
5247 self.assertEqual(org.type, other.type)
5248 # If the user specified "0" for proto, then
5249 # internally windows will have picked the correct value.
5250 # Python introspection on the socket however will still return
5251 # 0. For the shared socket, the python value is recreated
5252 # from the actual value, so it may not compare correctly.
5253 if org.proto != 0:
5254 self.assertEqual(org.proto, other.proto)
5255
5256 def testShareLocal(self):
5257 data = self.serv.share(os.getpid())
5258 s = socket.fromshare(data)
5259 try:
5260 self.compareSockets(self.serv, s)
5261 finally:
5262 s.close()
5263
5264 def testTypes(self):
5265 families = [socket.AF_INET, socket.AF_INET6]
5266 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5267 for f in families:
5268 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005269 try:
5270 source = socket.socket(f, t)
5271 except OSError:
5272 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005273 try:
5274 data = source.share(os.getpid())
5275 shared = socket.fromshare(data)
5276 try:
5277 self.compareSockets(source, shared)
5278 finally:
5279 shared.close()
5280 finally:
5281 source.close()
5282
5283
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005284class SendfileUsingSendTest(ThreadedTCPSocketTest):
5285 """
5286 Test the send() implementation of socket.sendfile().
5287 """
5288
5289 FILESIZE = (10 * 1024 * 1024) # 10MB
5290 BUFSIZE = 8192
5291 FILEDATA = b""
5292 TIMEOUT = 2
5293
5294 @classmethod
5295 def setUpClass(cls):
5296 def chunks(total, step):
5297 assert total >= step
5298 while total > step:
5299 yield step
5300 total -= step
5301 if total:
5302 yield total
5303
5304 chunk = b"".join([random.choice(string.ascii_letters).encode()
5305 for i in range(cls.BUFSIZE)])
5306 with open(support.TESTFN, 'wb') as f:
5307 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5308 f.write(chunk)
5309 with open(support.TESTFN, 'rb') as f:
5310 cls.FILEDATA = f.read()
5311 assert len(cls.FILEDATA) == cls.FILESIZE
5312
5313 @classmethod
5314 def tearDownClass(cls):
5315 support.unlink(support.TESTFN)
5316
5317 def accept_conn(self):
5318 self.serv.settimeout(self.TIMEOUT)
5319 conn, addr = self.serv.accept()
5320 conn.settimeout(self.TIMEOUT)
5321 self.addCleanup(conn.close)
5322 return conn
5323
5324 def recv_data(self, conn):
5325 received = []
5326 while True:
5327 chunk = conn.recv(self.BUFSIZE)
5328 if not chunk:
5329 break
5330 received.append(chunk)
5331 return b''.join(received)
5332
5333 def meth_from_sock(self, sock):
5334 # Depending on the mixin class being run return either send()
5335 # or sendfile() method implementation.
5336 return getattr(sock, "_sendfile_use_send")
5337
5338 # regular file
5339
5340 def _testRegularFile(self):
5341 address = self.serv.getsockname()
5342 file = open(support.TESTFN, 'rb')
5343 with socket.create_connection(address) as sock, file as file:
5344 meth = self.meth_from_sock(sock)
5345 sent = meth(file)
5346 self.assertEqual(sent, self.FILESIZE)
5347 self.assertEqual(file.tell(), self.FILESIZE)
5348
5349 def testRegularFile(self):
5350 conn = self.accept_conn()
5351 data = self.recv_data(conn)
5352 self.assertEqual(len(data), self.FILESIZE)
5353 self.assertEqual(data, self.FILEDATA)
5354
5355 # non regular file
5356
5357 def _testNonRegularFile(self):
5358 address = self.serv.getsockname()
5359 file = io.BytesIO(self.FILEDATA)
5360 with socket.create_connection(address) as sock, file as file:
5361 sent = sock.sendfile(file)
5362 self.assertEqual(sent, self.FILESIZE)
5363 self.assertEqual(file.tell(), self.FILESIZE)
5364 self.assertRaises(socket._GiveupOnSendfile,
5365 sock._sendfile_use_sendfile, file)
5366
5367 def testNonRegularFile(self):
5368 conn = self.accept_conn()
5369 data = self.recv_data(conn)
5370 self.assertEqual(len(data), self.FILESIZE)
5371 self.assertEqual(data, self.FILEDATA)
5372
5373 # empty file
5374
5375 def _testEmptyFileSend(self):
5376 address = self.serv.getsockname()
5377 filename = support.TESTFN + "2"
5378 with open(filename, 'wb'):
5379 self.addCleanup(support.unlink, filename)
5380 file = open(filename, 'rb')
5381 with socket.create_connection(address) as sock, file as file:
5382 meth = self.meth_from_sock(sock)
5383 sent = meth(file)
5384 self.assertEqual(sent, 0)
5385 self.assertEqual(file.tell(), 0)
5386
5387 def testEmptyFileSend(self):
5388 conn = self.accept_conn()
5389 data = self.recv_data(conn)
5390 self.assertEqual(data, b"")
5391
5392 # offset
5393
5394 def _testOffset(self):
5395 address = self.serv.getsockname()
5396 file = open(support.TESTFN, 'rb')
5397 with socket.create_connection(address) as sock, file as file:
5398 meth = self.meth_from_sock(sock)
5399 sent = meth(file, offset=5000)
5400 self.assertEqual(sent, self.FILESIZE - 5000)
5401 self.assertEqual(file.tell(), self.FILESIZE)
5402
5403 def testOffset(self):
5404 conn = self.accept_conn()
5405 data = self.recv_data(conn)
5406 self.assertEqual(len(data), self.FILESIZE - 5000)
5407 self.assertEqual(data, self.FILEDATA[5000:])
5408
5409 # count
5410
5411 def _testCount(self):
5412 address = self.serv.getsockname()
5413 file = open(support.TESTFN, 'rb')
5414 with socket.create_connection(address, timeout=2) as sock, file as file:
5415 count = 5000007
5416 meth = self.meth_from_sock(sock)
5417 sent = meth(file, count=count)
5418 self.assertEqual(sent, count)
5419 self.assertEqual(file.tell(), count)
5420
5421 def testCount(self):
5422 count = 5000007
5423 conn = self.accept_conn()
5424 data = self.recv_data(conn)
5425 self.assertEqual(len(data), count)
5426 self.assertEqual(data, self.FILEDATA[:count])
5427
5428 # count small
5429
5430 def _testCountSmall(self):
5431 address = self.serv.getsockname()
5432 file = open(support.TESTFN, 'rb')
5433 with socket.create_connection(address, timeout=2) as sock, file as file:
5434 count = 1
5435 meth = self.meth_from_sock(sock)
5436 sent = meth(file, count=count)
5437 self.assertEqual(sent, count)
5438 self.assertEqual(file.tell(), count)
5439
5440 def testCountSmall(self):
5441 count = 1
5442 conn = self.accept_conn()
5443 data = self.recv_data(conn)
5444 self.assertEqual(len(data), count)
5445 self.assertEqual(data, self.FILEDATA[:count])
5446
5447 # count + offset
5448
5449 def _testCountWithOffset(self):
5450 address = self.serv.getsockname()
5451 file = open(support.TESTFN, 'rb')
5452 with socket.create_connection(address, timeout=2) as sock, file as file:
5453 count = 100007
5454 meth = self.meth_from_sock(sock)
5455 sent = meth(file, offset=2007, count=count)
5456 self.assertEqual(sent, count)
5457 self.assertEqual(file.tell(), count + 2007)
5458
5459 def testCountWithOffset(self):
5460 count = 100007
5461 conn = self.accept_conn()
5462 data = self.recv_data(conn)
5463 self.assertEqual(len(data), count)
5464 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5465
5466 # non blocking sockets are not supposed to work
5467
5468 def _testNonBlocking(self):
5469 address = self.serv.getsockname()
5470 file = open(support.TESTFN, 'rb')
5471 with socket.create_connection(address) as sock, file as file:
5472 sock.setblocking(False)
5473 meth = self.meth_from_sock(sock)
5474 self.assertRaises(ValueError, meth, file)
5475 self.assertRaises(ValueError, sock.sendfile, file)
5476
5477 def testNonBlocking(self):
5478 conn = self.accept_conn()
5479 if conn.recv(8192):
5480 self.fail('was not supposed to receive any data')
5481
5482 # timeout (non-triggered)
5483
5484 def _testWithTimeout(self):
5485 address = self.serv.getsockname()
5486 file = open(support.TESTFN, 'rb')
5487 with socket.create_connection(address, timeout=2) as sock, file as file:
5488 meth = self.meth_from_sock(sock)
5489 sent = meth(file)
5490 self.assertEqual(sent, self.FILESIZE)
5491
5492 def testWithTimeout(self):
5493 conn = self.accept_conn()
5494 data = self.recv_data(conn)
5495 self.assertEqual(len(data), self.FILESIZE)
5496 self.assertEqual(data, self.FILEDATA)
5497
5498 # timeout (triggered)
5499
5500 def _testWithTimeoutTriggeredSend(self):
5501 address = self.serv.getsockname()
5502 file = open(support.TESTFN, 'rb')
5503 with socket.create_connection(address, timeout=0.01) as sock, \
5504 file as file:
5505 meth = self.meth_from_sock(sock)
5506 self.assertRaises(socket.timeout, meth, file)
5507
5508 def testWithTimeoutTriggeredSend(self):
5509 conn = self.accept_conn()
5510 conn.recv(88192)
5511
5512 # errors
5513
5514 def _test_errors(self):
5515 pass
5516
5517 def test_errors(self):
5518 with open(support.TESTFN, 'rb') as file:
5519 with socket.socket(type=socket.SOCK_DGRAM) as s:
5520 meth = self.meth_from_sock(s)
5521 self.assertRaisesRegex(
5522 ValueError, "SOCK_STREAM", meth, file)
5523 with open(support.TESTFN, 'rt') as file:
5524 with socket.socket() as s:
5525 meth = self.meth_from_sock(s)
5526 self.assertRaisesRegex(
5527 ValueError, "binary mode", meth, file)
5528 with open(support.TESTFN, 'rb') as file:
5529 with socket.socket() as s:
5530 meth = self.meth_from_sock(s)
5531 self.assertRaisesRegex(TypeError, "positive integer",
5532 meth, file, count='2')
5533 self.assertRaisesRegex(TypeError, "positive integer",
5534 meth, file, count=0.1)
5535 self.assertRaisesRegex(ValueError, "positive integer",
5536 meth, file, count=0)
5537 self.assertRaisesRegex(ValueError, "positive integer",
5538 meth, file, count=-1)
5539
5540
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005541@unittest.skipUnless(hasattr(os, "sendfile"),
5542 'os.sendfile() required for this test.')
5543class SendfileUsingSendfileTest(SendfileUsingSendTest):
5544 """
5545 Test the sendfile() implementation of socket.sendfile().
5546 """
5547 def meth_from_sock(self, sock):
5548 return getattr(sock, "_sendfile_use_sendfile")
5549
Christian Heimes48371412016-09-06 00:37:46 +02005550
5551@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005552class LinuxKernelCryptoAPI(unittest.TestCase):
5553 # tests for AF_ALG
5554 def create_alg(self, typ, name):
5555 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005556 try:
5557 sock.bind((typ, name))
5558 except FileNotFoundError as e:
5559 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005560 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005561 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005562 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005563 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005564
5565 def test_sha256(self):
5566 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5567 "177a9cb410ff61f20015ad")
5568 with self.create_alg('hash', 'sha256') as algo:
5569 op, _ = algo.accept()
5570 with op:
5571 op.sendall(b"abc")
5572 self.assertEqual(op.recv(512), expected)
5573
5574 op, _ = algo.accept()
5575 with op:
5576 op.send(b'a', socket.MSG_MORE)
5577 op.send(b'b', socket.MSG_MORE)
5578 op.send(b'c', socket.MSG_MORE)
5579 op.send(b'')
5580 self.assertEqual(op.recv(512), expected)
5581
5582 def test_hmac_sha1(self):
5583 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5584 with self.create_alg('hash', 'hmac(sha1)') as algo:
5585 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5586 op, _ = algo.accept()
5587 with op:
5588 op.sendall(b"what do ya want for nothing?")
5589 self.assertEqual(op.recv(512), expected)
5590
Christian Heimese084f842016-09-11 20:11:30 +02005591 # Although it should work with 3.19 and newer the test blocks on
5592 # Ubuntu 15.10 with Kernel 4.2.0-19.
5593 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005594 def test_aes_cbc(self):
5595 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5596 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5597 msg = b"Single block msg"
5598 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5599 msglen = len(msg)
5600 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5601 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5602 op, _ = algo.accept()
5603 with op:
5604 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5605 flags=socket.MSG_MORE)
5606 op.sendall(msg)
5607 self.assertEqual(op.recv(msglen), ciphertext)
5608
5609 op, _ = algo.accept()
5610 with op:
5611 op.sendmsg_afalg([ciphertext],
5612 op=socket.ALG_OP_DECRYPT, iv=iv)
5613 self.assertEqual(op.recv(msglen), msg)
5614
5615 # long message
5616 multiplier = 1024
5617 longmsg = [msg] * multiplier
5618 op, _ = algo.accept()
5619 with op:
5620 op.sendmsg_afalg(longmsg,
5621 op=socket.ALG_OP_ENCRYPT, iv=iv)
5622 enc = op.recv(msglen * multiplier)
5623 self.assertEqual(len(enc), msglen * multiplier)
5624 self.assertTrue(enc[:msglen], ciphertext)
5625
5626 op, _ = algo.accept()
5627 with op:
5628 op.sendmsg_afalg([enc],
5629 op=socket.ALG_OP_DECRYPT, iv=iv)
5630 dec = op.recv(msglen * multiplier)
5631 self.assertEqual(len(dec), msglen * multiplier)
5632 self.assertEqual(dec, msg * multiplier)
5633
matejcik9764c152017-02-16 14:41:31 +01005634 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005635 def test_aead_aes_gcm(self):
5636 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5637 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5638 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5639 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5640 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5641 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5642
5643 taglen = len(expected_tag)
5644 assoclen = len(assoc)
5645
5646 with self.create_alg('aead', 'gcm(aes)') as algo:
5647 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5648 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5649 None, taglen)
5650
5651 # send assoc, plain and tag buffer in separate steps
5652 op, _ = algo.accept()
5653 with op:
5654 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5655 assoclen=assoclen, flags=socket.MSG_MORE)
5656 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005657 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005658 res = op.recv(assoclen + len(plain) + taglen)
5659 self.assertEqual(expected_ct, res[assoclen:-taglen])
5660 self.assertEqual(expected_tag, res[-taglen:])
5661
5662 # now with msg
5663 op, _ = algo.accept()
5664 with op:
matejcik9764c152017-02-16 14:41:31 +01005665 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005666 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5667 assoclen=assoclen)
5668 res = op.recv(assoclen + len(plain) + taglen)
5669 self.assertEqual(expected_ct, res[assoclen:-taglen])
5670 self.assertEqual(expected_tag, res[-taglen:])
5671
5672 # create anc data manually
5673 pack_uint32 = struct.Struct('I').pack
5674 op, _ = algo.accept()
5675 with op:
matejcik9764c152017-02-16 14:41:31 +01005676 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005677 op.sendmsg(
5678 [msg],
5679 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5680 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5681 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5682 )
5683 )
matejcik9764c152017-02-16 14:41:31 +01005684 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005685 self.assertEqual(expected_ct, res[assoclen:-taglen])
5686 self.assertEqual(expected_tag, res[-taglen:])
5687
5688 # decrypt and verify
5689 op, _ = algo.accept()
5690 with op:
5691 msg = assoc + expected_ct + expected_tag
5692 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5693 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005694 res = op.recv(len(msg) - taglen)
5695 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005696
Christian Heimese084f842016-09-11 20:11:30 +02005697 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005698 def test_drbg_pr_sha256(self):
5699 # deterministic random bit generator, prediction resistance, sha256
5700 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5701 extra_seed = os.urandom(32)
5702 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5703 op, _ = algo.accept()
5704 with op:
5705 rn = op.recv(32)
5706 self.assertEqual(len(rn), 32)
5707
5708 def test_sendmsg_afalg_args(self):
5709 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005710 with sock:
5711 with self.assertRaises(TypeError):
5712 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005713
Christian Heimes02b30352016-09-11 19:49:56 +02005714 with self.assertRaises(TypeError):
5715 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005716
Christian Heimes02b30352016-09-11 19:49:56 +02005717 with self.assertRaises(TypeError):
5718 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005719
Christian Heimes02b30352016-09-11 19:49:56 +02005720 with self.assertRaises(TypeError):
5721 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
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=socket.ALG_OP_ENCRYPT, assoclen=-1)
5725
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005726
Guido van Rossumb995eb72002-07-31 16:08:40 +00005727def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005728 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005729 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005730
5731 tests.extend([
5732 NonBlockingTCPTests,
5733 FileObjectClassTestCase,
5734 UnbufferedFileObjectClassTestCase,
5735 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005736 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005737 UnicodeReadFileObjectClassTestCase,
5738 UnicodeWriteFileObjectClassTestCase,
5739 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005740 NetworkConnectionNoServer,
5741 NetworkConnectionAttributesTest,
5742 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005743 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005744 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005745 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005746 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005747 tests.append(BasicSocketPairTest)
5748 tests.append(TestUnixDomain)
5749 tests.append(TestLinuxAbstractNamespace)
5750 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005751 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005752 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005753 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005754 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005755 BasicVSOCKTest,
5756 ThreadedVSOCKSocketStreamTest,
5757 ])
5758 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005759 CmsgMacroTests,
5760 SendmsgUDPTest,
5761 RecvmsgUDPTest,
5762 RecvmsgIntoUDPTest,
5763 SendmsgUDP6Test,
5764 RecvmsgUDP6Test,
5765 RecvmsgRFC3542AncillaryUDP6Test,
5766 RecvmsgIntoRFC3542AncillaryUDP6Test,
5767 RecvmsgIntoUDP6Test,
5768 SendmsgTCPTest,
5769 RecvmsgTCPTest,
5770 RecvmsgIntoTCPTest,
5771 SendmsgSCTPStreamTest,
5772 RecvmsgSCTPStreamTest,
5773 RecvmsgIntoSCTPStreamTest,
5774 SendmsgUnixStreamTest,
5775 RecvmsgUnixStreamTest,
5776 RecvmsgIntoUnixStreamTest,
5777 RecvmsgSCMRightsStreamTest,
5778 RecvmsgIntoSCMRightsStreamTest,
5779 # These are slow when setitimer() is not available
5780 InterruptedRecvTimeoutTest,
5781 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005782 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005783 SendfileUsingSendTest,
5784 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005785 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005786
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005787 thread_info = support.threading_setup()
5788 support.run_unittest(*tests)
5789 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005790
5791if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005792 test_main()